summaryrefslogtreecommitdiffstats
path: root/media/jni/soundpool
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2015-03-09 08:36:35 -0700
committerGlenn Kasten <gkasten@google.com>2015-03-09 08:40:12 -0700
commit18c225d05480e7b80b312ef90d15789b34ce6bbc (patch)
tree749c3889c36db67a316898f6a998826fdd13f393 /media/jni/soundpool
parentb801f73343194cd081f675a5dc2b3e90959cf6d1 (diff)
downloadframeworks_base-18c225d05480e7b80b312ef90d15789b34ce6bbc.zip
frameworks_base-18c225d05480e7b80b312ef90d15789b34ce6bbc.tar.gz
frameworks_base-18c225d05480e7b80b312ef90d15789b34ce6bbc.tar.bz2
Revert "soundpool: reuse channel for same sample if available"
This reverts commit 570576b51b8123ab05b36707ec752cf966292ca5. Bug: 19635137 Change-Id: I8385ac4c151a375c19c3606698081c947b6216e3
Diffstat (limited to 'media/jni/soundpool')
-rw-r--r--media/jni/soundpool/SoundPool.cpp83
-rw-r--r--media/jni/soundpool/SoundPool.h4
2 files changed, 34 insertions, 53 deletions
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index 8957b3c..a73209b 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -256,7 +256,7 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
dump();
// allocate a channel
- channel = allocateChannel_l(priority, sampleID);
+ channel = allocateChannel_l(priority);
// no channel allocated - return 0
if (!channel) {
@@ -271,25 +271,13 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
return channelID;
}
-SoundChannel* SoundPool::allocateChannel_l(int priority, int sampleID)
+SoundChannel* SoundPool::allocateChannel_l(int priority)
{
List<SoundChannel*>::iterator iter;
SoundChannel* channel = NULL;
- // check if channel for given sampleID still available
+ // allocate a channel
if (!mChannels.empty()) {
- for (iter = mChannels.begin(); iter != mChannels.end(); ++iter) {
- if (sampleID == (*iter)->getPrevSampleID() && (*iter)->state() == SoundChannel::IDLE) {
- channel = *iter;
- mChannels.erase(iter);
- ALOGV("Allocated recycled channel for same sampleID");
- break;
- }
- }
- }
-
- // allocate any channel
- if (!channel && !mChannels.empty()) {
iter = mChannels.begin();
if (priority >= (*iter)->priority()) {
channel = *iter;
@@ -660,7 +648,6 @@ error:
void SoundChannel::init(SoundPool* soundPool)
{
mSoundPool = soundPool;
- mPrevSampleID = -1;
}
// call with sound pool lock held
@@ -669,7 +656,7 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
{
sp<AudioTrack> oldTrack;
sp<AudioTrack> newTrack;
- status_t status = NO_ERROR;
+ status_t status;
{ // scope for the lock
Mutex::Autolock lock(&mLock);
@@ -714,41 +701,38 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
}
#endif
- if (!mAudioTrack.get() || mPrevSampleID != sample->sampleID()) {
- // mToggle toggles each time a track is started on a given channel.
- // The toggle is concatenated with the SoundChannel address and passed to AudioTrack
- // as callback user data. This enables the detection of callbacks received from the old
- // audio track while the new one is being started and avoids processing them with
- // wrong audio audio buffer size (mAudioBufferSize)
- unsigned long toggle = mToggle ^ 1;
- void *userData = (void *)((unsigned long)this | toggle);
- audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(numChannels);
-
- // do not create a new audio track if current track is compatible with sample parameters
- #ifdef USE_SHARED_MEM_BUFFER
- newTrack = new AudioTrack(streamType, sampleRate, sample->format(),
- channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData);
- #else
- uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount;
- newTrack = new AudioTrack(streamType, sampleRate, sample->format(),
- channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData,
- bufferFrames);
- #endif
- oldTrack = mAudioTrack;
- status = newTrack->initCheck();
- if (status != NO_ERROR) {
- ALOGE("Error creating AudioTrack");
- goto exit;
- }
- // From now on, AudioTrack callbacks received with previous toggle value will be ignored.
- mToggle = toggle;
- mAudioTrack = newTrack;
- } else {
- newTrack = mAudioTrack;
- ALOGV("reusing track %p for sample %d", mAudioTrack.get(), sample->sampleID());
+ // mToggle toggles each time a track is started on a given channel.
+ // The toggle is concatenated with the SoundChannel address and passed to AudioTrack
+ // as callback user data. This enables the detection of callbacks received from the old
+ // audio track while the new one is being started and avoids processing them with
+ // wrong audio audio buffer size (mAudioBufferSize)
+ unsigned long toggle = mToggle ^ 1;
+ void *userData = (void *)((unsigned long)this | toggle);
+ audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(numChannels);
+
+ // do not create a new audio track if current track is compatible with sample parameters
+#ifdef USE_SHARED_MEM_BUFFER
+ newTrack = new AudioTrack(streamType, sampleRate, sample->format(),
+ channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData);
+#else
+ uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount;
+ newTrack = new AudioTrack(streamType, sampleRate, sample->format(),
+ channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData,
+ bufferFrames);
+#endif
+ oldTrack = mAudioTrack;
+ status = newTrack->initCheck();
+ if (status != NO_ERROR) {
+ ALOGE("Error creating AudioTrack");
+ goto exit;
}
+ ALOGV("setVolume %p", newTrack.get());
newTrack->setVolume(leftVolume, rightVolume);
newTrack->setLoop(0, frameCount, loop);
+
+ // From now on, AudioTrack callbacks received with previous toggle value will be ignored.
+ mToggle = toggle;
+ mAudioTrack = newTrack;
mPos = 0;
mSample = sample;
mChannelID = nextChannelID;
@@ -891,7 +875,6 @@ bool SoundChannel::doStop_l()
setVolume_l(0, 0);
ALOGV("stop");
mAudioTrack->stop();
- mPrevSampleID = mSample->sampleID();
mSample.clear();
mState = IDLE;
mPriority = IDLE_PRIORITY;
diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h
index f520406..9d9cbdf 100644
--- a/media/jni/soundpool/SoundPool.h
+++ b/media/jni/soundpool/SoundPool.h
@@ -136,7 +136,6 @@ public:
void nextEvent();
int nextChannelID() { return mNextEvent.channelID(); }
void dump();
- int getPrevSampleID(void) { return mPrevSampleID; }
private:
static void callback(int event, void* user, void *info);
@@ -153,7 +152,6 @@ private:
int mAudioBufferSize;
unsigned long mToggle;
bool mAutoPaused;
- int mPrevSampleID;
};
// application object for managing a pool of sounds
@@ -195,7 +193,7 @@ private:
sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); }
SoundChannel* findChannel (int channelID);
SoundChannel* findNextChannel (int channelID);
- SoundChannel* allocateChannel_l(int priority, int sampleID);
+ SoundChannel* allocateChannel_l(int priority);
void moveToFront_l(SoundChannel* channel);
void notify(SoundPoolEvent event);
void dump();