Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2011 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 #define LOG_NDEBUG 1
     18 #include <utils/Log.h>
     19 #include "AudioMixer.h"
     20 #include "VideoEditorResampler.h"
     21 
     22 namespace android {
     23 
     24 struct VideoEditorResampler : public AudioBufferProvider {
     25 
     26     public:
     27 
     28         virtual status_t getNextBuffer(Buffer* buffer);
     29         virtual void releaseBuffer(Buffer* buffer);
     30 
     31     enum { //Sampling freq
     32      kFreq8000Hz = 8000,
     33      kFreq11025Hz = 11025,
     34      kFreq12000Hz = 12000,
     35      kFreq16000Hz = 16000,
     36      kFreq22050Hz = 22050,
     37      kFreq240000Hz = 24000,
     38      kFreq32000Hz = 32000,
     39      kFreq44100 = 44100,
     40      kFreq48000 = 48000,
     41     };
     42 
     43     AudioResampler *mResampler;
     44     int16_t* mInput;
     45     int nbChannels;
     46     int nbSamples;
     47     M4OSA_Int32 outSamplingRate;
     48     M4OSA_Int32 inSamplingRate;
     49 
     50     int16_t *mTmpInBuffer;
     51 };
     52 
     53 #define MAX_SAMPLEDURATION_FOR_CONVERTION 40 //ms
     54 
     55 status_t VideoEditorResampler::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) {
     56 
     57     uint32_t dataSize = pBuffer->frameCount * this->nbChannels * sizeof(int16_t);
     58     mTmpInBuffer = (int16_t*)malloc(dataSize);
     59     memcpy(mTmpInBuffer, this->mInput, dataSize);
     60     pBuffer->raw = (void*)mTmpInBuffer;
     61 
     62     return OK;
     63 }
     64 
     65 void VideoEditorResampler::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
     66 
     67     if(pBuffer->raw != NULL) {
     68         free(pBuffer->raw);
     69         pBuffer->raw = NULL;
     70         mTmpInBuffer = NULL;
     71     }
     72     pBuffer->frameCount = 0;
     73 }
     74 
     75 extern "C" {
     76 
     77 M4OSA_Context  LVAudioResamplerCreate(M4OSA_Int32 bitDepth, M4OSA_Int32 inChannelCount,
     78                                      M4OSA_Int32 sampleRate, M4OSA_Int32 quality) {
     79 
     80     VideoEditorResampler *context = new VideoEditorResampler();
     81     context->mResampler = AudioResampler::create(
     82         bitDepth, inChannelCount, sampleRate, AudioResampler::DEFAULT);
     83     if (context->mResampler == NULL) {
     84         return NULL;
     85     }
     86     context->mResampler->setSampleRate(android::VideoEditorResampler::kFreq32000Hz);
     87     context->mResampler->setVolume(0x1000, 0x1000);
     88     context->nbChannels = inChannelCount;
     89     context->outSamplingRate = sampleRate;
     90     context->mInput = NULL;
     91     context->mTmpInBuffer = NULL;
     92 
     93     return ((M4OSA_Context )context);
     94 }
     95 
     96 
     97 void LVAudiosetSampleRate(M4OSA_Context resamplerContext, M4OSA_Int32 inSampleRate) {
     98 
     99     VideoEditorResampler *context =
    100       (VideoEditorResampler *)resamplerContext;
    101     context->mResampler->setSampleRate(inSampleRate);
    102     /*
    103      * nbSamples is calculated for 40ms worth of data;hence sample rate
    104      * is used to calculate the nbSamples
    105      */
    106     context->inSamplingRate = inSampleRate;
    107     // Allocate buffer for maximum allowed number of samples.
    108     context->mInput = (int16_t*)malloc( (inSampleRate * MAX_SAMPLEDURATION_FOR_CONVERTION *
    109                                    context->nbChannels * sizeof(int16_t)) / 1000);
    110 }
    111 
    112 void LVAudiosetVolume(M4OSA_Context resamplerContext, M4OSA_Int16 left, M4OSA_Int16 right) {
    113 
    114     VideoEditorResampler *context =
    115        (VideoEditorResampler *)resamplerContext;
    116     context->mResampler->setVolume(left,right);
    117 }
    118 
    119 void LVDestroy(M4OSA_Context resamplerContext) {
    120 
    121     VideoEditorResampler *context =
    122        (VideoEditorResampler *)resamplerContext;
    123 
    124     if (context->mTmpInBuffer != NULL) {
    125         free(context->mTmpInBuffer);
    126         context->mTmpInBuffer = NULL;
    127     }
    128 
    129     if (context->mInput != NULL) {
    130         free(context->mInput);
    131         context->mInput = NULL;
    132     }
    133 
    134     if (context->mResampler != NULL) {
    135         delete context->mResampler;
    136         context->mResampler = NULL;
    137     }
    138 
    139     if (context != NULL) {
    140         delete context;
    141         context = NULL;
    142     }
    143 }
    144 
    145 void LVAudioresample_LowQuality(M4OSA_Int16* out, M4OSA_Int16* input,
    146                                      M4OSA_Int32 outFrameCount, M4OSA_Context resamplerContext) {
    147 
    148     VideoEditorResampler *context =
    149       (VideoEditorResampler *)resamplerContext;
    150     int32_t *pTmpBuffer = NULL;
    151 
    152     context->nbSamples = (context->inSamplingRate * outFrameCount) / context->outSamplingRate;
    153     memcpy(context->mInput,input,(context->nbSamples * context->nbChannels * sizeof(int16_t)));
    154 
    155     /*
    156      SRC module always gives stereo output, hence 2 for stereo audio
    157     */
    158     pTmpBuffer = (int32_t*)malloc(outFrameCount * 2 * sizeof(int32_t));
    159     memset(pTmpBuffer, 0x00, outFrameCount * 2 * sizeof(int32_t));
    160 
    161     context->mResampler->resample((int32_t *)pTmpBuffer,
    162        (size_t)outFrameCount, (VideoEditorResampler *)resamplerContext);
    163     // Convert back to 16 bits
    164     AudioMixer::ditherAndClamp((int32_t*)out, pTmpBuffer, outFrameCount);
    165     free(pTmpBuffer);
    166     pTmpBuffer = NULL;
    167 }
    168 
    169 }
    170 
    171 } //namespace android
    172