AudioSystem.h revision 8af901cdea0af7e536579dee6d56e69987035a01
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (C) 2008 The Android Open Source Project
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * you may not use this file except in compliance with the License.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * You may obtain a copy of the License at
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See the License for the specific language governing permissions and
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * limitations under the License.
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef ANDROID_AUDIOSYSTEM_H_
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANDROID_AUDIOSYSTEM_H_
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utils/RefBase.h>
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utils/threads.h>
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <media/IAudioFlinger.h>
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <system/audio.h>
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <system/audio_policy.h>
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* XXX: Should be include by all the users instead */
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <media/AudioParameter.h>
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef void (*audio_error_callback)(status_t err);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IAudioPolicyService;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class String8;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AudioSystem
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /* These are static methods to control the system-wide AudioFlinger
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * only privileged processes can have access to them
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mute/unmute microphone
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t muteMicrophone(bool state);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t isMicrophoneMuted(bool *state);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // set/get master volume
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t setMasterVolume(float value);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getMasterVolume(float* volume);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mute/unmute audio outputs
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t setMasterMute(bool mute);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getMasterMute(bool* mute);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // set/get stream volume on specified output
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t setStreamVolume(audio_stream_type_t stream, float value,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    audio_io_handle_t output);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getStreamVolume(audio_stream_type_t stream, float* volume,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    audio_io_handle_t output);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mute/unmute stream
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t setStreamMute(audio_stream_type_t stream, bool mute);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getStreamMute(audio_stream_type_t stream, bool* mute);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // set audio mode in audio hardware
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t setMode(audio_mode_t mode);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // returns true in *state if tracks are active on the specified stream or has been active
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the past inPastMs milliseconds
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static status_t isStreamActive(audio_stream_type_t stream, bool *state, uint32_t inPastMs = 0);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // returns true in *state if a recorder is currently recording with the specified source
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t isSourceActive(audio_source_t source, bool *state);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // set/get audio hardware parameters. The function accepts a list of parameters
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // key value pairs in the form: key1=value1;key2=value2;...
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Some keys are reserved for standard parameters (See AudioParameter class).
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    static status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    static String8  getParameters(audio_io_handle_t ioHandle, const String8& keys);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static void setErrorCallback(audio_error_callback cb);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // helper function to obtain AudioFlinger service handle
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static const sp<IAudioFlinger>& get_audio_flinger();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static float linearToLog(int volume);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static int logToLinear(float volume);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getOutputSamplingRate(int* samplingRate,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getOutputFrameCount(int* frameCount,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getOutputLatency(uint32_t* latency,
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT);
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    static status_t getSamplingRate(audio_io_handle_t output,
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          audio_stream_type_t streamType,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          int* samplingRate);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // returns the number of frames per audio HAL write buffer. Corresponds to
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // audio_stream->get_buffer_size()/audio_stream_frame_size()
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getFrameCount(audio_io_handle_t output,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  audio_stream_type_t stream,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  int* frameCount);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // returns the audio output stream latency in ms. Corresponds to
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // audio_stream_out->get_latency()
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    static status_t getLatency(audio_io_handle_t output,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               audio_stream_type_t stream,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               uint32_t* latency);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DEPRECATED
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getOutputSamplingRate(int* samplingRate, int stream = AUDIO_STREAM_DEFAULT);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DEPRECATED
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static status_t getOutputFrameCount(int* frameCount, int stream = AUDIO_STREAM_DEFAULT);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static bool routedToA2dpOutput(audio_stream_type_t streamType);
117
118    static status_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
119        audio_channel_mask_t channelMask, size_t* buffSize);
120
121    static status_t setVoiceVolume(float volume);
122
123    // return the number of audio frames written by AudioFlinger to audio HAL and
124    // audio dsp to DAC since the output on which the specified stream is playing
125    // has exited standby.
126    // returned status (from utils/Errors.h) can be:
127    // - NO_ERROR: successful operation, halFrames and dspFrames point to valid data
128    // - INVALID_OPERATION: Not supported on current hardware platform
129    // - BAD_VALUE: invalid parameter
130    // NOTE: this feature is not supported on all hardware platforms and it is
131    // necessary to check returned status before using the returned values.
132    static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
133            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT);
134
135    // return the number of input frames lost by HAL implementation, or 0 if the handle is invalid
136    static unsigned int  getInputFramesLost(audio_io_handle_t ioHandle);
137
138    static int newAudioSessionId();
139    static void acquireAudioSessionId(int audioSession);
140    static void releaseAudioSessionId(int audioSession);
141
142    // types of io configuration change events received with ioConfigChanged()
143    enum io_config_event {
144        OUTPUT_OPENED,
145        OUTPUT_CLOSED,
146        OUTPUT_CONFIG_CHANGED,
147        INPUT_OPENED,
148        INPUT_CLOSED,
149        INPUT_CONFIG_CHANGED,
150        STREAM_CONFIG_CHANGED,
151        NUM_CONFIG_EVENTS
152    };
153
154    // audio output descriptor used to cache output configurations in client process to avoid
155    // frequent calls through IAudioFlinger
156    class OutputDescriptor {
157    public:
158        OutputDescriptor()
159        : samplingRate(0), format(AUDIO_FORMAT_DEFAULT), channels(0), frameCount(0), latency(0)  {}
160
161        uint32_t samplingRate;
162        int32_t format;
163        int32_t channels;
164        size_t frameCount;
165        uint32_t latency;
166    };
167
168    // Events used to synchronize actions between audio sessions.
169    // For instance SYNC_EVENT_PRESENTATION_COMPLETE can be used to delay recording start until
170    // playback is complete on another audio session.
171    // See definitions in MediaSyncEvent.java
172    enum sync_event_t {
173        SYNC_EVENT_SAME = -1,             // used internally to indicate restart with same event
174        SYNC_EVENT_NONE = 0,
175        SYNC_EVENT_PRESENTATION_COMPLETE,
176
177        //
178        // Define new events here: SYNC_EVENT_START, SYNC_EVENT_STOP, SYNC_EVENT_TIME ...
179        //
180        SYNC_EVENT_CNT,
181    };
182
183    // Timeout for synchronous record start. Prevents from blocking the record thread forever
184    // if the trigger event is not fired.
185    static const uint32_t kSyncRecordStartTimeOutMs = 30000;
186
187    //
188    // IAudioPolicyService interface (see AudioPolicyInterface for method descriptions)
189    //
190    static status_t setDeviceConnectionState(audio_devices_t device, audio_policy_dev_state_t state,
191                                                const char *device_address);
192    static audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
193                                                                const char *device_address);
194    static status_t setPhoneState(audio_mode_t state);
195    static status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
196    static audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
197    static audio_io_handle_t getOutput(audio_stream_type_t stream,
198                                        uint32_t samplingRate = 0,
199                                        audio_format_t format = AUDIO_FORMAT_DEFAULT,
200                                        audio_channel_mask_t channelMask = AUDIO_CHANNEL_OUT_STEREO,
201                                        audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE);
202    static status_t startOutput(audio_io_handle_t output,
203                                audio_stream_type_t stream,
204                                int session = 0);
205    static status_t stopOutput(audio_io_handle_t output,
206                               audio_stream_type_t stream,
207                               int session = 0);
208    static void releaseOutput(audio_io_handle_t output);
209    static audio_io_handle_t getInput(audio_source_t inputSource,
210                                    uint32_t samplingRate = 0,
211                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
212                                    audio_channel_mask_t channelMask = AUDIO_CHANNEL_IN_MONO,
213                                    int sessionId = 0);
214    static status_t startInput(audio_io_handle_t input);
215    static status_t stopInput(audio_io_handle_t input);
216    static void releaseInput(audio_io_handle_t input);
217    static status_t initStreamVolume(audio_stream_type_t stream,
218                                      int indexMin,
219                                      int indexMax);
220    static status_t setStreamVolumeIndex(audio_stream_type_t stream,
221                                         int index,
222                                         audio_devices_t device);
223    static status_t getStreamVolumeIndex(audio_stream_type_t stream,
224                                         int *index,
225                                         audio_devices_t device);
226
227    static uint32_t getStrategyForStream(audio_stream_type_t stream);
228    static audio_devices_t getDevicesForStream(audio_stream_type_t stream);
229
230    static audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc);
231    static status_t registerEffect(const effect_descriptor_t *desc,
232                                    audio_io_handle_t io,
233                                    uint32_t strategy,
234                                    int session,
235                                    int id);
236    static status_t unregisterEffect(int id);
237    static status_t setEffectEnabled(int id, bool enabled);
238
239    // clear stream to output mapping cache (gStreamOutputMap)
240    // and output configuration cache (gOutputs)
241    static void clearAudioConfigCache();
242
243    static const sp<IAudioPolicyService>& get_audio_policy_service();
244
245    // helpers for android.media.AudioManager.getProperty(), see description there for meaning
246    static int32_t getPrimaryOutputSamplingRate();
247    static int32_t getPrimaryOutputFrameCount();
248
249    // ----------------------------------------------------------------------------
250
251private:
252
253    class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient
254    {
255    public:
256        AudioFlingerClient() {
257        }
258
259        // DeathRecipient
260        virtual void binderDied(const wp<IBinder>& who);
261
262        // IAudioFlingerClient
263
264        // indicate a change in the configuration of an output or input: keeps the cached
265        // values for output/input parameters up-to-date in client process
266        virtual void ioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2);
267    };
268
269    class AudioPolicyServiceClient: public IBinder::DeathRecipient
270    {
271    public:
272        AudioPolicyServiceClient() {
273        }
274
275        // DeathRecipient
276        virtual void binderDied(const wp<IBinder>& who);
277    };
278
279    static sp<AudioFlingerClient> gAudioFlingerClient;
280    static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient;
281    friend class AudioFlingerClient;
282    friend class AudioPolicyServiceClient;
283
284    static Mutex gLock;
285    static sp<IAudioFlinger> gAudioFlinger;
286    static audio_error_callback gAudioErrorCallback;
287
288    static size_t gInBuffSize;
289    // previous parameters for recording buffer size queries
290    static uint32_t gPrevInSamplingRate;
291    static audio_format_t gPrevInFormat;
292    static audio_channel_mask_t gPrevInChannelMask;
293
294    static sp<IAudioPolicyService> gAudioPolicyService;
295
296    // mapping between stream types and outputs
297    static DefaultKeyedVector<audio_stream_type_t, audio_io_handle_t> gStreamOutputMap;
298    // list of output descriptors containing cached parameters
299    // (sampling rate, framecount, channel count...)
300    static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs;
301};
302
303};  // namespace android
304
305#endif  /*ANDROID_AUDIOSYSTEM_H_*/
306