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); }
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); }
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); }
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); }
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); }