blob: 2abc45ebc084920d51acc6d50b7b2f1f7218393a [file] [log] [blame]
/*
* 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