diff options
author | Andy Hung <hunga@google.com> | 2015-01-07 23:41:45 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-01-07 23:41:45 +0000 |
commit | 2326ed104477a80c850eb3cef6a7039f1585a69d (patch) | |
tree | 62357b1335a065661ce118788c6965fb487a09be /media/libmedia | |
parent | bb67a2e8942620240531b5d157d376fa3fa049af (diff) | |
parent | 3c09c78aabcb9d314dfb400258fb99a37c7b50c9 (diff) | |
download | frameworks_av-2326ed104477a80c850eb3cef6a7039f1585a69d.zip frameworks_av-2326ed104477a80c850eb3cef6a7039f1585a69d.tar.gz frameworks_av-2326ed104477a80c850eb3cef6a7039f1585a69d.tar.bz2 |
Merge "Event driven wake for AudioTrackThread notification changes"
Diffstat (limited to 'media/libmedia')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 27 | ||||
-rw-r--r-- | media/libmedia/docs/paused.dot | 14 |
2 files changed, 38 insertions, 3 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index ea7b2df..ca36143 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -753,6 +753,8 @@ void AudioTrack::setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount) mLoopStart = loopStart; mLoopCountNotified = loopCount; mStaticProxy->setLoop(loopStart, loopEnd, loopCount); + + // Waking the AudioTrackThread is not needed as this cannot be called when active. } status_t AudioTrack::setMarkerPosition(uint32_t marker) @@ -766,6 +768,10 @@ status_t AudioTrack::setMarkerPosition(uint32_t marker) mMarkerPosition = marker; mMarkerReached = false; + sp<AudioTrackThread> t = mAudioTrackThread; + if (t != 0) { + t->wake(); + } return NO_ERROR; } @@ -795,6 +801,10 @@ status_t AudioTrack::setPositionUpdatePeriod(uint32_t updatePeriod) mNewPosition = updateAndGetPosition_l() + updatePeriod; mUpdatePeriod = updatePeriod; + sp<AudioTrackThread> t = mAudioTrackThread; + if (t != 0) { + t->wake(); + } return NO_ERROR; } @@ -835,6 +845,8 @@ status_t AudioTrack::setPosition(uint32_t position) // After setting the position, use full update period before notification. mNewPosition = updateAndGetPosition_l() + mUpdatePeriod; mStaticProxy->setBufferPosition(position); + + // Waking the AudioTrackThread is not needed as this cannot be called when active. return NO_ERROR; } @@ -2181,8 +2193,8 @@ bool AudioTrack::AudioTrackThread::threadLoop() case NS_NEVER: return false; case NS_WHENEVER: - // FIXME increase poll interval, or make event-driven - ns = 1000000000LL; + // Event driven: call wake() when callback notifications conditions change. + ns = INT64_MAX; // fall through default: LOG_ALWAYS_FATAL_IF(ns < 0, "processAudioBuffer() returned %" PRId64, ns); @@ -2215,6 +2227,17 @@ void AudioTrack::AudioTrackThread::resume() } } +void AudioTrack::AudioTrackThread::wake() +{ + AutoMutex _l(mMyLock); + if (!mPaused && mPausedInt && mPausedNs > 0) { + // audio track is active and internally paused with timeout. + mIgnoreNextPausedInt = true; + mPausedInt = false; + mMyCond.signal(); + } +} + void AudioTrack::AudioTrackThread::pauseInternal(nsecs_t ns) { AutoMutex _l(mMyLock); diff --git a/media/libmedia/docs/paused.dot b/media/libmedia/docs/paused.dot index 8856647..11e1777 100644 --- a/media/libmedia/docs/paused.dot +++ b/media/libmedia/docs/paused.dot @@ -21,6 +21,12 @@ destructor [label="~AudioTrack()"]; destructor -> requestExit; requestExit [label="AudioTrackThread::requestExit()"]; requestExit -> resume; +Application -> ATsetMarkerPosition +ATsetMarkerPosition [label="AudioTrack::setMarkerPosition()\n[sets marker variables]"]; +ATsetMarkerPosition -> ATTwake +Application -> ATsetPositionUpdatePeriod +ATsetPositionUpdatePeriod [label="AudioTrack::setPositionUpdatePeriod()\n[sets update period variables]"]; +ATsetPositionUpdatePeriod -> ATTwake Application -> ATstart; resume [label="AudioTrackThread::resume()"]; @@ -29,6 +35,12 @@ resume -> resume_body; resume_body -> resume_paused [label="true"]; resume_body -> resume_merged [label="false"]; +ATTwake [label="AudioTrackThread::wake()\nif (!mPaused && mPausedInt && mPausedNs > 0)"]; +ATTwake-> ATTWake_wakeable [label="true"]; +ATTWake_wakeable [label="mIgnoreNextPausedInt = true\nmPausedInt = false\nsignal()"]; +ATTwake-> ATTWake_cannotwake [label="false"] +ATTWake_cannotwake [label="ignore"]; + pause [label="mPaused = true"]; pause -> return; @@ -63,7 +75,7 @@ threadLoop_6_default [label="if (ns < 0)"]; threadLoop_6_default -> threadLoop_6_default_true [label="true"]; threadLoop_6_default -> threadLoop_6_default_false [label="false"]; threadLoop_6_default_true [label="FATAL"]; -threadLoop_6_default_false [label="pauseInternal(ns)\nmPausedInternal = true\nmPausedNs = ns\nreturn true"]; +threadLoop_6_default_false [label="pauseInternal(ns) [wake()-able]\nmPausedInternal = true\nmPausedNs = ns\nreturn true"]; threadLoop_6_0 [label="return true"]; threadLoop_6_NS_INACTIVE [label="pauseInternal()\nmPausedInternal = true\nmPausedNs = 0\nreturn true"]; threadLoop_6_NS_NEVER [label="return false"]; |