1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2017 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef ANDROID_RECORD_BUFFER_CONVERTER_H 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define ANDROID_RECORD_BUFFER_CONVERTER_H 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <stdint.h> 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <sys/types.h> 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioBufferProvider.h> 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <system/audio.h> 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass AudioResampler; 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass PassthruBufferProvider; 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android { 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* The RecordBufferConverter is used for format, channel, and sample rate 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * conversion for a RecordTrack. 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * RecordBufferConverter uses the convert() method rather than exposing a 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * buffer provider interface; this is to save a memory copy. 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * There are legacy conversion requirements for this converter, specifically 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * due to mono handling, so be careful about modifying. 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Original source audioflinger/Threads.{h,cpp} 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass RecordBufferConverter 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman RecordBufferConverter( 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t srcChannelMask, audio_format_t srcFormat, 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t srcSampleRate, 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t dstChannelMask, audio_format_t dstFormat, 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t dstSampleRate); 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ~RecordBufferConverter(); 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Converts input data from an AudioBufferProvider by format, channelMask, 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * and sampleRate to a destination buffer. 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Parameters 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * dst: buffer to place the converted data. 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * provider: buffer provider to obtain source data. 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * frames: number of frames to convert 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Returns the number of frames converted. 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman size_t convert(void *dst, AudioBufferProvider *provider, size_t frames); 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // returns NO_ERROR if constructor was successful 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman status_t initCheck() const { 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // mSrcChannelMask set on successful updateParameters 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return mSrcChannelMask != AUDIO_CHANNEL_INVALID ? NO_ERROR : NO_INIT; 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // allows dynamic reconfigure of all parameters 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman status_t updateParameters( 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t srcChannelMask, audio_format_t srcFormat, 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t srcSampleRate, 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t dstChannelMask, audio_format_t dstFormat, 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t dstSampleRate); 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // called to reset resampler buffers on record track discontinuity 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void reset(); 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // format conversion when not using resampler 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void convertNoResampler(void *dst, const void *src, size_t frames); 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // format conversion when using resampler; modifies src in-place 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void convertResampler(void *dst, /*not-a-const*/ void *src, size_t frames); 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // user provided information 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t mSrcChannelMask; 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_format_t mSrcFormat; 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t mSrcSampleRate; 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_channel_mask_t mDstChannelMask; 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_format_t mDstFormat; 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t mDstSampleRate; 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // derived information 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t mSrcChannelCount; 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t mDstChannelCount; 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman size_t mDstFrameSize; 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // format conversion buffer 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void *mBuf; 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman size_t mBufFrames; 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman size_t mBufFrameSize; 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // resampler info 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman AudioResampler *mResampler; 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool mIsLegacyDownmix; // legacy stereo to mono conversion needed 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool mIsLegacyUpmix; // legacy mono to stereo conversion needed 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool mRequiresFloat; // data processing requires float (e.g. resampler) 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman PassthruBufferProvider *mInputConverterProvider; // converts input to float 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int8_t mIdxAry[sizeof(uint32_t) * 8]; // used for channel mask conversion 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// ---------------------------------------------------------------------------- 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // ANDROID_RECORD_BUFFER_CONVERTER_H 120