AudioMixer.h revision 1c48c3c61970527b97892ab6a2daae8eaac26964
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* //device/include/server/AudioFlinger/AudioMixer.h 265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Copyright 2007, The Android Open Source Project 465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** you may not use this file except in compliance with the License. 765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** You may obtain a copy of the License at 865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Unless required by applicable law or agreed to in writing, software 1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** See the License for the specific language governing permissions and 1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** limitations under the License. 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/ 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_AUDIO_MIXER_H 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_AUDIO_MIXER_H 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdint.h> 2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/types.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "AudioBufferProvider.h" 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "AudioResampler.h" 2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AudioMixer 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioMixer(size_t frameCount, uint32_t sampleRate); 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ~AudioMixer(); 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const uint32_t MAX_NUM_TRACKS = 32; 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const uint32_t MAX_NUM_CHANNELS = 2; 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const uint16_t UNITY_GAIN = 0x1000; 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { // names 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // track units (32 units) 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian TRACK0 = 0x1000, 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 531c48c3c61970527b97892ab6a2daae8eaac26964Glenn Kasten // 0x2000 is unused 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // setParameter targets 5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian TRACK = 0x3000, 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RESAMPLE = 0x3001, 5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RAMP_VOLUME = 0x3002, // ramp to new volume 5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian VOLUME = 0x3003, // don't ramp 6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // set Parameter names 6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // for target TRACK 630d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi CHANNEL_MASK = 0x4000, 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian FORMAT = 0x4001, 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian MAIN_BUFFER = 0x4002, 6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AUX_BUFFER = 0x4003, 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // for TARGET RESAMPLE 6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian SAMPLE_RATE = 0x4100, 69243f5f91755c01614a8cafe90b0806396e22d553Eric Laurent RESET = 0x4101, 7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // for TARGET VOLUME (8 channels max) 7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian VOLUME0 = 0x4200, 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian VOLUME1 = 0x4201, 7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AUXLEVEL = 0x4210, 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int getTrackName(); 7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void deleteTrackName(int name); 7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 801c48c3c61970527b97892ab6a2daae8eaac26964Glenn Kasten void enable(); 811c48c3c61970527b97892ab6a2daae8eaac26964Glenn Kasten void disable(); 8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t setActiveTrack(int track); 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t setParameter(int target, int name, void *value); 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian status_t setBufferProvider(AudioBufferProvider* bufferProvider); 8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void process(); 8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t trackNames() const { return mTrackNames; } 9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void ditherAndClamp(int32_t* out, int32_t const *sums, size_t c); 9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { 9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_CHANNEL_COUNT__MASK = 0x00000003, 9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_FORMAT__MASK = 0x000000F0, 9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_MUTE__MASK = 0x00000100, 9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_RESAMPLE__MASK = 0x00001000, 10065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_AUX__MASK = 0x00010000, 10165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 10265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { 10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_CHANNEL_1 = 0x00000000, 10565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_CHANNEL_2 = 0x00000001, 10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_FORMAT_16 = 0x00000010, 10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_MUTE_DISABLED = 0x00000000, 11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_MUTE_ENABLED = 0x00000100, 11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_RESAMPLE_DISABLED = 0x00000000, 11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_RESAMPLE_ENABLED = 0x00001000, 11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_AUX_DISABLED = 0x00000000, 11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian NEEDS_AUX_ENABLED = 0x00010000, 11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static inline int32_t applyVolume(int32_t in, int32_t v) { 12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return in * v; 12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian struct state_t; 12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian struct track_t; 12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian typedef void (*mix_t)(state_t* state); 12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian typedef void (*hook_t)(track_t* t, int32_t* output, size_t numOutFrames, int32_t* temp, int32_t* aux); 12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const int BLOCKSIZE = 16; // 4 cache lines 13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian struct track_t { 13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t needs; 13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian union { 13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int16_t volume[2]; // [0]3.12 fixed point 13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t volumeRL; 13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t prevVolume[2]; 14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t volumeInc[2]; 14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t auxLevel; 14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t auxInc; 14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t prevAuxLevel; 14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint16_t frameCount; 14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t channelCount : 4; 14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t enabled : 1; 15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t reserved0 : 3; 15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t format; 1520d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t channelMask; 15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioBufferProvider* bufferProvider; 15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mutable AudioBufferProvider::Buffer buffer; 15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian hook_t hook; 15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void const* in; // current location in buffer 15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioResampler* resampler; 16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t sampleRate; 16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t* mainBuffer; 16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t* auxBuffer; 16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); 16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool doesResample() const; 167243f5f91755c01614a8cafe90b0806396e22d553Eric Laurent void resetResampler(); 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void adjustVolumeRamp(bool aux); 16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // pad to 32-bytes to fill cache line 17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian struct state_t { 17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t enabledTracks; 17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t needsChanged; 17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian size_t frameCount; 17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mix_t hook; 17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t *outputTemp; 17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t *resampleTemp; 17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t reserved[2]; 18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian track_t tracks[32]; __attribute__((aligned(32))); 18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int mActiveTrack; 18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t mTrackNames; 18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const uint32_t mSampleRate; 18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian state_t mState __attribute__((aligned(32))); 18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void invalidateState(uint32_t mask); 19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void track__genericResample(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void track__nop(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void track__16BitsStereo(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void track__16BitsMono(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void volumeRampStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux); 19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux); 19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__validate(state_t* state); 19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__nop(state_t* state); 20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__genericNoResampling(state_t* state); 20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__genericResampling(state_t* state); 20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__OneTrack16BitsStereoNoResampling(state_t* state); 20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static void process__TwoTracks16BitsStereoNoResampling(state_t* state); 20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android 20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif // ANDROID_AUDIO_MIXER_H 210