コード例 #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
static inline void copy_audio_data(obs_source_t source,
                                   const void *data, uint32_t frames, uint64_t timestamp)
{
    size_t blocksize = audio_output_blocksize(obs->audio.audio);
    size_t size = (size_t)frames * blocksize;

    /* ensure audio storage capacity */
    if (source->audio_storage_size < size) {
        bfree(source->audio_data.data);
        source->audio_data.data = bmalloc(size);
        source->audio_storage_size = size;
    }

    source->audio_data.frames = frames;
    source->audio_data.timestamp = timestamp;
    memcpy(source->audio_data.data, data, size);
}
コード例 #3
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);
}
コード例 #4
0
ファイル: obs-source.c プロジェクト: Christicles/obs-studio
static inline void copy_audio_data(obs_source_t source,
		const uint8_t *const data[], uint32_t frames, uint64_t ts)
{
	size_t planes    = audio_output_planes(obs->audio.audio);
	size_t blocksize = audio_output_blocksize(obs->audio.audio);
	size_t size      = (size_t)frames * blocksize;
	bool   resize    = source->audio_storage_size < size;

	source->audio_data.frames    = frames;
	source->audio_data.timestamp = ts;

	for (size_t i = 0; i < planes; i++) {
		/* ensure audio storage capacity */
		if (resize) {
			bfree(source->audio_data.data[i]);
			source->audio_data.data[i] = bmalloc(size);
		}

		memcpy(source->audio_data.data[i], data[i], size);
	}

	if (resize)
		source->audio_storage_size = size;
}