summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/audioflinger/AudioFlinger.cpp33
-rw-r--r--services/audioflinger/AudioFlinger.h10
2 files changed, 24 insertions, 19 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index fe068af..608fc71 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -2074,17 +2074,7 @@ if (mType == DIRECT) {
}
-if (mType == DUPLICATING) {
-#if 0 // see earlier FIXME
- // Now that this is a field instead of local variable,
- // clear it so it is empty the first time through the loop,
- // and later an assignment could combine the clear with the loop below
- outputTracks.clear();
-#endif
- for (size_t i = 0; i < mOutputTracks.size(); i++) {
- outputTracks.add(mOutputTracks[i]);
- }
-}
+ saveOutputTracks();
// put audio hardware into standby after short delay
if (CC_UNLIKELY((!mActiveTracks.size() && systemTime() > standbyTime) ||
@@ -2101,9 +2091,7 @@ if (mType == DUPLICATING) {
// we're about to wait, flush the binder command buffer
IPCThreadState::self()->flushCommands();
-if (mType == DUPLICATING) {
- outputTracks.clear();
-}
+ clearOutputTracks();
if (exitPending()) break;
@@ -2212,9 +2200,10 @@ if (mType == MIXER) {
if (mType == DIRECT) {
activeTrack.clear();
}
-if (mType == DUPLICATING) {
- outputTracks.clear();
-}
+ // FIXME I don't understand the need for this here;
+ // it was in the original code but maybe the
+ // assignment in saveOutputTracks() makes this unnecessary?
+ clearOutputTracks();
// Effect chains will be actually deleted here if they were removed from
// mEffectChains list during mixing or effects processing
@@ -3168,6 +3157,16 @@ void AudioFlinger::DuplicatingThread::threadLoop_standby()
}
}
+void AudioFlinger::DuplicatingThread::saveOutputTracks()
+{
+ outputTracks = mOutputTracks;
+}
+
+void AudioFlinger::DuplicatingThread::clearOutputTracks()
+{
+ outputTracks.clear();
+}
+
void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
{
Mutex::Autolock _l(mLock);
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 8ca4f89..518a99c 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -920,6 +920,10 @@ public:
// Code snippets that are temporarily lifted up out of threadLoop() until the merge
void checkSilentMode_l();
+ // Non-trivial for DUPLICATING only
+ virtual void saveOutputTracks() { }
+ virtual void clearOutputTracks() { }
+
private:
friend class AudioFlinger;
@@ -972,9 +976,7 @@ public:
// activeTrack was local to the while !exitingPending loop
sp<Track> activeTrack;
// DUPLICATING only
- SortedVector < sp<OutputTrack> > outputTracks;
uint32_t writeFrames;
- SortedVector < sp<OutputTrack> > mOutputTracks;
};
class MixerThread : public PlaybackThread {
@@ -1070,9 +1072,13 @@ private:
// called from threadLoop, addOutputTrack, removeOutputTrack
virtual void updateWaitTime_l();
+ virtual void saveOutputTracks();
+ virtual void clearOutputTracks();
private:
uint32_t mWaitTimeMs;
+ SortedVector < sp<OutputTrack> > outputTracks;
+ SortedVector < sp<OutputTrack> > mOutputTracks;
};
PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const;