Skip to content

Commit 97bf554

Browse files
committed
Add resampler latency to latency and position calculations
Fix issue with jack, it doesn't use smart pointers Fix jack compiler error
1 parent d5b033d commit 97bf554

File tree

4 files changed

+29
-15
lines changed

4 files changed

+29
-15
lines changed

src/cubeb_audiounit.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -2969,10 +2969,12 @@ static int
29692969
audiounit_stream_get_position(cubeb_stream * stm, uint64_t * position)
29702970
{
29712971
assert(stm);
2972-
if (stm->current_latency_frames > stm->frames_played) {
2972+
uint32_t latency_frames = stm->total_output_latency_frames + cubeb_resampler_latency(stm->resampler.get());
2973+
2974+
if (latency_frames > stm->frames_played) {
29732975
*position = 0;
29742976
} else {
2975-
*position = stm->frames_played - stm->current_latency_frames;
2977+
*position = stm->frames_played - latency_frames;
29762978
}
29772979
return CUBEB_OK;
29782980
}
@@ -2984,7 +2986,7 @@ audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
29842986
//TODO
29852987
return CUBEB_ERROR_NOT_SUPPORTED;
29862988
#else
2987-
*latency = stm->total_output_latency_frames;
2989+
*latency = stm->total_output_latency_frames + cubeb_resampler_latency(stm->resampler.get());
29882990
return CUBEB_OK;
29892991
#endif
29902992
}

src/cubeb_jack.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -658,9 +658,9 @@ cbjack_get_max_channel_count(cubeb * /*ctx*/, uint32_t * max_channels)
658658
}
659659

660660
static int
661-
cbjack_get_latency(cubeb_stream * stm, unsigned int * latency_ms)
661+
cbjack_get_latency(cubeb_stream * stm, unsigned int * latency)
662662
{
663-
*latency_ms = stm->context->jack_latency;
663+
*latency = stm->context->jack_latency + ceil(cubeb_resampler_latency(stm->resampler) * stm->ratio);
664664
return CUBEB_OK;
665665
}
666666

@@ -955,7 +955,7 @@ cbjack_stream_stop(cubeb_stream * stream)
955955
static int
956956
cbjack_stream_get_position(cubeb_stream * stream, uint64_t * position)
957957
{
958-
*position = stream->position;
958+
*position = stream->position - ceil(cubeb_resampler_latency(stream->resampler) * stream->ratio);
959959
return CUBEB_OK;
960960
}
961961

src/cubeb_opensl.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1669,7 +1669,7 @@ opensl_stream_get_position(cubeb_stream * stm, uint64_t * position)
16691669
}
16701670

16711671
uint64_t samplerate = stm->user_output_rate;
1672-
uint32_t output_latency = stm->output_latency_ms;
1672+
uint32_t output_latency = stm->output_latency_ms + ((double)cubeb_resampler_latency(stm->resampler) / stm->output_configured_rate);
16731673

16741674
pthread_mutex_lock(&stm->mutex);
16751675
int64_t maximum_position = stm->written * (int64_t)stm->user_output_rate / stm->output_configured_rate;
@@ -1703,8 +1703,8 @@ opensl_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
17031703

17041704
uint32_t stream_latency_frames =
17051705
stm->user_output_rate * (stm->output_latency_ms / 1000);
1706-
1707-
return stream_latency_frames + cubeb_resampler_latency(stm->resampler);
1706+
uint32_t resampler_latency_frames = (uint32_t)ceil(cubeb_resampler_latency(stm->resampler) * ((double)stm->user_output_rate) / stm->output_configured_rate);
1707+
return stream_latency_frames + resampler_latency_frames;
17081708
}
17091709

17101710
int

src/cubeb_wasapi.cpp

+18-6
Original file line numberDiff line numberDiff line change
@@ -2596,12 +2596,15 @@ int wasapi_stream_get_position(cubeb_stream * stm, uint64_t * position)
25962596
return CUBEB_ERROR;
25972597
}
25982598

2599+
double resample_ratio = stream_to_mix_samplerate_ratio(stm->output_stream_params, stm->output_mix_params);
2600+
25992601
/* Calculate how far behind the current stream head the playback cursor is. */
2600-
uint64_t stream_delay = static_cast<uint64_t>(current_stream_delay(stm) * stm->output_stream_params.rate);
2602+
uint64_t resampler_delay = ceil(cubeb_resampler_latency(stm->resampler.get()) * resample_ratio);
2603+
uint64_t stream_delay = static_cast<uint64_t>((current_stream_delay(stm) * stm->output_stream_params.rate)) + resampler_delay;
26012604

26022605
/* Calculate the logical stream head in frames at the stream sample rate. */
26032606
uint64_t max_pos = stm->total_frames_written +
2604-
static_cast<uint64_t>(round(stm->frames_written * stream_to_mix_samplerate_ratio(stm->output_stream_params, stm->output_mix_params)));
2607+
static_cast<uint64_t>(round(stm->frames_written * resample_ratio));
26052608

26062609
*position = max_pos;
26072610
if (stream_delay <= *position) {
@@ -2637,13 +2640,18 @@ int wasapi_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
26372640
if (FAILED(hr)) {
26382641
return CUBEB_ERROR;
26392642
}
2643+
2644+
2645+
double resample_ratio = stream_to_mix_samplerate_ratio(stm->output_stream_params, stm->output_mix_params);
2646+
uint32_t resample_latency = ceil(cubeb_resampler_latency(stm->resampler.get()) * resample_ratio);
2647+
26402648
// This happens on windows 10: no error, but always 0 for latency.
26412649
if (latency_hns == 0) {
26422650
double delay_s = current_stream_delay(stm);
2643-
// convert to sample-frames
2644-
*latency = delay_s * stm->output_stream_params.rate;
2651+
// convert to output(mix) rate sample-frames
2652+
*latency = (delay_s * stm->output_mix_params.rate) + resample_latency;
26452653
} else {
2646-
*latency = hns_to_frames(stm, latency_hns);
2654+
*latency = hns_to_frames(stm, latency_hns) + resample_latency;
26472655
}
26482656

26492657
return CUBEB_OK;
@@ -2664,7 +2672,11 @@ int wasapi_stream_get_input_latency(cubeb_stream * stm, uint32_t * latency)
26642672
return CUBEB_ERROR;
26652673
}
26662674

2667-
*latency = hns_to_frames(stm, stm->input_latency_hns);
2675+
2676+
double resample_ratio = stream_to_mix_samplerate_ratio(stm->output_stream_params, stm->output_mix_params);
2677+
uint32_t resample_latency = ceil(cubeb_resampler_latency(stm->resampler.get()) * resample_ratio);
2678+
2679+
*latency = hns_to_frames(stm, stm->input_latency_hns) + resample_latency;
26682680

26692681
return CUBEB_OK;
26702682
}

0 commit comments

Comments
 (0)