| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_RECORD_BUFFER_CONVERTER_H |
| #define ANDROID_RECORD_BUFFER_CONVERTER_H |
| |
| #include <stdint.h> |
| #include <sys/types.h> |
| |
| #include <media/AudioBufferProvider.h> |
| #include <system/audio.h> |
| |
| class AudioResampler; |
| class PassthruBufferProvider; |
| |
| namespace android { |
| |
| /* The RecordBufferConverter is used for format, channel, and sample rate |
| * conversion for a RecordTrack. |
| * |
| * RecordBufferConverter uses the convert() method rather than exposing a |
| * buffer provider interface; this is to save a memory copy. |
| * |
| * There are legacy conversion requirements for this converter, specifically |
| * due to mono handling, so be careful about modifying. |
| * |
| * Original source audioflinger/Threads.{h,cpp} |
| */ |
| class RecordBufferConverter |
| { |
| public: |
| RecordBufferConverter( |
| audio_channel_mask_t srcChannelMask, audio_format_t srcFormat, |
| uint32_t srcSampleRate, |
| audio_channel_mask_t dstChannelMask, audio_format_t dstFormat, |
| uint32_t dstSampleRate); |
| |
| ~RecordBufferConverter(); |
| |
| /* Converts input data from an AudioBufferProvider by format, channelMask, |
| * and sampleRate to a destination buffer. |
| * |
| * Parameters |
| * dst: buffer to place the converted data. |
| * provider: buffer provider to obtain source data. |
| * frames: number of frames to convert |
| * |
| * Returns the number of frames converted. |
| */ |
| size_t convert(void *dst, AudioBufferProvider *provider, size_t frames); |
| |
| // returns NO_ERROR if constructor was successful |
| status_t initCheck() const { |
| // mSrcChannelMask set on successful updateParameters |
| return mSrcChannelMask != AUDIO_CHANNEL_INVALID ? NO_ERROR : NO_INIT; |
| } |
| |
| // allows dynamic reconfigure of all parameters |
| status_t updateParameters( |
| audio_channel_mask_t srcChannelMask, audio_format_t srcFormat, |
| uint32_t srcSampleRate, |
| audio_channel_mask_t dstChannelMask, audio_format_t dstFormat, |
| uint32_t dstSampleRate); |
| |
| // called to reset resampler buffers on record track discontinuity |
| void reset(); |
| |
| private: |
| // format conversion when not using resampler |
| void convertNoResampler(void *dst, const void *src, size_t frames); |
| |
| // format conversion when using resampler; modifies src in-place |
| void convertResampler(void *dst, /*not-a-const*/ void *src, size_t frames); |
| |
| // user provided information |
| audio_channel_mask_t mSrcChannelMask; |
| audio_format_t mSrcFormat; |
| uint32_t mSrcSampleRate; |
| audio_channel_mask_t mDstChannelMask; |
| audio_format_t mDstFormat; |
| uint32_t mDstSampleRate; |
| |
| // derived information |
| uint32_t mSrcChannelCount; |
| uint32_t mDstChannelCount; |
| size_t mDstFrameSize; |
| |
| // format conversion buffer |
| void *mBuf; |
| size_t mBufFrames; |
| size_t mBufFrameSize; |
| |
| // resampler info |
| AudioResampler *mResampler; |
| |
| bool mIsLegacyDownmix; // legacy stereo to mono conversion needed |
| bool mIsLegacyUpmix; // legacy mono to stereo conversion needed |
| bool mRequiresFloat; // data processing requires float (e.g. resampler) |
| PassthruBufferProvider *mInputConverterProvider; // converts input to float |
| int8_t mIdxAry[sizeof(uint32_t) * 8]; // used for channel mask conversion |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| } // namespace android |
| |
| #endif // ANDROID_RECORD_BUFFER_CONVERTER_H |