AudioPolicyService.h revision f78aee70d15daf4690de7e7b4983ee68b0d1381d
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2009 The Android Open Source Project
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License.
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License.
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_AUDIOPOLICYSERVICE_H
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_AUDIOPOLICYSERVICE_H
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
207c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <cutils/misc.h>
217c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <cutils/config_utils.h>
22d1d8f23dde239289ba8c0de0944baaca3586c880Glenn Kasten#include <utils/String8.h>
2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Vector.h>
247c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <utils/SortedVector.h>
25d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten#include <binder/BinderService.h>
2664760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
277394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin#include <system/audio_policy.h>
28fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin#include <hardware/audio_policy.h>
297c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/IAudioPolicyService.h>
307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/ToneGenerator.h>
317c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <media/AudioEffect.h>
32fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ----------------------------------------------------------------------------
3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
37d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kastenclass AudioPolicyService :
38d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten    public BinderService<AudioPolicyService>,
39d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten    public BnAudioPolicyService,
40fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin//    public AudioPolicyClientInterface,
41de070137f11d346fba77605bd76a44c040a618fcEric Laurent    public IBinder::DeathRecipient
4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
43d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten    friend class BinderService<AudioPolicyService>;
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
46d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten    // for BinderService
47d2dcb08808aed82218b258726fa66f8e095a3f9cGlenn Kasten    static const char *getServiceName() { return "media.audio_policy"; }
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    dump(int fd, const Vector<String16>& args);
5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // BnAudioPolicyService (see AudioPolicyInterface for method descriptions)
5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
55fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setDeviceConnectionState(audio_devices_t device,
56fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                              audio_policy_dev_state_t state,
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                              const char *device_address);
58fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
59fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                                                audio_devices_t device,
60de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                const char *device_address);
61f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state);
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t setRingerMode(uint32_t mode, uint32_t mask);
63fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
64fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
65fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_io_handle_t getOutput(audio_stream_type_t stream,
6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                        uint32_t samplingRate = 0,
67fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        uint32_t format = AUDIO_FORMAT_DEFAULT,
6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                        uint32_t channels = 0,
69fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_policy_output_flags_t flags =
70fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                            AUDIO_POLICY_OUTPUT_FLAG_INDIRECT);
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
72fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
73de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                 int session = 0);
74de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
75fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
76de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                int session = 0);
7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void releaseOutput(audio_io_handle_t output);
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual audio_io_handle_t getInput(int inputSource,
7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                    uint32_t samplingRate = 0,
80fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    uint32_t format = AUDIO_FORMAT_DEFAULT,
8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                    uint32_t channels = 0,
82fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_in_acoustics_t acoustics =
837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                            (audio_in_acoustics_t)0,
847c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                    int audioSession = 0);
8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t startInput(audio_io_handle_t input);
8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t stopInput(audio_io_handle_t input);
8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void releaseInput(audio_io_handle_t input);
88fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      int indexMin,
9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      int indexMax);
91fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, int index);
92fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, int *index);
9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
94fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
95fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getDevicesForStream(audio_stream_type_t stream);
96de070137f11d346fba77605bd76a44c040a618fcEric Laurent
97de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc);
98de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t registerEffect(effect_descriptor_t *desc,
997c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                    audio_io_handle_t io,
100de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    uint32_t strategy,
101de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    int session,
102de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    int id);
103de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id);
104db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled);
105eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    virtual bool isStreamActive(int stream, uint32_t inPastMs = 0) const;
106de070137f11d346fba77605bd76a44c040a618fcEric Laurent
10757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
10857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                              effect_descriptor_t *descriptors,
10957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                              uint32_t *count);
11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual     status_t    onTransact(
11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                uint32_t code,
11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                const Parcel& data,
11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                Parcel* reply,
11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                uint32_t flags);
11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // IBinder::DeathRecipient
11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual     void        binderDied(const wp<IBinder>& who);
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
120fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // Helpers for the struct audio_policy_service_ops implementation.
121fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // This is used by the audio policy manager for certain operations that
122fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // are implemented by the policy service.
12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
124fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual void setParameters(audio_io_handle_t ioHandle,
125fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                               const char *keyValuePairs,
126fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                               int delayMs);
127fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setStreamVolume(audio_stream_type_t stream,
129de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     float volume,
130de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     audio_io_handle_t output,
131de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     int delayMs = 0);
132fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream);
13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t stopTone();
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t setVoiceVolume(float volume, int delayMs = 0);
13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                        AudioPolicyService();
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual             ~AudioPolicyService();
13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            status_t dumpInternals(int fd);
14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Thread used for tone playback and to send audio config commands to audio flinger
14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because startTone()
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // and stopTone() are normally called with mLock locked and requesting a tone start or stop will cause
14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // calls to AudioPolicyService and an attempt to lock mLock.
14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // For audio config commands, it is necessary because audio flinger requires that the calling process (user)
14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // has permission to modify audio settings.
14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    class AudioCommandThread : public Thread {
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class AudioCommand;
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    public:
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // commands for tone AudioCommand
15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        enum {
15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            START_TONE,
15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            STOP_TONE,
15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_VOLUME,
15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_PARAMETERS,
15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_VOICE_VOLUME
15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AudioCommandThread (String8 name);
16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual             ~AudioCommandThread();
16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    status_t    dump(int fd);
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // Thread virtuals
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual     void        onFirstRef();
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual     bool        threadLoop();
16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        exit();
17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        startToneCommand(int type = 0, int stream = 0);
17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        stopToneCommand();
17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    status_t    volumeCommand(int stream, float volume, int output, int delayMs = 0);
174fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    status_t    parametersCommand(int ioHandle, const char *keyValuePairs, int delayMs = 0);
17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    status_t    voiceVolumeCommand(float volume, int delayMs = 0);
17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        insertCommand_l(AudioCommand *command, int delayMs = 0);
17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    private:
17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // descriptor for requested tone playback event
18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class AudioCommand {
18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            AudioCommand()
18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            : mCommand(-1) {}
18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            void dump(char* buffer, size_t size);
18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mCommand;   // START_TONE, STOP_TONE ...
18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            nsecs_t mTime;  // time stamp
19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            Condition mCond; // condition for status return
19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            status_t mStatus; // command status
19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            bool mWaitStatus; // true if caller is waiting for status
19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            void *mParam;     // command parameter (ToneData, VolumeData, ParametersData)
19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class ToneData {
19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mType;      // tone type (START_TONE only)
19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mStream;    // stream type (START_TONE only)
20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class VolumeData {
20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mStream;
20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            float mVolume;
20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mIO;
20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class ParametersData {
21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mIO;
21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            String8 mKeyValuePairs;
21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class VoiceVolumeData {
21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            float mVolume;
21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Mutex   mLock;
22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Condition mWaitWorkCV;
22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Vector <AudioCommand *> mAudioCommands; // list of pending commands
22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ToneGenerator *mpToneGenerator;     // the tone generator
22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AudioCommand mLastCommand;          // last processed command (used by dump)
22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        String8 mName;                      // string used by wake lock fo delayed commands
22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2287c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class EffectDesc {
2297c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        EffectDesc() {}
2317c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        virtual ~EffectDesc() {}
2327c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        char *mName;
2337c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        effect_uuid_t mUuid;
2347c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector <effect_param_t *> mParams;
2357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2367c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2377c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class InputSourceDesc {
2387c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2397c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        InputSourceDesc() {}
2407c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        virtual ~InputSourceDesc() {}
2417c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector <EffectDesc *> mEffects;
2427c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2437c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2447c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2457c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class InputDesc {
2467c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2477c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        InputDesc() {}
2487c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        virtual ~InputDesc() {}
2497c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        int mSessionId;
2507c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector< sp<AudioEffect> >mEffects;
2517c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2527c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2537c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    static const char *kInputSourceNames[AUDIO_SOURCE_CNT -1];
2547c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2557c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    void setPreProcessorEnabled(InputDesc *inputDesc, bool enabled);
2567c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadPreProcessorConfig(const char *path);
2577c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadEffects(cnode *root, Vector <EffectDesc *>& effects);
2587c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    EffectDesc *loadEffect(cnode *root);
2597c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadInputSources(cnode *root, const Vector <EffectDesc *>& effects);
2607c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    audio_source_t inputSourceNameToEnum(const char *name);
2617c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    InputSourceDesc *loadInputSource(cnode *root, const Vector <EffectDesc *>& effects);
2627c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    void loadEffectParameters(cnode *root, Vector <effect_param_t *>& params);
2637c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    effect_param_t *loadEffectParameter(cnode *root);
2647c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    size_t readParamValue(cnode *node,
2657c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          char *param,
2667c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          size_t *curSize,
2677c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          size_t *totSize);
2687c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    size_t growParamSize(char *param,
2697c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t size,
2707c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t *curSize,
2717c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t *totSize);
2727c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Internal dump utilities.
27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    status_t dumpPermissionDenial(int fd);
27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
277eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    mutable Mutex mLock;    // prevents concurrent access to AudioPolicy manager functions changing
278eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent                            // device connection state  or routing
27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp <AudioCommandThread> mAudioCommandThread;    // audio commands thread
28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp <AudioCommandThread> mTonePlaybackThread;     // tone playback thread
281fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    struct audio_policy_device *mpAudioPolicyDev;
282fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    struct audio_policy *mpAudioPolicy;
2837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    KeyedVector< audio_source_t, InputSourceDesc* > mInputSources;
2847c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    KeyedVector< audio_io_handle_t, InputDesc* > mInputs;
28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android
28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif // ANDROID_AUDIOPOLICYSERVICE_H
290