Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c387dff1 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "hal: fix sub-overflow defect"

parents 15bb80d3 0d25bcf6
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -5872,25 +5872,24 @@ static int out_get_presentation_position(const struct audio_stream_out *stream,
                size_t kernel_buffer_size = out->config.period_size * out->config.period_count;

                uint64_t signed_frames = 0;
                uint64_t frames_temp = 0;

                if (avail > kernel_buffer_size)
                    avail = kernel_buffer_size;

                if (out->written >= (kernel_buffer_size - avail))
                    signed_frames = out->written - kernel_buffer_size + avail;
                frames_temp = (kernel_buffer_size > avail) ? (kernel_buffer_size - avail) : 0;
                if (out->written >= frames_temp)
                    signed_frames = out->written - frames_temp;

                // This adjustment accounts for buffering after app processor.
                // It is based on estimated DSP latency per use case, rather than exact.
                if (signed_frames >= (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL))
                    signed_frames -=
                        (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL);
                frames_temp = platform_render_latency(out->usecase) * out->sample_rate / 1000000LL;
                if (signed_frames >= frames_temp)
                    signed_frames -= frames_temp;

                // Adjustment accounts for A2dp encoder latency with non offload usecases
                // Note: Encoder latency is returned in ms, while platform_render_latency in us.
                if (AUDIO_DEVICE_OUT_ALL_A2DP & out->devices) {
                    if (signed_frames >= (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000))
                        signed_frames -=
                            (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000);
                    frames_temp = audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000;
                    if (signed_frames >= frames_temp)
                        signed_frames -= frames_temp;
                }

                // It would be unusual for this value to be negative, but check just in case ...