Home | History | Annotate | Download | only in media
      1 /*
      2  * Copyright (C) 2017 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 #ifndef ANDROID_RECORD_BUFFER_CONVERTER_H
     18 #define ANDROID_RECORD_BUFFER_CONVERTER_H
     19 
     20 #include <stdint.h>
     21 #include <sys/types.h>
     22 
     23 #include <media/AudioBufferProvider.h>
     24 #include <system/audio.h>
     25 
     26 class AudioResampler;
     27 class PassthruBufferProvider;
     28 
     29 namespace android {
     30 
     31 /* The RecordBufferConverter is used for format, channel, and sample rate
     32  * conversion for a RecordTrack.
     33  *
     34  * RecordBufferConverter uses the convert() method rather than exposing a
     35  * buffer provider interface; this is to save a memory copy.
     36  *
     37  * There are legacy conversion requirements for this converter, specifically
     38  * due to mono handling, so be careful about modifying.
     39  *
     40  * Original source audioflinger/Threads.{h,cpp}
     41  */
     42 class RecordBufferConverter
     43 {
     44 public:
     45     RecordBufferConverter(
     46             audio_channel_mask_t srcChannelMask, audio_format_t srcFormat,
     47             uint32_t srcSampleRate,
     48             audio_channel_mask_t dstChannelMask, audio_format_t dstFormat,
     49             uint32_t dstSampleRate);
     50 
     51     ~RecordBufferConverter();
     52 
     53     /* Converts input data from an AudioBufferProvider by format, channelMask,
     54      * and sampleRate to a destination buffer.
     55      *
     56      * Parameters
     57      *      dst:  buffer to place the converted data.
     58      * provider:  buffer provider to obtain source data.
     59      *   frames:  number of frames to convert
     60      *
     61      * Returns the number of frames converted.
     62      */
     63     size_t convert(void *dst, AudioBufferProvider *provider, size_t frames);
     64 
     65     // returns NO_ERROR if constructor was successful
     66     status_t initCheck() const {
     67         // mSrcChannelMask set on successful updateParameters
     68         return mSrcChannelMask != AUDIO_CHANNEL_INVALID ? NO_ERROR : NO_INIT;
     69     }
     70 
     71     // allows dynamic reconfigure of all parameters
     72     status_t updateParameters(
     73             audio_channel_mask_t srcChannelMask, audio_format_t srcFormat,
     74             uint32_t srcSampleRate,
     75             audio_channel_mask_t dstChannelMask, audio_format_t dstFormat,
     76             uint32_t dstSampleRate);
     77 
     78     // called to reset resampler buffers on record track discontinuity
     79     void reset();
     80 
     81 private:
     82     // format conversion when not using resampler
     83     void convertNoResampler(void *dst, const void *src, size_t frames);
     84 
     85     // format conversion when using resampler; modifies src in-place
     86     void convertResampler(void *dst, /*not-a-const*/ void *src, size_t frames);
     87 
     88     // user provided information
     89     audio_channel_mask_t mSrcChannelMask;
     90     audio_format_t       mSrcFormat;
     91     uint32_t             mSrcSampleRate;
     92     audio_channel_mask_t mDstChannelMask;
     93     audio_format_t       mDstFormat;
     94     uint32_t             mDstSampleRate;
     95 
     96     // derived information
     97     uint32_t             mSrcChannelCount;
     98     uint32_t             mDstChannelCount;
     99     size_t               mDstFrameSize;
    100 
    101     // format conversion buffer
    102     void                *mBuf;
    103     size_t               mBufFrames;
    104     size_t               mBufFrameSize;
    105 
    106     // resampler info
    107     AudioResampler      *mResampler;
    108 
    109     bool                 mIsLegacyDownmix;  // legacy stereo to mono conversion needed
    110     bool                 mIsLegacyUpmix;    // legacy mono to stereo conversion needed
    111     bool                 mRequiresFloat;    // data processing requires float (e.g. resampler)
    112     PassthruBufferProvider *mInputConverterProvider;    // converts input to float
    113     int8_t               mIdxAry[sizeof(uint32_t) * 8]; // used for channel mask conversion
    114 };
    115 
    116 // ----------------------------------------------------------------------------
    117 } // namespace android
    118 
    119 #endif // ANDROID_RECORD_BUFFER_CONVERTER_H
    120