summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2015-03-27 18:27:27 -0700
committerAndy Hung <hunga@google.com>2015-03-30 11:33:33 -0700
commit32ccb69fdeeeb236d9c5f2a4335b44d1d0c4b042 (patch)
tree563853cae12439f94bb5620268e232027817b6ab /media/jni
parentd640b7a6c7ac0998a9f55bdcfff6bf2960edb9bd (diff)
downloadframeworks_base-32ccb69fdeeeb236d9c5f2a4335b44d1d0c4b042.zip
frameworks_base-32ccb69fdeeeb236d9c5f2a4335b44d1d0c4b042.tar.gz
frameworks_base-32ccb69fdeeeb236d9c5f2a4335b44d1d0c4b042.tar.bz2
Fix SoundPool track recycling for fast tracks
Bug: 19970735 Change-Id: I075d04a688383139484f24ba4be2829c5220c57e
Diffstat (limited to 'media/jni')
-rw-r--r--media/jni/soundpool/SoundPool.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index 10233f3..25c6154 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -716,7 +716,15 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
}
#endif
- if (!mAudioTrack.get() || mPrevSampleID != sample->sampleID()) {
+ // check if the existing track has the same sample id.
+ if (mAudioTrack != 0 && mPrevSampleID == sample->sampleID()) {
+ // the sample rate may fail to change if the audio track is a fast track.
+ if (mAudioTrack->setSampleRate(sampleRate) == NO_ERROR) {
+ newTrack = mAudioTrack;
+ ALOGV("reusing track %p for sample %d", mAudioTrack.get(), sample->sampleID());
+ }
+ }
+ if (newTrack == 0) {
// 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
@@ -746,10 +754,6 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
mToggle = toggle;
mAudioTrack = newTrack;
ALOGV("using new track %p for sample %d", newTrack.get(), sample->sampleID());
- } else {
- newTrack = mAudioTrack;
- newTrack->setSampleRate(sampleRate);
- ALOGV("reusing track %p for sample %d", mAudioTrack.get(), sample->sampleID());
}
newTrack->setVolume(leftVolume, rightVolume);
newTrack->setLoop(0, frameCount, loop);