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