obs-filters: Handle timestamp jumps for noise sup. filter

When buffering audio data, we don't want to buffer audio data that may
be old.  If the audio timing jumps significant and old audio data is
buffered, clear that old data.
This commit is contained in:
jp9000
2016-07-26 04:50:18 -07:00
parent 55a5664363
commit 155ddf8996

View File

@@ -35,6 +35,8 @@ struct noise_suppress_data {
obs_source_t *context;
int suppress_level;
uint64_t last_timestamp;
size_t frames;
size_t channels;
@@ -178,6 +180,21 @@ struct ng_audio_info {
uint64_t timestamp;
};
static inline void clear_circlebuf(struct circlebuf *buf)
{
circlebuf_pop_front(buf, NULL, buf->size);
}
static void reset_data(struct noise_suppress_data *ng)
{
for (size_t i = 0; i < ng->channels; i++) {
clear_circlebuf(&ng->input_buffers[i]);
clear_circlebuf(&ng->output_buffers[i]);
}
clear_circlebuf(&ng->info_buffer);
}
static struct obs_audio_data *noise_suppress_filter_audio(void *data,
struct obs_audio_data *audio)
{
@@ -189,10 +206,23 @@ static struct obs_audio_data *noise_suppress_filter_audio(void *data,
if (!ng->states[0])
return audio;
if (!ng->last_timestamp) {
ng->last_timestamp = audio->timestamp;
} else {
int64_t diff = llabs((int64_t)ng->last_timestamp -
(int64_t)audio->timestamp);
/* if timestamp has dramatically changed, reset audio data */
if (diff > 1000000000LL)
reset_data(ng);
}
info.frames = audio->frames;
info.timestamp = audio->timestamp;
circlebuf_push_back(&ng->info_buffer, &info, sizeof(info));
ng->last_timestamp = audio->timestamp;
for (size_t i = 0; i < ng->channels; i++)
circlebuf_push_back(&ng->input_buffers[i], audio->data[i],
audio->frames * sizeof(float));