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

Commit 0d25bcf6 authored by Weiyin Jiang's avatar Weiyin Jiang
Browse files

hal: fix sub-overflow defect

Fix sub-overflow defect.

CRs-Fixed: 2518187
Change-Id: I164c3c785e295d3d797d003e9b96332355cfac92
parent 5866e83f
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 ...