OSDN Git Service

Fix SoundPool playback of multichannel files.
authorAndy Hung <hunga@google.com>
Fri, 6 Mar 2015 23:00:42 +0000 (15:00 -0800)
committerAndy Hung <hunga@google.com>
Fri, 6 Mar 2015 23:00:42 +0000 (15:00 -0800)
Bug: 17188507
Change-Id: Ia4e43c7f8889181b998673b75b1f3bbf8c43f429

media/jni/soundpool/SoundPool.cpp
media/jni/soundpool/SoundPool.h

index dfe2844..10233f3 100644 (file)
@@ -638,7 +638,7 @@ status_t Sample::doLoad()
        goto error;
     }
 
-    if ((numChannels < 1) || (numChannels > 2)) {
+    if ((numChannels < 1) || (numChannels > 8)) {
         ALOGE("Sample channel count (%d) out of range", numChannels);
         status = BAD_VALUE;
         goto error;
@@ -702,8 +702,10 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV
         size_t frameCount = 0;
 
         if (loop) {
-            frameCount = sample->size()/numChannels/
-                ((sample->format() == AUDIO_FORMAT_PCM_16_BIT) ? sizeof(int16_t) : sizeof(uint8_t));
+            const audio_format_t format = sample->format();
+            const size_t frameSize = audio_is_linear_pcm(format)
+                    ? numChannels * audio_bytes_per_sample(format) : 1;
+            frameCount = sample->size() / frameSize;
         }
 
 #ifndef USE_SHARED_MEM_BUFFER
index f520406..4aacf53 100644 (file)
@@ -72,8 +72,8 @@ private:
     volatile int32_t    mRefCount;
     uint16_t            mSampleID;
     uint16_t            mSampleRate;
-    uint8_t             mState : 3;
-    uint8_t             mNumChannels : 2;
+    uint8_t             mState;
+    uint8_t             mNumChannels;
     audio_format_t      mFormat;
     int                 mFd;
     int64_t             mOffset;