summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/MediaPlayerService.cpp
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2012-04-13 16:50:19 -0700
committerEric Laurent <elaurent@google.com>2012-04-20 14:17:02 -0700
commit1948eb3ea6eee336e8cdab9b0c693f93f5f19993 (patch)
tree448eed49a4ba18fb1ab4f2fb1b2c0d5cef6d242f /media/libmediaplayerservice/MediaPlayerService.cpp
parent21e8c50bd13ebe44f3088e26c9c6df0e163c469c (diff)
downloadframeworks_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.cpp19
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) {