AudioSystem.h revision 89fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_AUDIOSYSTEM_H_
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_AUDIOSYSTEM_H_
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/threads.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projecttypedef void (*audio_error_callback)(status_t err);
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass AudioSystem
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum stream_type {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        DEFAULT         =-1,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        VOICE_CALL      = 0,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        SYSTEM          = 1,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        RING            = 2,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MUSIC           = 3,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ALARM           = 4,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NOTIFICATION    = 5,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        BLUETOOTH_SCO   = 6,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NUM_STREAM_TYPES
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum audio_output_type {
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AUDIO_OUTPUT_DEFAULT      =-1,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AUDIO_OUTPUT_HARDWARE     = 0,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AUDIO_OUTPUT_A2DP         = 1,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NUM_AUDIO_OUTPUT_TYPES
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum audio_format {
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        FORMAT_DEFAULT = 0,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        PCM_16_BIT,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        PCM_8_BIT,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        INVALID_FORMAT
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum audio_mode {
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MODE_INVALID = -2,
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MODE_CURRENT = -1,
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MODE_NORMAL = 0,
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MODE_RINGTONE,
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        MODE_IN_CALL,
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NUM_MODES  // not a valid entry, denotes end-of-list
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum audio_routes {
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_EARPIECE       = (1 << 0),
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_SPEAKER        = (1 << 1),
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_BLUETOOTH_SCO  = (1 << 2),
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_HEADSET        = (1 << 3),
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_BLUETOOTH_A2DP = (1 << 4),
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ROUTE_ALL            = -1UL,
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum audio_in_acoustics {
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AGC_ENABLE    = 0x0001,
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AGC_DISABLE   = 0,
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NS_ENABLE     = 0x0002,
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        NS_DISABLE    = 0,
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TX_IIR_ENABLE = 0x0004,
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TX_DISABLE    = 0
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* These are static methods to control the system-wide AudioFlinger
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * only privileged processes can have access to them
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // routing helper functions
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t speakerphone(bool state);
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t isSpeakerphoneOn(bool* state);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t bluetoothSco(bool state);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t isBluetoothScoOn(bool* state);
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t muteMicrophone(bool state);
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t isMicrophoneMuted(bool *state);
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setMasterVolume(float value);
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setMasterMute(bool mute);
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getMasterVolume(float* volume);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getMasterMute(bool* mute);
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setStreamVolume(int stream, float value);
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setStreamMute(int stream, bool mute);
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getStreamVolume(int stream, float* volume);
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getStreamMute(int stream, bool* mute);
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setMode(int mode);
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getMode(int* mode);
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setRouting(int mode, uint32_t routes, uint32_t mask);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getRouting(int mode, uint32_t* routes);
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t isMusicActive(bool *state);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Temporary interface, do not use
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // TODO: Replace with a more generic key:value get/set mechanism
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t setParameter(const char* key, const char* value);
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static void setErrorCallback(audio_error_callback cb);
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // helper function to obtain AudioFlinger service handle
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static const sp<IAudioFlinger>& get_audio_flinger();
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static float linearToLog(int volume);
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int logToLinear(float volume);
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getOutputSamplingRate(int* samplingRate, int stream = DEFAULT);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getOutputFrameCount(int* frameCount, int stream = DEFAULT);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getOutputLatency(uint32_t* latency, int stream = DEFAULT);
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static bool routedToA2dpOutput(int streamType);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static status_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount,
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        size_t* buffSize);
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // ----------------------------------------------------------------------------
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public:
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        AudioFlingerClient() {
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // DeathRecipient
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void binderDied(const wp<IBinder>& who);
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // IAudioFlingerClient
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void a2dpEnabledChanged(bool enabled);
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int getOutput(int streamType);
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static sp<AudioFlingerClient> gAudioFlingerClient;
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    friend class AudioFlingerClient;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static Mutex gLock;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static sp<IAudioFlinger> gAudioFlinger;
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static audio_error_callback gAudioErrorCallback;
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int gOutSamplingRate[NUM_AUDIO_OUTPUT_TYPES];
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int gOutFrameCount[NUM_AUDIO_OUTPUT_TYPES];
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static uint32_t gOutLatency[NUM_AUDIO_OUTPUT_TYPES];
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static bool gA2dpEnabled;
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static size_t gInBuffSize;
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // previous parameters for recording buffer size queries
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static uint32_t gPrevInSamplingRate;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int gPrevInFormat;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static int gPrevInChannelCount;
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};  // namespace android
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif  /*ANDROID_AUDIOSYSTEM_H_*/
178