コード例 #1
0
ファイル: obs-source.c プロジェクト: asgeirom/obs-studio
void obs_source_output_audio(obs_source_t source,
		const struct source_audio *audio)
{
	uint32_t flags = obs_source_get_output_flags(source);
	size_t blocksize = audio_output_blocksize(obs->audio.audio);
	struct filtered_audio *output;

	process_audio(source, audio);

	pthread_mutex_lock(&source->filter_mutex);
	output = filter_async_audio(source, &source->audio_data);

	if (output) {
		pthread_mutex_lock(&source->audio_mutex);

		/* wait for video to start before outputting any audio so we
		 * have a base for sync */
		if (source->timing_set || (flags & SOURCE_ASYNC_VIDEO) == 0) {
			struct audio_data data;
			data.data      = output->data;
			data.frames    = output->frames;
			data.timestamp = output->timestamp;
			source_output_audio_line(source, &data);
		}

		pthread_mutex_unlock(&source->audio_mutex);
	}

	pthread_mutex_unlock(&source->filter_mutex);
}
コード例 #2
0
ファイル: obs-source.c プロジェクト: BraginWoW/obs-studio
void obs_source_output_audio(obs_source_t source,
                             const struct source_audio *audio)
{
    uint32_t flags = obs_source_get_output_flags(source);
    size_t blocksize = audio_output_blocksize(obs->audio.audio);
    struct filtered_audio *output;

    process_audio(source, audio);

    pthread_mutex_lock(&source->filter_mutex);
    output = filter_async_audio(source, &source->audio_data);

    if (output) {
        pthread_mutex_lock(&source->audio_mutex);

        /* wait for video to start before outputting any audio so we
         * have a base for sync */
        if (!source->timing_set && (flags & SOURCE_ASYNC_VIDEO) != 0) {
            struct audiobuf newbuf;
            size_t audio_size = blocksize * output->frames;

            newbuf.data      = bmalloc(audio_size);
            newbuf.frames    = output->frames;
            newbuf.timestamp = output->timestamp;
            memcpy(newbuf.data, output->data, audio_size);

            da_push_back(source->audio_wait_buffer, &newbuf);

        } else {
            struct audio_data data;
            data.data      = output->data;
            data.frames    = output->frames;
            data.timestamp = output->timestamp;
            source_output_audio_line(source, &data);
        }

        pthread_mutex_unlock(&source->audio_mutex);
    }

    pthread_mutex_unlock(&source->filter_mutex);
}
コード例 #3
0
ファイル: obs-source.c プロジェクト: Christicles/obs-studio
void obs_source_output_audio(obs_source_t source,
		const struct source_audio *audio)
{
	uint32_t flags;
	struct filtered_audio *output;

	if (!source || !audio)
		return;

	flags = source->info.output_flags;
	process_audio(source, audio);

	pthread_mutex_lock(&source->filter_mutex);
	output = filter_async_audio(source, &source->audio_data);

	if (output) {
		bool async = (flags & OBS_SOURCE_ASYNC) != 0;

		pthread_mutex_lock(&source->audio_mutex);

		/* wait for video to start before outputting any audio so we
		 * have a base for sync */
		if (source->timing_set || !async) {
			struct audio_data data;

			for (int i = 0; i < MAX_AV_PLANES; i++)
				data.data[i] = output->data[i];

			data.frames    = output->frames;
			data.timestamp = output->timestamp;
			source_output_audio_line(source, &data);
		}

		pthread_mutex_unlock(&source->audio_mutex);
	}

	pthread_mutex_unlock(&source->filter_mutex);
}