19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/include/server/AudioFlinger/AudioMixer.h 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIO_MIXER_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_MIXER_H 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioResampler.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioMixer(size_t frameCount, uint32_t sampleRate); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AudioMixer(); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const uint32_t MAX_NUM_TRACKS = 32; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const uint32_t MAX_NUM_CHANNELS = 2; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const uint16_t UNITY_GAIN = 0x1000; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { // names 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // track units (32 units) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRACK0 = 0x1000, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enable/disable 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MIXING = 0x2000, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // setParameter targets 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRACK = 0x3000, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESAMPLE = 0x3001, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RAMP_VOLUME = 0x3002, // ramp to new volume 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VOLUME = 0x3003, // don't ramp 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set Parameter names 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for target TRACK 645439223b5633679edcc255651e7062046004d75dJean-Michel Trivi CHANNEL_MASK = 0x4000, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FORMAT = 0x4001, 6665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent MAIN_BUFFER = 0x4002, 6765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent AUX_BUFFER = 0x4003, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for TARGET RESAMPLE 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SAMPLE_RATE = 0x4100, 704bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent RESET = 0x4101, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for TARGET VOLUME (8 channels max) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VOLUME0 = 0x4200, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VOLUME1 = 0x4201, 7465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent AUXLEVEL = 0x4210, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getTrackName(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void deleteTrackName(int name); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t enable(int name); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t disable(int name); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setActiveTrack(int track); 8565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t setParameter(int target, int name, void *value); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setBufferProvider(AudioBufferProvider* bufferProvider); 8865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void process(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t trackNames() const { return mTrackNames; } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 92a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent static void ditherAndClamp(int32_t* out, int32_t const *sums, size_t c); 93a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_CHANNEL_COUNT__MASK = 0x00000003, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_FORMAT__MASK = 0x000000F0, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_MUTE__MASK = 0x00000100, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_RESAMPLE__MASK = 0x00001000, 10165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent NEEDS_AUX__MASK = 0x00010000, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_CHANNEL_1 = 0x00000000, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_CHANNEL_2 = 0x00000001, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_FORMAT_16 = 0x00000010, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_MUTE_DISABLED = 0x00000000, 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_MUTE_ENABLED = 0x00000100, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_RESAMPLE_DISABLED = 0x00000000, 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEEDS_RESAMPLE_ENABLED = 0x00001000, 11565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 11665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent NEEDS_AUX_DISABLED = 0x00000000, 11765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent NEEDS_AUX_ENABLED = 0x00010000, 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static inline int32_t applyVolume(int32_t in, int32_t v) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return in * v; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct state_t; 12665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent struct track_t; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent typedef void (*mix_t)(state_t* state); 12965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent typedef void (*hook_t)(track_t* t, int32_t* output, size_t numOutFrames, int32_t* temp, int32_t* aux); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const int BLOCKSIZE = 16; // 4 cache lines 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct track_t { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t needs; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project union { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t volume[2]; // [0]3.12 fixed point 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t volumeRL; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t prevVolume[2]; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t volumeInc[2]; 14365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t auxLevel; 14465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t auxInc; 14565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t prevAuxLevel; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t frameCount; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t channelCount : 4; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t enabled : 1; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t reserved0 : 3; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t format; 1535439223b5633679edcc255651e7062046004d75dJean-Michel Trivi uint32_t channelMask; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* bufferProvider; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable AudioBufferProvider::Buffer buffer; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent hook_t hook; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void const* in; // current location in buffer 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler* resampler; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate; 16365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t* mainBuffer; 16465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t* auxBuffer; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool doesResample() const; 1684bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent void resetResampler(); 16965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void adjustVolumeRamp(bool aux); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pad to 32-bytes to fill cache line 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct state_t { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t enabledTracks; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t needsChanged; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t frameCount; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mix_t hook; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *outputTemp; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *resampleTemp; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t reserved[2]; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track_t tracks[32]; __attribute__((aligned(32))); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mActiveTrack; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mTrackNames; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t mSampleRate; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state_t mState __attribute__((aligned(32))); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void invalidateState(uint32_t mask); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void track__genericResample(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void track__nop(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void track__16BitsStereo(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void track__16BitsMono(track_t* t, int32_t* out, size_t numFrames, int32_t* temp, int32_t* aux); 19665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void volumeRampStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux); 19765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux); 19865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 19965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__validate(state_t* state); 20065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__nop(state_t* state); 20165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__genericNoResampling(state_t* state); 20265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__genericResampling(state_t* state); 20365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__OneTrack16BitsStereoNoResampling(state_t* state); 20465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent static void process__TwoTracks16BitsStereoNoResampling(state_t* state); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_MIXER_H 211