AudioPolicyService.h revision 6374252107fd6539397598195ea6defd5870fafb
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);
62fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
63fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
64fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_io_handle_t getOutput(audio_stream_type_t stream,
6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                        uint32_t samplingRate = 0,
6658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format = AUDIO_FORMAT_DEFAULT,
6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                        uint32_t channels = 0,
68fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_policy_output_flags_t flags =
693030fcefcfcfc48789612659206b957cd0489a54Eric Laurent                                                AUDIO_POLICY_OUTPUT_FLAG_NONE);
70de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
71fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
72de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                 int session = 0);
73de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
74fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
75de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                int session = 0);
7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void releaseOutput(audio_io_handle_t output);
77eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten    virtual audio_io_handle_t getInput(audio_source_t inputSource,
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                    uint32_t samplingRate = 0,
7958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                    audio_format_t format = AUDIO_FORMAT_DEFAULT,
8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                    uint32_t channels = 0,
81fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_in_acoustics_t acoustics =
82de9719b3ec71472e6bf75117152176af51d1a515Glenn Kasten                                            (audio_in_acoustics_t)0 /*AUDIO_IN_ACOUSTICS_NONE*/,
837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                    int audioSession = 0);
8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t startInput(audio_io_handle_t input);
8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t stopInput(audio_io_handle_t input);
8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void releaseInput(audio_io_handle_t input);
87fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      int indexMin,
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      int indexMax);
9083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
9183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
9283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device);
9383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
9483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
9583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device);
9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
97fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
986374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
99de070137f11d346fba77605bd76a44c040a618fcEric Laurent
100de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc);
101de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t registerEffect(effect_descriptor_t *desc,
1027c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                    audio_io_handle_t io,
103de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    uint32_t strategy,
104de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    int session,
105de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                    int id);
106de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id);
107db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled);
108fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
109de070137f11d346fba77605bd76a44c040a618fcEric Laurent
11057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
11157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                              effect_descriptor_t *descriptors,
11257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                              uint32_t *count);
11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual     status_t    onTransact(
11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                uint32_t code,
11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                const Parcel& data,
11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                Parcel* reply,
11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                uint32_t flags);
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // IBinder::DeathRecipient
12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual     void        binderDied(const wp<IBinder>& who);
12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
123fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // Helpers for the struct audio_policy_service_ops implementation.
124fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // This is used by the audio policy manager for certain operations that
125fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    // are implemented by the policy service.
12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    //
127fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual void setParameters(audio_io_handle_t ioHandle,
128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                               const char *keyValuePairs,
129fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                               int delayMs);
130fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
131fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setStreamVolume(audio_stream_type_t stream,
132de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     float volume,
133de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     audio_io_handle_t output,
134de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                     int delayMs = 0);
135fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream);
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t stopTone();
13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t setVoiceVolume(float volume, int delayMs = 0);
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                        AudioPolicyService();
14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual             ~AudioPolicyService();
14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            status_t dumpInternals(int fd);
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Thread used for tone playback and to send audio config commands to audio flinger
14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because startTone()
14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // and stopTone() are normally called with mLock locked and requesting a tone start or stop will cause
14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // calls to AudioPolicyService and an attempt to lock mLock.
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // For audio config commands, it is necessary because audio flinger requires that the calling process (user)
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // has permission to modify audio settings.
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    class AudioCommandThread : public Thread {
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class AudioCommand;
15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    public:
15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // commands for tone AudioCommand
15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        enum {
15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            START_TONE,
15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            STOP_TONE,
15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_VOLUME,
16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_PARAMETERS,
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            SET_VOICE_VOLUME
16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AudioCommandThread (String8 name);
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual             ~AudioCommandThread();
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    status_t    dump(int fd);
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // Thread virtuals
17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual     void        onFirstRef();
17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        virtual     bool        threadLoop();
17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        exit();
1743d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten                    void        startToneCommand(ToneGenerator::tone_type type,
1753d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten                                                 audio_stream_type_t stream);
17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        stopToneCommand();
17772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                    status_t    volumeCommand(audio_stream_type_t stream, float volume,
17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                            audio_io_handle_t output, int delayMs = 0);
17972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                    status_t    parametersCommand(audio_io_handle_t ioHandle,
18072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                            const char *keyValuePairs, int delayMs = 0);
18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    status_t    voiceVolumeCommand(float volume, int delayMs = 0);
18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    void        insertCommand_l(AudioCommand *command, int delayMs = 0);
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    private:
18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // descriptor for requested tone playback event
18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class AudioCommand {
18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            AudioCommand()
19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            : mCommand(-1) {}
19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            void dump(char* buffer, size_t size);
19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int mCommand;   // START_TONE, STOP_TONE ...
19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            nsecs_t mTime;  // time stamp
19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            Condition mCond; // condition for status return
19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            status_t mStatus; // command status
19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            bool mWaitStatus; // true if caller is waiting for status
19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            void *mParam;     // command parameter (ToneData, VolumeData, ParametersData)
20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class ToneData {
20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
2043d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten            ToneGenerator::tone_type mType; // tone type (START_TONE only)
205fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t mStream;    // stream type (START_TONE only)
20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class VolumeData {
20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
210fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t mStream;
21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            float mVolume;
21272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t mIO;
21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class ParametersData {
21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
21772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t mIO;
21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            String8 mKeyValuePairs;
21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class VoiceVolumeData {
22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        public:
22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            float mVolume;
22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        };
22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Mutex   mLock;
22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Condition mWaitWorkCV;
22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Vector <AudioCommand *> mAudioCommands; // list of pending commands
22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ToneGenerator *mpToneGenerator;     // the tone generator
23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AudioCommand mLastCommand;          // last processed command (used by dump)
23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        String8 mName;                      // string used by wake lock fo delayed commands
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2347c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class EffectDesc {
2357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2369fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        EffectDesc(const char *name, const effect_uuid_t& uuid) :
2379fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                        mName(strdup(name)),
2389fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                        mUuid(uuid) { }
2399fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        EffectDesc(const EffectDesc& orig) :
2409fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                        mName(strdup(orig.mName)),
2419fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                        mUuid(orig.mUuid) {
2429fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                            // deep copy mParams
2439fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                            for (size_t k = 0; k < orig.mParams.size(); k++) {
2449fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                effect_param_t *origParam = orig.mParams[k];
2459fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                // psize and vsize are rounded up to an int boundary for allocation
2469fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                size_t origSize = sizeof(effect_param_t) +
2479fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                                  ((origParam->psize + 3) & ~3) +
2489fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                                  ((origParam->vsize + 3) & ~3);
2499fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                effect_param_t *dupParam = (effect_param_t *) malloc(origSize);
2509fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                memcpy(dupParam, origParam, origSize);
2519fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                // This works because the param buffer allocation is also done by
2529fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                // multiples of 4 bytes originally. In theory we should memcpy only
2539fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                // the actual param size, that is without rounding vsize.
2549fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                                mParams.add(dupParam);
2559fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                            }
2569fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                        }
2579fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        /*virtual*/ ~EffectDesc() {
2589fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten            free(mName);
2599fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten            for (size_t k = 0; k < mParams.size(); k++) {
2609fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                free(mParams[k]);
2619fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten            }
2629fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        }
2637c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        char *mName;
2647c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        effect_uuid_t mUuid;
2657c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector <effect_param_t *> mParams;
2667c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2677c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2687c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class InputSourceDesc {
2697c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2707c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        InputSourceDesc() {}
2719fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        /*virtual*/ ~InputSourceDesc() {
2729fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten            for (size_t j = 0; j < mEffects.size(); j++) {
2739fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten                delete mEffects[j];
2749fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten            }
2759fda4b87441fe17d90d8144639c9de6d9022c3c0Glenn Kasten        }
2767c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector <EffectDesc *> mEffects;
2777c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2787c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2797c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2807c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    class InputDesc {
2817c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    public:
2827c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        InputDesc() {}
2837c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        virtual ~InputDesc() {}
2847c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        int mSessionId;
2857c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        Vector< sp<AudioEffect> >mEffects;
2867c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    };
2877c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2888dad0e31c2366c501bd1d600261d0af35a6ca786Glenn Kasten    static const char * const kInputSourceNames[AUDIO_SOURCE_CNT -1];
2897c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
2907c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    void setPreProcessorEnabled(InputDesc *inputDesc, bool enabled);
2917c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadPreProcessorConfig(const char *path);
2927c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadEffects(cnode *root, Vector <EffectDesc *>& effects);
2937c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    EffectDesc *loadEffect(cnode *root);
2947c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    status_t loadInputSources(cnode *root, const Vector <EffectDesc *>& effects);
2957c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    audio_source_t inputSourceNameToEnum(const char *name);
2967c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    InputSourceDesc *loadInputSource(cnode *root, const Vector <EffectDesc *>& effects);
2977c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    void loadEffectParameters(cnode *root, Vector <effect_param_t *>& params);
2987c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    effect_param_t *loadEffectParameter(cnode *root);
2997c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    size_t readParamValue(cnode *node,
3007c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          char *param,
3017c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          size_t *curSize,
3027c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                          size_t *totSize);
3037c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    size_t growParamSize(char *param,
3047c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t size,
3057c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t *curSize,
3067c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                         size_t *totSize);
3077c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent
30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Internal dump utilities.
30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    status_t dumpPermissionDenial(int fd);
31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
312eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    mutable Mutex mLock;    // prevents concurrent access to AudioPolicy manager functions changing
313eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent                            // device connection state  or routing
31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp <AudioCommandThread> mAudioCommandThread;    // audio commands thread
31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp <AudioCommandThread> mTonePlaybackThread;     // tone playback thread
316fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    struct audio_policy_device *mpAudioPolicyDev;
317fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    struct audio_policy *mpAudioPolicy;
3187c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    KeyedVector< audio_source_t, InputSourceDesc* > mInputSources;
3197c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    KeyedVector< audio_io_handle_t, InputDesc* > mInputs;
32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android
32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif // ANDROID_AUDIOPOLICYSERVICE_H
325