diff options
author | Andy Hung <hunga@google.com> | 2015-06-02 15:41:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-02 15:41:03 +0000 |
commit | 0eafa9d8ee4069aa709ff85ceffe94d12995956d (patch) | |
tree | 7579f186bd84573a34de8bf385040b3fd04a9d8c | |
parent | 20d09f3d9a82dc4ce51824025ef7a465f62086d0 (diff) | |
parent | 9f9e21ed9a342e0ca945818bdc6c0c4fb3bfb9bd (diff) | |
download | frameworks_av-0eafa9d8ee4069aa709ff85ceffe94d12995956d.zip frameworks_av-0eafa9d8ee4069aa709ff85ceffe94d12995956d.tar.gz frameworks_av-0eafa9d8ee4069aa709ff85ceffe94d12995956d.tar.bz2 |
Merge "Store server latency, sample rate, framecount information in AudioTrack" into mnc-dev
-rw-r--r-- | include/media/AudioTrack.h | 7 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 50 |
2 files changed, 19 insertions, 38 deletions
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 54e86b9..3efa74c 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -801,6 +801,13 @@ protected: size_t mReqFrameCount; // frame count to request the first or next time // a new IAudioTrack is needed, non-decreasing + // The following AudioFlinger server-side values are cached in createAudioTrack_l(). + // These values can be used for informational purposes until the track is invalidated, + // whereupon restoreTrack_l() calls createTrack_l() to update the values. + uint32_t mAfLatency; // AudioFlinger latency in ms + size_t mAfFrameCount; // AudioFlinger frame count + uint32_t mAfSampleRate; // AudioFlinger sample rate + // constant after constructor or set() audio_format_t mFormat; // as requested by client, not forced to 16-bit audio_stream_type_t mStreamType; // mStreamType == AUDIO_STREAM_DEFAULT implies diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index faf5935..070baa1 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1111,31 +1111,27 @@ status_t AudioTrack::createTrack_l() // we must release it ourselves if anything goes wrong. // Not all of these values are needed under all conditions, but it is easier to get them all - - uint32_t afLatency; - status = AudioSystem::getLatency(output, &afLatency); + status = AudioSystem::getLatency(output, &mAfLatency); if (status != NO_ERROR) { ALOGE("getLatency(%d) failed status %d", output, status); goto release; } - ALOGV("createTrack_l() output %d afLatency %u", output, afLatency); + ALOGV("createTrack_l() output %d afLatency %u", output, mAfLatency); - size_t afFrameCount; - status = AudioSystem::getFrameCount(output, &afFrameCount); + status = AudioSystem::getFrameCount(output, &mAfFrameCount); if (status != NO_ERROR) { ALOGE("getFrameCount(output=%d) status %d", output, status); goto release; } - uint32_t afSampleRate; - status = AudioSystem::getSamplingRate(output, &afSampleRate); + status = AudioSystem::getSamplingRate(output, &mAfSampleRate); if (status != NO_ERROR) { ALOGE("getSamplingRate(output=%d) status %d", output, status); goto release; } if (mSampleRate == 0) { - mSampleRate = afSampleRate; - mOriginalSampleRate = afSampleRate; + mSampleRate = mAfSampleRate; + mOriginalSampleRate = mAfSampleRate; } // Client decides whether the track is TIMED (see below), but can only express a preference // for FAST. Server will perform additional tests. @@ -1148,9 +1144,9 @@ status_t AudioTrack::createTrack_l() // use case 3: obtain/release mode (mTransfer == TRANSFER_OBTAIN)) && // matching sample rate - (mSampleRate == afSampleRate))) { + (mSampleRate == mAfSampleRate))) { ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client; transfer %d, track %u Hz, output %u Hz", - mTransfer, mSampleRate, afSampleRate); + mTransfer, mSampleRate, mAfSampleRate); // once denied, do not request again if IAudioTrack is re-created mFlags = (audio_output_flags_t) (mFlags & ~AUDIO_OUTPUT_FLAG_FAST); } @@ -1171,7 +1167,7 @@ status_t AudioTrack::createTrack_l() // Same comment as below about ignoring frameCount parameter for set() frameCount = mSharedBuffer->size(); } else if (frameCount == 0) { - frameCount = afFrameCount; + frameCount = mAfFrameCount; } if (mNotificationFramesAct != frameCount) { mNotificationFramesAct = frameCount; @@ -1207,7 +1203,7 @@ status_t AudioTrack::createTrack_l() if ((mFlags & AUDIO_OUTPUT_FLAG_FAST) == 0) { // for normal tracks precompute the frame count based on speed. const size_t minFrameCount = calculateMinFrameCount( - afLatency, afFrameCount, afSampleRate, mSampleRate, + mAfLatency, mAfFrameCount, mAfSampleRate, mSampleRate, mPlaybackRate.mSpeed); if (frameCount < minFrameCount) { frameCount = minFrameCount; @@ -1357,7 +1353,7 @@ status_t AudioTrack::createTrack_l() mAudioTrack->attachAuxEffect(mAuxEffectId); // FIXME doesn't take into account speed or future sample rate changes (until restoreTrack) // FIXME don't believe this lie - mLatency = afLatency + (1000*frameCount) / mSampleRate; + mLatency = mAfLatency + (1000*frameCount) / mSampleRate; mFrameCount = frameCount; // If IAudioTrack is re-created, don't let the requested frameCount @@ -2089,30 +2085,8 @@ bool AudioTrack::isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed) co if (mStaticProxy != 0) { return true; // static tracks do not have issues with buffer sizing. } - status_t status; - uint32_t afLatency; - status = AudioSystem::getLatency(mOutput, &afLatency); - if (status != NO_ERROR) { - ALOGE("getLatency(%d) failed status %d", mOutput, status); - return false; - } - - size_t afFrameCount; - status = AudioSystem::getFrameCount(mOutput, &afFrameCount); - if (status != NO_ERROR) { - ALOGE("getFrameCount(output=%d) status %d", mOutput, status); - return false; - } - - uint32_t afSampleRate; - status = AudioSystem::getSamplingRate(mOutput, &afSampleRate); - if (status != NO_ERROR) { - ALOGE("getSamplingRate(output=%d) status %d", mOutput, status); - return false; - } - const size_t minFrameCount = - calculateMinFrameCount(afLatency, afFrameCount, afSampleRate, sampleRate, speed); + calculateMinFrameCount(mAfLatency, mAfFrameCount, mAfSampleRate, sampleRate, speed); ALOGV("isSampleRateSpeedAllowed_l mFrameCount %zu minFrameCount %zu", mFrameCount, minFrameCount); return mFrameCount >= minFrameCount; |