diff options
author | Eric Laurent <elaurent@google.com> | 2012-04-13 16:50:19 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2012-04-20 14:17:02 -0700 |
commit | 1948eb3ea6eee336e8cdab9b0c693f93f5f19993 (patch) | |
tree | 448eed49a4ba18fb1ab4f2fb1b2c0d5cef6d242f /media/libmediaplayerservice/MediaPlayerService.cpp | |
parent | 21e8c50bd13ebe44f3088e26c9c6df0e163c469c (diff) | |
download | frameworks_av-1948eb3ea6eee336e8cdab9b0c693f93f5f19993.zip frameworks_av-1948eb3ea6eee336e8cdab9b0c693f93f5f19993.tar.gz frameworks_av-1948eb3ea6eee336e8cdab9b0c693f93f5f19993.tar.bz2 |
Add support for deep audio buffers
Allow AudioSink to use deep audio buffering when the
source is audio only and its duration is more than
a certain threshold.
This helps improve battery life but implies higher
audio latency.
Change-Id: Ie79915b61c370292f05aabda9779356570e03cbb
Diffstat (limited to 'media/libmediaplayerservice/MediaPlayerService.cpp')
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 7254599..bfdf250 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1412,7 +1412,8 @@ MediaPlayerService::AudioOutput::AudioOutput(int sessionId) mCallbackCookie(NULL), mCallbackData(NULL), mBytesWritten(0), - mSessionId(sessionId) { + mSessionId(sessionId), + mFlags(AUDIO_OUTPUT_FLAG_NONE) { ALOGV("AudioOutput(%d)", sessionId); mTrack = 0; mRecycledTrack = 0; @@ -1506,7 +1507,8 @@ status_t MediaPlayerService::AudioOutput::getFramesWritten(uint32_t *frameswritt status_t MediaPlayerService::AudioOutput::open( uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, audio_format_t format, int bufferCount, - AudioCallback cb, void *cookie) + AudioCallback cb, void *cookie, + audio_output_flags_t flags) { mCallback = cb; mCallbackCookie = cookie; @@ -1521,7 +1523,7 @@ status_t MediaPlayerService::AudioOutput::open( format, bufferCount, mSessionId); int afSampleRate; int afFrameCount; - int frameCount; + uint32_t frameCount; if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) { return NO_INIT; @@ -1539,6 +1541,7 @@ status_t MediaPlayerService::AudioOutput::open( return NO_INIT; } } + if (mRecycledTrack) { // check if the existing track can be reused as-is, or if a new track needs to be created. @@ -1553,6 +1556,9 @@ status_t MediaPlayerService::AudioOutput::open( (mRecycledTrack->frameCount() != frameCount)) { ALOGV("samplerate, channelcount or framecount differ"); reuse = false; + } if (flags != mFlags) { + ALOGV("output flags differ"); + reuse = false; } if (reuse) { ALOGV("chaining to next output"); @@ -1587,7 +1593,7 @@ status_t MediaPlayerService::AudioOutput::open( format, channelMask, frameCount, - AUDIO_OUTPUT_FLAG_NONE, + flags, CallbackWrapper, mCallbackData, 0, // notification frames @@ -1599,7 +1605,7 @@ status_t MediaPlayerService::AudioOutput::open( format, channelMask, frameCount, - AUDIO_OUTPUT_FLAG_NONE, + flags, NULL, NULL, 0, @@ -1616,6 +1622,7 @@ status_t MediaPlayerService::AudioOutput::open( t->setVolume(mLeftVolume, mRightVolume); mSampleRateHz = sampleRate; + mFlags = flags; mMsecsPerFrame = mPlaybackRatePermille / (float) sampleRate; uint32_t pos; if (t->getPosition(&pos) == OK) { @@ -1891,7 +1898,7 @@ bool CallbackThread::threadLoop() { status_t MediaPlayerService::AudioCache::open( uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, audio_format_t format, int bufferCount, - AudioCallback cb, void *cookie) + AudioCallback cb, void *cookie, audio_output_flags_t flags) { ALOGV("open(%u, %d, 0x%x, %d, %d)", sampleRate, channelCount, channelMask, format, bufferCount); if (mHeap->getHeapID() < 0) { |