@@ -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