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

Commit 57326621 authored by Eric Laurent's avatar Eric Laurent
Browse files

Fix issue 1743700: AudioTrack: setPlaybackRate can not set the playback rate...

Fix issue 1743700: AudioTrack: setPlaybackRate can not set the playback rate to twice of the ouputSR

Store sample rate on 32 bits instead of 16 bits in audio_track_cblk_t.
Removed sampleRate() methods from AudioTrack and AudioRecord: replaced by getSampleRate().
AudioTrack::setSampleRate() no returns a status.
parent 76aa2837
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -197,7 +197,6 @@ public:

   /* getters, see constructor */

            uint32_t    sampleRate() const;
            int         format() const;
            int         channelCount() const;
            uint32_t    frameCount() const;
@@ -217,7 +216,7 @@ public:
            status_t    stop();
            bool        stopped() const;

    /* get sample rate for this track
    /* get sample rate for this record track
     */
            uint32_t    getSampleRate();

@@ -323,7 +322,6 @@ private:
    sp<ClientRecordThread>  mClientRecordThread;
    Mutex                   mRecordThreadLock;

    uint32_t                mSampleRate;
    uint32_t                mFrameCount;

    audio_track_cblk_t*     mCblk;
+1 −2
Original line number Diff line number Diff line
@@ -201,7 +201,6 @@ public:
    /* getters, see constructor */

            int         streamType() const;
            uint32_t    sampleRate() const;
            int         format() const;
            int         channelCount() const;
            uint32_t    frameCount() const;
@@ -246,7 +245,7 @@ public:

    /* set sample rate for this track, mostly used for games' sound effects
     */
            void        setSampleRate(int sampleRate);
            status_t    setSampleRate(int sampleRate);
            uint32_t    getSampleRate();

    /* Enables looping and sets the start and end points of looping.
+3 −4
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ namespace android {

// ----------------------------------------------------------------------------

#define MAX_SAMPLE_RATE     65535
#define THREAD_PRIORITY_AUDIO_CLIENT (ANDROID_PRIORITY_AUDIO)
// Maximum cumulated timeout milliseconds before restarting audioflinger thread
#define MAX_STARTUP_TIMEOUT_MS  3000    // Longer timeout period at startup to cope with A2DP init time
@@ -55,9 +54,9 @@ struct audio_track_cblk_t
                    uint16_t    volume[2];
                    uint32_t    volumeLR;
                };
                uint16_t    sampleRate;
                uint16_t    channels;
                int16_t     flowControlFlag; // underrun (out) or overrrun (in) indication
                uint32_t    sampleRate;
                uint8_t     channels;
                uint8_t     flowControlFlag; // underrun (out) or overrrun (in) indication
                uint8_t     out;        // out equals 1 for AudioTrack and 0 for AudioRecord
                uint8_t     forceReady; 
                uint16_t    bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger
+6 −7
Original line number Diff line number Diff line
@@ -185,7 +185,6 @@ status_t AudioRecord::set(
    mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());
    mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
    mCblk->out = 0;
    mSampleRate = sampleRate;
    mFormat = format;
    // Update buffer size in case it has been limited by AudioFlinger during track creation
    mFrameCount = mCblk->frameCount;
@@ -196,7 +195,7 @@ status_t AudioRecord::set(
    mRemainingFrames = notificationFrames;
    mUserData = user;
    // TODO: add audio hardware input latency here
    mLatency = (1000*mFrameCount) / mSampleRate;
    mLatency = (1000*mFrameCount) / sampleRate;
    mMarkerPosition = 0;
    mMarkerReached = false;
    mNewPosition = 0;
@@ -218,11 +217,6 @@ uint32_t AudioRecord::latency() const
    return mLatency;
}

uint32_t AudioRecord::sampleRate() const
{
    return mSampleRate;
}

int AudioRecord::format() const
{
    return mFormat;
@@ -321,6 +315,11 @@ bool AudioRecord::stopped() const
    return !mActive;
}

uint32_t AudioRecord::getSampleRate()
{
    return mCblk->sampleRate;
}

status_t AudioRecord::setMarkerPosition(uint32_t marker)
{
    if (mCbf == 0) return INVALID_OPERATION;
+8 −15
Original line number Diff line number Diff line
@@ -243,7 +243,6 @@ status_t AudioTrack::set(
    mCblk->volume[0] = mCblk->volume[1] = 0x1000;
    mVolume[LEFT] = 1.0f;
    mVolume[RIGHT] = 1.0f;
    mSampleRate = sampleRate;
    mStreamType = streamType;
    mFormat = format;
    mChannelCount = channelCount;
@@ -254,7 +253,7 @@ status_t AudioTrack::set(
    mNotificationFrames = notificationFrames;
    mRemainingFrames = notificationFrames;
    mUserData = user;
    mLatency = afLatency + (1000*mFrameCount) / mSampleRate;
    mLatency = afLatency + (1000*mFrameCount) / sampleRate;
    mLoopCount = 0;
    mMarkerPosition = 0;
    mMarkerReached = false;
@@ -281,11 +280,6 @@ int AudioTrack::streamType() const
    return mStreamType;
}

uint32_t AudioTrack::sampleRate() const
{
    return mSampleRate;
}

int AudioTrack::format() const
{
    return mFormat;
@@ -438,24 +432,23 @@ void AudioTrack::getVolume(float* left, float* right)
    *right = mVolume[RIGHT];
}

void AudioTrack::setSampleRate(int rate)
status_t AudioTrack::setSampleRate(int rate)
{
    int afSamplingRate;

    if (AudioSystem::getOutputSamplingRate(&afSamplingRate, mStreamType) != NO_ERROR) {
        return;
        return NO_INIT;
    }
    // Resampler implementation limits input sampling rate to 2 x output sampling rate.
    if (rate <= 0) rate = 1;
    if (rate > afSamplingRate*2) rate = afSamplingRate*2;
    if (rate > MAX_SAMPLE_RATE) rate = MAX_SAMPLE_RATE;
    if (rate <= 0 || rate > afSamplingRate*2 ) return BAD_VALUE;

    mCblk->sampleRate = (uint16_t)rate;
    mCblk->sampleRate = rate;
    return NO_ERROR;
}

uint32_t AudioTrack::getSampleRate()
{
    return uint32_t(mCblk->sampleRate);
    return mCblk->sampleRate;
}

status_t AudioTrack::setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount)
@@ -866,7 +859,7 @@ status_t AudioTrack::dump(int fd, const Vector<String16>& args) const
    result.append(buffer);
    snprintf(buffer, 255, "  format(%d), channel count(%d), frame count(%d)\n", mFormat, mChannelCount, mFrameCount);
    result.append(buffer);
    snprintf(buffer, 255, "  sample rate(%d), status(%d), muted(%d)\n", mSampleRate, mStatus, mMuted);
    snprintf(buffer, 255, "  sample rate(%d), status(%d), muted(%d)\n", (mCblk == 0) ? 0 : mCblk->sampleRate, mStatus, mMuted);
    result.append(buffer);
    snprintf(buffer, 255, "  active(%d), latency (%d)\n", mActive, mLatency);
    result.append(buffer);