コード例 #1
0
ファイル: obs-source.c プロジェクト: BraginWoW/obs-studio
static void source_output_audio_line(obs_source_t source,
                                     const struct audio_data *data)
{
    struct audio_data in = *data;

    if (!source->timing_set) {
        reset_audio_timing(source, in.timestamp);

        /* detects 'directly' set timestamps as long as they're within
         * a certain threshold */
        if ((source->timing_adjust + MAX_TS_VAR) < MAX_TS_VAR * 2)
            source->timing_adjust = 0;
    } else {
        uint64_t time_diff =
            data->timestamp - source->next_audio_timestamp_min;

        /* don't need signed because negative will trigger it
         * regardless, which is what we want */
        if (time_diff > MAX_TIMESTAMP_JUMP) {
            blog(LOG_DEBUG, "Audio timestamp for source '%s' "
                 "jumped by '%lld', resetting audio "
                 "timing", source->name, time_diff);
            reset_audio_timing(source, in.timestamp);
        }
    }

    source->next_audio_timestamp_min = in.timestamp +
                                       conv_frames_to_time(source, in.frames);

    in.timestamp += source->timing_adjust;
    in.volume = source->volume;
    audio_line_output(source->audio_line, &in);
}
コード例 #2
0
ファイル: obs-source.c プロジェクト: Alucard014/obs-studio
static void source_output_audio_line(obs_source_t source,
		const struct audio_data *data)
{
	struct audio_data in = *data;

	if (!in.timestamp) {
		in.timestamp = os_gettime_ns();
		if (!source->timing_set) {
			source->timing_set    = true;
			source->timing_adjust = 0;
		}
	}

	if (!source->timing_set) {
		source->timing_set    = true;
		source->timing_adjust = in.timestamp - os_gettime_ns();

		/* detects 'directly' set timestamps as long as they're within
		 * a certain threashold */
		if ((source->timing_adjust+MAX_VARIANCE) < MAX_VARIANCE*2)
			source->timing_adjust = 0;
	}

	in.timestamp += source->timing_adjust;
	audio_line_output(source->audio_line, &in);
}
コード例 #3
0
ファイル: obs-source.c プロジェクト: asgeirom/obs-studio
static void source_output_audio_line(obs_source_t source,
		const struct audio_data *data)
{
	struct audio_data in = *data;
	uint64_t diff;

	if (!source->timing_set) {
		reset_audio_timing(source, in.timestamp);

		/* detects 'directly' set timestamps as long as they're within
		 * a certain threshold */
		if ((source->timing_adjust + MAX_TS_VAR) < MAX_TS_VAR * 2)
			source->timing_adjust = 0;

	} else {
		diff = in.timestamp - source->next_audio_ts_min;

		/* don't need signed because negative will trigger it
		 * regardless, which is what we want */
		if (diff > MAX_TIMESTAMP_JUMP)
			handle_ts_jump(source, in.timestamp, diff);
	}

	source->next_audio_ts_min = in.timestamp +
		conv_frames_to_time(source, in.frames);

	if (source->audio_reset_ref != 0)
		return;

	in.timestamp += source->timing_adjust;
	in.volume = source->volume;
	audio_line_output(source->audio_line, &in);
}
コード例 #4
0
ファイル: obs-source.c プロジェクト: Christicles/obs-studio
static void source_output_audio_line(obs_source_t source,
		const struct audio_data *data)
{
	struct audio_data in = *data;
	uint64_t diff;

	if (!source->timing_set) {
		reset_audio_timing(source, in.timestamp);

		/* detects 'directly' set timestamps as long as they're within
		 * a certain threshold */
		if ((source->timing_adjust + MAX_TS_VAR) < MAX_TS_VAR * 2)
			source->timing_adjust = 0;

	} else {
		bool ts_under = (in.timestamp < source->next_audio_ts_min);

		diff = ts_under ?
			(source->next_audio_ts_min - in.timestamp) :
			(in.timestamp - source->next_audio_ts_min);

		/* smooth audio if lower or within threshold */
		if (diff > MAX_TIMESTAMP_JUMP)
			handle_ts_jump(source, source->next_audio_ts_min,
					in.timestamp, diff);
		else if (ts_under || diff < TS_SMOOTHING_THRESHOLD)
			in.timestamp = source->next_audio_ts_min;
	}

	source->next_audio_ts_min = in.timestamp +
		conv_frames_to_time(in.frames);

	if (source->av_sync_ref != 0)
		return;

	in.timestamp += source->timing_adjust + source->sync_offset;
	in.volume = source->user_volume * source->present_volume *
		obs->audio.user_volume * obs->audio.present_volume;

	audio_line_output(source->audio_line, &in);
}
コード例 #5
0
ファイル: obs-source.c プロジェクト: Alucard014/obs-studio
static void obs_source_flush_audio_wait_buffer(obs_source_t source)
{
	size_t i;

	pthread_mutex_lock(&source->audio_mutex);
	source->timing_set = true;

	for (i = 0; i < source->audio_wait_buffer.num; i++) {
		struct audiobuf *buf = source->audio_wait_buffer.array+i;
		struct audio_data data;

		data.data      = buf->data;
		data.frames    = buf->frames;
		data.timestamp = buf->timestamp + source->timing_adjust;
		audio_line_output(source->audio_line, &data);
		audiobuf_free(buf);
	}

	da_free(source->audio_wait_buffer);
	pthread_mutex_unlock(&source->audio_mutex);
}