1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <string.h> 18 19 #include "wav/WavStreamReader.h" 20 21 #include "OneShotSampleSource.h" 22 23 namespace iolib { 24 mixAudio(float * outBuff,int numChannels,int32_t numFrames)25void OneShotSampleSource::mixAudio(float* outBuff, int numChannels, int32_t numFrames) { 26 int32_t numSampleFrames = mSampleBuffer->getNumSampleFrames(); 27 int32_t numWriteFrames = mIsPlaying 28 ? std::min(numFrames, numSampleFrames - mCurFrameIndex) 29 : 0; 30 31 if (numWriteFrames != 0) { 32 // Mix in the samples 33 34 // investigate unrolling these loops... 35 const float* data = mSampleBuffer->getSampleData(); 36 if (numChannels == 1) { 37 // MONO output 38 for (int32_t frameIndex = 0; frameIndex < numWriteFrames; frameIndex++) { 39 outBuff[frameIndex] += data[mCurFrameIndex++] * mGain; 40 } 41 } else if (numChannels == 2) { 42 // STEREO output 43 int dstSampleIndex = 0; 44 for (int32_t frameIndex = 0; frameIndex < numWriteFrames; frameIndex++) { 45 outBuff[dstSampleIndex++] += data[mCurFrameIndex] * mLeftGain; 46 outBuff[dstSampleIndex++] += data[mCurFrameIndex++] * mRightGain; 47 } 48 } 49 50 if (mCurFrameIndex >= numSampleFrames) { 51 mIsPlaying = false; 52 } 53 } 54 55 // silence 56 // no need as the output buffer would need to have been filled with silence 57 // to be mixed into 58 } 59 60 } // namespace wavlib 61