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

Commit 96b12db1 authored by Andy Hung's avatar Andy Hung Committed by Rachad Alao
Browse files

audio_a2dp_hw: Always update frame counter in out_write

Required now that we always return success.

Bug: 30025777
Change-Id: I7db51321672c128039545cc0fb604c615f169bc3
(cherry picked from commit 7911fc71)
parent e7eba7ec
Loading
Loading
Loading
Loading
+12 −15
Original line number Original line Diff line number Diff line
@@ -586,8 +586,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
                         size_t bytes)
                         size_t bytes)
{
{
    struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
    struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
    int sent;
    int sent = -1;
    int us_delay;


    DEBUG("write %zu bytes (fd %d)", bytes, out->common.audio_fd);
    DEBUG("write %zu bytes (fd %d)", bytes, out->common.audio_fd);


@@ -595,7 +594,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
    if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED ||
    if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED ||
            out->common.state == AUDIO_A2DP_STATE_STOPPING) {
            out->common.state == AUDIO_A2DP_STATE_STOPPING) {
        DEBUG("stream suspended or closing");
        DEBUG("stream suspended or closing");
        goto error;
        goto finish;
    }
    }


    /* only allow autostarting if we are in stopped or standby */
    /* only allow autostarting if we are in stopped or standby */
@@ -604,13 +603,13 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
    {
    {
        if (start_audio_datapath(&out->common) < 0)
        if (start_audio_datapath(&out->common) < 0)
        {
        {
            goto error;
            goto finish;
        }
        }
    }
    }
    else if (out->common.state != AUDIO_A2DP_STATE_STARTED)
    else if (out->common.state != AUDIO_A2DP_STATE_STARTED)
    {
    {
        ERROR("stream not in stopped or standby");
        ERROR("stream not in stopped or standby");
        goto error;
        goto finish;
    }
    }


    pthread_mutex_unlock(&out->common.lock);
    pthread_mutex_unlock(&out->common.lock);
@@ -626,26 +625,24 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
        } else {
        } else {
            ERROR("write failed : stream suspended, avoid resetting state");
            ERROR("write failed : stream suspended, avoid resetting state");
        }
        }
        goto error;
        goto finish;
    }
    }


finish: ;
    const size_t frames = bytes / audio_stream_out_frame_size(stream);
    const size_t frames = bytes / audio_stream_out_frame_size(stream);
    out->frames_rendered += frames;
    out->frames_rendered += frames;
    out->frames_presented += frames;
    out->frames_presented += frames;
    pthread_mutex_unlock(&out->common.lock);
    pthread_mutex_unlock(&out->common.lock);
    return bytes;

error:
    pthread_mutex_unlock(&out->common.lock);
    us_delay = calc_audiotime(out->common.cfg, bytes);


    // If send didn't work out, sleep to emulate write delay.
    if (sent == -1) {
        const int us_delay = calc_audiotime(out->common.cfg, bytes);
        DEBUG("emulate a2dp write delay (%d us)", us_delay);
        DEBUG("emulate a2dp write delay (%d us)", us_delay);

        usleep(us_delay);
        usleep(us_delay);
    }
    return bytes;
    return bytes;
}
}



static uint32_t out_get_sample_rate(const struct audio_stream *stream)
static uint32_t out_get_sample_rate(const struct audio_stream *stream)
{
{
    struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
    struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;