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