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