summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2015-06-02 15:41:02 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-02 15:41:03 +0000
commit0eafa9d8ee4069aa709ff85ceffe94d12995956d (patch)
tree7579f186bd84573a34de8bf385040b3fd04a9d8c
parent20d09f3d9a82dc4ce51824025ef7a465f62086d0 (diff)
parent9f9e21ed9a342e0ca945818bdc6c0c4fb3bfb9bd (diff)
downloadframeworks_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.h7
-rw-r--r--media/libmedia/AudioTrack.cpp50
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;