1c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent/*
2c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent**
3c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Copyright 2009, The Android Open Source Project
4c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent**
5c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Licensed under the Apache License, Version 2.0 (the "License");
6c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** you may not use this file except in compliance with the License.
7c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** You may obtain a copy of the License at
8c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent**
9c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent**     http://www.apache.org/licenses/LICENSE-2.0
10c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent**
11c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Unless required by applicable law or agreed to in writing, software
12c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** distributed under the License is distributed on an "AS IS" BASIS,
13c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** See the License for the specific language governing permissions and
15c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** limitations under the License.
16c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent*/
17c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
18c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#define LOG_TAG "IAudioPolicyService"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <utils/Log.h>
20c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
21c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <stdint.h>
22ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent#include <math.h>
23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <sys/types.h>
24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
25b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent#include <binder/IPCThreadState.h>
26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h>
27f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent#include <cutils/multiuser.h>
2874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h>
29c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h>
303528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent#include <media/TimeCheck.h>
314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h>
3264760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
33fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android {
35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum {
37c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_DEVICE_CONNECTION_STATE,
39f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov    HANDLE_DEVICE_CONFIG_CHANGE,
40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PHONE_STATE,
410b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten    SET_RINGER_MODE,    // reserved, no longer used
42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_FORCE_USE,
43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_FORCE_USE,
44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_OUTPUT,
45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_OUTPUT,
46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_OUTPUT,
47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_OUTPUT,
48caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    GET_INPUT_FOR_ATTR,
49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_INPUT,
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_INPUT,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_INPUT,
52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    INIT_STREAM_VOLUME,
53c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_STREAM_VOLUME,
54de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STREAM_VOLUME,
55de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STRATEGY_FOR_STREAM,
56de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_OUTPUT_FOR_EFFECT,
57de070137f11d346fba77605bd76a44c040a618fcEric Laurent    REGISTER_EFFECT,
58eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    UNREGISTER_EFFECT,
596b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    IS_STREAM_ACTIVE,
60d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    IS_SOURCE_ACTIVE,
616b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    GET_DEVICES_FOR_STREAM,
62db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    QUERY_DEFAULT_PRE_PROCESSING,
63272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    SET_EFFECT_ENABLED,
64ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    IS_STREAM_ACTIVE_REMOTELY,
65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    IS_OFFLOAD_SUPPORTED,
66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PORTS,
67203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    GET_AUDIO_PORT,
68203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    CREATE_AUDIO_PATCH,
69203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    RELEASE_AUDIO_PATCH,
70203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PATCHES,
71b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    SET_AUDIO_PORT_CONFIG,
725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi    REGISTER_CLIENT,
73df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    GET_OUTPUT_FOR_ATTR,
74df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    ACQUIRE_SOUNDTRIGGER_SESSION,
75bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    RELEASE_SOUNDTRIGGER_SESSION,
76baac183f3808d7b68f184647a97bd381620415feEric Laurent    GET_PHONE_STATE,
77baac183f3808d7b68f184647a97bd381620415feEric Laurent    REGISTER_POLICY_MIXES,
78554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    START_AUDIO_SOURCE,
79e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    STOP_AUDIO_SOURCE,
80e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    SET_AUDIO_PORT_CALLBACK_ENABLED,
812ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    SET_MASTER_MONO,
822ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    GET_MASTER_MONO,
83817729095966c338615a8a791d2dbf774fc034efjiabin    GET_STREAM_VOLUME_DB,
84817729095966c338615a8a791d2dbf774fc034efjiabin    GET_SURROUND_FORMATS,
85817729095966c338615a8a791d2dbf774fc034efjiabin    SET_SURROUND_FORMAT_ENABLED
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
881d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024
891d670b11313250442455a22f1056ad649d607fb2Eric Laurent
90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
93090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioPolicyService(const sp<IBinder>& impl)
94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
99fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
100fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
101e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_address,
102e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_name)
103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
109e743a47f445f02a0612018fa5640301304844fbfPaul McLean        data.writeCString(device_name);
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
115fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
123fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
126f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov    virtual status_t handleDeviceConfigChange(audio_devices_t device,
127f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov                                              const char *device_address,
128f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov                                              const char *device_name)
129f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov    {
130f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        Parcel data, reply;
131f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
132f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        data.writeInt32(static_cast <uint32_t>(device));
133f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        data.writeCString(device_address);
134f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        data.writeCString(device_name);
135f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply);
136f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        return static_cast <status_t> (reply.readInt32());
137f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov    }
138f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov
139f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
148fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
158fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
167f4e63452b37c799c9387a6a88b46e6191f6a5f7eEric Laurent    virtual audio_io_handle_t getOutput(audio_stream_type_t stream)
168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual status_t getOutputForAttr(const audio_attributes_t *attr,
177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_io_handle_t *output,
178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session,
179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_stream_type_t *stream,
180766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar                                        pid_t pid,
1818c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                        uid_t uid,
18220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                        const audio_config_t *config,
183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_output_flags_t flags,
1849ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                                        audio_port_handle_t *selectedDeviceId,
18520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                        audio_port_handle_t *portId)
1865bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1875bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1895bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (stream == NULL) {
191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr(): NULL audio attributes and stream type");
192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (*stream == AUDIO_STREAM_DEFAULT) {
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr unspecified stream type");
196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (output == NULL) {
200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                ALOGE("getOutputForAttr NULL output - shouldn't happen");
201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return BAD_VALUE;
202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
2039ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            if (selectedDeviceId == NULL) {
2049ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                ALOGE("getOutputForAttr NULL selectedDeviceId - shouldn't happen");
2059ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                return BAD_VALUE;
2069ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            }
20720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            if (portId == NULL) {
20820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                ALOGE("getOutputForAttr NULL portId - shouldn't happen");
20920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                return BAD_VALUE;
21020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            }
211e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (attr == NULL) {
212e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
213e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.write(attr, sizeof(audio_attributes_t));
216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
217e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            data.writeInt32(session);
218e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream == NULL) {
219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(*stream);
2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
224766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar            data.writeInt32(pid);
2258c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            data.writeInt32(uid);
22620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            data.write(config, sizeof(audio_config_t));
2275bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
2289ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            data.writeInt32(*selectedDeviceId);
22920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            data.writeInt32(*portId);
230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status = (status_t)reply.readInt32();
235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
238e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            *output = (audio_io_handle_t)reply.readInt32();
23920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32();
240e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream != NULL) {
24120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                *stream = lStream;
242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
2439ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
24420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            *portId = (audio_port_handle_t)reply.readInt32();
245e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return status;
2465bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
2475bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
248de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
249fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
250e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                 audio_session_t session)
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
254fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
255fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
256d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        data.writeInt32((int32_t) session);
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
261de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
262fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
263e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                audio_session_t session)
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
267fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
268fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
269d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        data.writeInt32((int32_t) session);
270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
274e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual void releaseOutput(audio_io_handle_t output,
275e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_stream_type_t stream,
276e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_session_t session)
277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
280fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
281e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)stream);
282e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
286caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    virtual status_t getInputForAttr(const audio_attributes_t *attr,
287caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_io_handle_t *input,
288caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_session_t session,
289b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent                                     pid_t pid,
2908c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                     uid_t uid,
291fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent                                     const String16& opPackageName,
29220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                     const audio_config_base_t *config,
293466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                     audio_input_flags_t flags,
2949ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                                     audio_port_handle_t *selectedDeviceId,
29520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                     audio_port_handle_t *portId)
296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
298c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (attr == NULL) {
300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL attr - shouldn't happen");
301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
302caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
303caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (input == NULL) {
304caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL input - shouldn't happen");
305caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
3079ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent        if (selectedDeviceId == NULL) {
3089ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen");
3099ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            return BAD_VALUE;
3109ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent        }
31120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        if (portId == NULL) {
31220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            ALOGE("getInputForAttr NULL portId - shouldn't happen");
31320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            return BAD_VALUE;
31420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        }
315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.write(attr, sizeof(audio_attributes_t));
316a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent        data.writeInt32(*input);
317caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.writeInt32(session);
318b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent        data.writeInt32(pid);
3198c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent        data.writeInt32(uid);
320fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent        data.writeString16(opPackageName);
32120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        data.write(config, sizeof(audio_config_base_t));
322b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
3239ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent        data.writeInt32(*selectedDeviceId);
32420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        data.writeInt32(*portId);
325caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
326caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
327caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
328caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
329caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status = reply.readInt32();
330caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
331caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
332caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
333caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        *input = (audio_io_handle_t)reply.readInt32();
3349ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent        *selectedDeviceId = (audio_port_handle_t)reply.readInt32();
33520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        *portId = (audio_port_handle_t)reply.readInt32();
336caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_ERROR;
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
339fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent    virtual status_t startInput(audio_port_handle_t portId,
340f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov                                bool *silenced)
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
344fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent        data.writeInt32(portId);
345f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInt32(*silenced ? 1 : 0);
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
347f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        status_t status = static_cast <status_t> (reply.readInt32());
348f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        *silenced = reply.readInt32() == 1;
349f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        return status;
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
352fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent    virtual status_t stopInput(audio_port_handle_t portId)
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
356fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent        data.writeInt32(portId);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
361fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent    virtual void releaseInput(audio_port_handle_t portId)
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
365fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent        data.writeInt32(portId);
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
369fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
38283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
38483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
39083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
39583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
39683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
39783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
40283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
40383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
409de070137f11d346fba77605bd76a44c040a618fcEric Laurent
410fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
411de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
412de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
413de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
414de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
415de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
416de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
417de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
418de070137f11d346fba77605bd76a44c040a618fcEric Laurent
4196374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
4206b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
4216b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
4226b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
4236b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
4246b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
4256374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
4266b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
4276b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
42858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
429de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
430de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
431de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
432de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
433de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
434de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
435de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
436de070137f11d346fba77605bd76a44c040a618fcEric Laurent
43758e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
4387c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
439de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
440d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                        audio_session_t session,
441de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
442de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
443de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
444de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
445de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
4467c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
447de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
448de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
449de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
450de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
451de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
452de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
453de070137f11d346fba77605bd76a44c040a618fcEric Laurent
454de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
455de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
456de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
457de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
458de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
459de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
460de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
461de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
462de070137f11d346fba77605bd76a44c040a618fcEric Laurent
463db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
464db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
465db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
466db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
467db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
468db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
469db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
470db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
471db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
472db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
473fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
474eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
475eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
476eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
477fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
478eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
479eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
480eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
481eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
483272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
484272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
485272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
486272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
487272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
488272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
489272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
490272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
491272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
492272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
493d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
494d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
495d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
496d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
497d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
498d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
499d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
500d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
501d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
502d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
50757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
50857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
50957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
51057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
51157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
51257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
51357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
51457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
51557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
51657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
51757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
51857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
51957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
52057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
52157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
52257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
52357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
52457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
52557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
526ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
527ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
528ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
529b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
530b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
531b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
532b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
643203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
644203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
645203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
646203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
647203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
648203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
649203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
650203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
651203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
652203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
653203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
654203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
655203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
656203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
657203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
658203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
659203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
661b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
662b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
663b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
664b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
665f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
666b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
667b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
669e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    virtual void setAudioPortCallbacksEnabled(bool enabled)
670e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    {
671e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        Parcel data, reply;
672e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
673e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        data.writeInt32(enabled ? 1 : 0);
674e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
675e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    }
676e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent
677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t acquireSoundTriggerSession(audio_session_t *session,
678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_io_handle_t *ioHandle,
679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_devices_t *device)
680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (session == NULL || ioHandle == NULL || device == NULL) {
682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return BAD_VALUE;
683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status = (status_t)reply.readInt32();
691df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status == NO_ERROR) {
692df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *session = (audio_session_t)reply.readInt32();
693df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *ioHandle = (audio_io_handle_t)reply.readInt32();
694df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *device = (audio_devices_t)reply.readInt32();
695df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
696df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return status;
697df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
698df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
699df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t releaseSoundTriggerSession(audio_session_t session)
700df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
701df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
702df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
703df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInt32(session);
704df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
705df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
706df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
707df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
708df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return (status_t)reply.readInt32();
709df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
710bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
711bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    virtual audio_mode_t getPhoneState()
712bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    {
713bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        Parcel data, reply;
714bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
715bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
716bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        if (status != NO_ERROR) {
717bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return AUDIO_MODE_INVALID;
718bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        }
719bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        return (audio_mode_t)reply.readInt32();
720bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    }
721baac183f3808d7b68f184647a97bd381620415feEric Laurent
722e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh    virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
723baac183f3808d7b68f184647a97bd381620415feEric Laurent    {
724baac183f3808d7b68f184647a97bd381620415feEric Laurent        Parcel data, reply;
725baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
726baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(registration ? 1 : 0);
727baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t size = mixes.size();
728baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size > MAX_MIXES_PER_POLICY) {
729baac183f3808d7b68f184647a97bd381620415feEric Laurent            size = MAX_MIXES_PER_POLICY;
730baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
731baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t sizePosition = data.dataPosition();
732baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(size);
733baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t finalSize = size;
734baac183f3808d7b68f184647a97bd381620415feEric Laurent        for (size_t i = 0; i < size; i++) {
735baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
736baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (mixes[i].writeToParcel(&data) != NO_ERROR) {
737baac183f3808d7b68f184647a97bd381620415feEric Laurent                data.setDataPosition(position);
738baac183f3808d7b68f184647a97bd381620415feEric Laurent                finalSize--;
739baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
740baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
741baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size != finalSize) {
742baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
743baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(sizePosition);
744baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.writeInt32(finalSize);
745baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(position);
746baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
747baac183f3808d7b68f184647a97bd381620415feEric Laurent        status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
748baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (status == NO_ERROR) {
749baac183f3808d7b68f184647a97bd381620415feEric Laurent            status = (status_t)reply.readInt32();
750baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
751baac183f3808d7b68f184647a97bd381620415feEric Laurent        return status;
752baac183f3808d7b68f184647a97bd381620415feEric Laurent    }
753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    virtual status_t startAudioSource(const struct audio_port_config *source,
755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                      const audio_attributes_t *attributes,
756559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten                                      audio_patch_handle_t *handle)
757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (source == NULL || attributes == NULL || handle == NULL) {
761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return BAD_VALUE;
762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(source, sizeof(struct audio_port_config));
764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(attributes, sizeof(audio_attributes_t));
765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
770554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
771554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
772554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
773559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten        *handle = (audio_patch_handle_t)reply.readInt32();
774554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
775554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
776554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
777559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten    virtual status_t stopAudioSource(audio_patch_handle_t handle)
778554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
779554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
780554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
781554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInt32(handle);
782554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
783554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
784554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
785554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
786554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
787554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
788554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
7892ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
7902ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    virtual status_t setMasterMono(bool mono)
7912ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    {
7922ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        Parcel data, reply;
7932ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
7942ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        data.writeInt32(static_cast<int32_t>(mono));
7952ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        status_t status = remote()->transact(SET_MASTER_MONO, data, &reply);
7962ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        if (status != NO_ERROR) {
7972ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            return status;
7982ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        }
7992ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        return static_cast<status_t>(reply.readInt32());
8002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    }
8012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
8022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    virtual status_t getMasterMono(bool *mono)
8032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    {
8042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        if (mono == nullptr) {
8052ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            return BAD_VALUE;
8062ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        }
8072ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        Parcel data, reply;
8082ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
8092ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
8102ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        status_t status = remote()->transact(GET_MASTER_MONO, data, &reply);
8112ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        if (status != NO_ERROR) {
8122ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            return status;
8132ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        }
8142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        status = static_cast<status_t>(reply.readInt32());
8152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        if (status == NO_ERROR) {
8162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            *mono = static_cast<bool>(reply.readInt32());
8172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        }
8182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        return status;
8192ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    }
820ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent
821ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent    virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device)
822ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent    {
823ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        Parcel data, reply;
824ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
825ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        data.writeInt32(static_cast <int32_t>(stream));
826ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        data.writeInt32(static_cast <int32_t>(index));
827ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        data.writeUint32(static_cast <uint32_t>(device));
828ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply);
829ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        if (status != NO_ERROR) {
830ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            return NAN;
831ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        }
832ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        return reply.readFloat();
833ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent    }
834817729095966c338615a8a791d2dbf774fc034efjiabin
835817729095966c338615a8a791d2dbf774fc034efjiabin    virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
836817729095966c338615a8a791d2dbf774fc034efjiabin                                        audio_format_t *surroundFormats,
837817729095966c338615a8a791d2dbf774fc034efjiabin                                        bool *surroundFormatsEnabled,
838817729095966c338615a8a791d2dbf774fc034efjiabin                                        bool reported)
839817729095966c338615a8a791d2dbf774fc034efjiabin    {
840817729095966c338615a8a791d2dbf774fc034efjiabin        if (numSurroundFormats == NULL || (*numSurroundFormats != 0 &&
841817729095966c338615a8a791d2dbf774fc034efjiabin                (surroundFormats == NULL || surroundFormatsEnabled == NULL))) {
842817729095966c338615a8a791d2dbf774fc034efjiabin            return BAD_VALUE;
843817729095966c338615a8a791d2dbf774fc034efjiabin        }
844817729095966c338615a8a791d2dbf774fc034efjiabin        Parcel data, reply;
845817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
846817729095966c338615a8a791d2dbf774fc034efjiabin        unsigned int numSurroundFormatsReq = *numSurroundFormats;
847817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeUint32(numSurroundFormatsReq);
848817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeBool(reported);
849817729095966c338615a8a791d2dbf774fc034efjiabin        status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply);
850817729095966c338615a8a791d2dbf774fc034efjiabin        if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) {
851817729095966c338615a8a791d2dbf774fc034efjiabin            *numSurroundFormats = reply.readUint32();
852817729095966c338615a8a791d2dbf774fc034efjiabin        }
853817729095966c338615a8a791d2dbf774fc034efjiabin        if (status == NO_ERROR) {
854817729095966c338615a8a791d2dbf774fc034efjiabin            if (numSurroundFormatsReq > *numSurroundFormats) {
855817729095966c338615a8a791d2dbf774fc034efjiabin                numSurroundFormatsReq = *numSurroundFormats;
856817729095966c338615a8a791d2dbf774fc034efjiabin            }
857817729095966c338615a8a791d2dbf774fc034efjiabin            if (numSurroundFormatsReq > 0) {
858817729095966c338615a8a791d2dbf774fc034efjiabin                status = reply.read(surroundFormats,
859817729095966c338615a8a791d2dbf774fc034efjiabin                                    numSurroundFormatsReq * sizeof(audio_format_t));
860817729095966c338615a8a791d2dbf774fc034efjiabin                if (status != NO_ERROR) {
861817729095966c338615a8a791d2dbf774fc034efjiabin                    return status;
862817729095966c338615a8a791d2dbf774fc034efjiabin                }
863817729095966c338615a8a791d2dbf774fc034efjiabin                status = reply.read(surroundFormatsEnabled,
864817729095966c338615a8a791d2dbf774fc034efjiabin                                    numSurroundFormatsReq * sizeof(bool));
865817729095966c338615a8a791d2dbf774fc034efjiabin            }
866817729095966c338615a8a791d2dbf774fc034efjiabin        }
867817729095966c338615a8a791d2dbf774fc034efjiabin        return status;
868817729095966c338615a8a791d2dbf774fc034efjiabin    }
869817729095966c338615a8a791d2dbf774fc034efjiabin
870817729095966c338615a8a791d2dbf774fc034efjiabin    virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
871817729095966c338615a8a791d2dbf774fc034efjiabin    {
872817729095966c338615a8a791d2dbf774fc034efjiabin        Parcel data, reply;
873817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
874817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeInt32(audioFormat);
875817729095966c338615a8a791d2dbf774fc034efjiabin        data.writeBool(enabled);
876817729095966c338615a8a791d2dbf774fc034efjiabin        status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply);
877817729095966c338615a8a791d2dbf774fc034efjiabin        if (status != NO_ERROR) {
878817729095966c338615a8a791d2dbf774fc034efjiabin            return status;
879817729095966c338615a8a791d2dbf774fc034efjiabin        }
880817729095966c338615a8a791d2dbf774fc034efjiabin        return reply.readInt32();
881817729095966c338615a8a791d2dbf774fc034efjiabin    }
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
891b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    // make sure transactions reserved to AudioFlinger do not come from other processes
892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    switch (code) {
893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case START_OUTPUT:
894b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case STOP_OUTPUT:
895b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_OUTPUT:
896b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_INPUT_FOR_ATTR:
897b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case START_INPUT:
898b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case STOP_INPUT:
899b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_INPUT:
900b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_STRATEGY_FOR_STREAM:
901b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_OUTPUT_FOR_EFFECT:
902b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case REGISTER_EFFECT:
903b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case UNREGISTER_EFFECT:
904b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_EFFECT_ENABLED:
905b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_OUTPUT_FOR_ATTR:
906b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION:
907b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_SOUNDTRIGGER_SESSION:
908b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            ALOGW("%s: transaction %d received from PID %d",
909b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent                  __func__, code, IPCThreadState::self()->getCallingPid());
910ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            // return status only for non void methods
911ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            switch (code) {
912ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                case RELEASE_OUTPUT:
913ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                case RELEASE_INPUT:
914ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    break;
915ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                default:
916ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
917ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    break;
918ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            }
919ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            return OK;
920b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        default:
921b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            break;
922b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    }
923b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
9244980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    // make sure the following transactions come from system components
9254980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    switch (code) {
9264980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_DEVICE_CONNECTION_STATE:
9274980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case HANDLE_DEVICE_CONFIG_CHANGE:
9284980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_PHONE_STATE:
929e17378d11b275daecd20ff840bcb7d275b6801bfEric Laurent//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available
930e17378d11b275daecd20ff840bcb7d275b6801bfEric Laurent//      case SET_FORCE_USE:
9314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case INIT_STREAM_VOLUME:
9324980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_STREAM_VOLUME:
9334980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case REGISTER_POLICY_MIXES:
93410b7123bd6ce29fe756422aeedc5cfe469c4309fEric Laurent        case SET_MASTER_MONO:
93510b7123bd6ce29fe756422aeedc5cfe469c4309fEric Laurent        case START_AUDIO_SOURCE:
936817729095966c338615a8a791d2dbf774fc034efjiabin        case STOP_AUDIO_SOURCE:
937817729095966c338615a8a791d2dbf774fc034efjiabin        case GET_SURROUND_FORMATS:
938817729095966c338615a8a791d2dbf774fc034efjiabin        case SET_SURROUND_FORMAT_ENABLED: {
939f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent            if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) {
9404980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
9414980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      __func__, code, IPCThreadState::self()->getCallingPid(),
9424980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      IPCThreadState::self()->getCallingUid());
943ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
944ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                return OK;
9454980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            }
94696c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent        } break;
9474980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        default:
9484980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            break;
9494980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    }
9504980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent
951da6a5a80b402fa0d836240d7e05cd887080c4f4dEric Laurent    TimeCheck check("IAudioPolicyService");
9523528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent
953e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
956fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
957fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
958fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
959fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
961e743a47f445f02a0612018fa5640301304844fbfPaul McLean            const char *device_name = data.readCString();
962c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            if (device_address == nullptr || device_name == nullptr) {
963c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device);
964c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
965c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            } else {
966c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
967c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  state,
968c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  device_address,
969c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  device_name)));
970c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            }
971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
972c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
976fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
977fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
978c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
979c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            if (device_address == nullptr) {
980c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device);
981c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
982c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            } else {
983c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
984c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  device_address)));
985c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            }
986c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
987c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
988c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
989f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        case HANDLE_DEVICE_CONFIG_CHANGE: {
990f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov            CHECK_INTERFACE(IAudioPolicyService, data, reply);
991f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov            audio_devices_t device =
992f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov                    static_cast <audio_devices_t>(data.readInt32());
993f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov            const char *device_address = data.readCString();
994f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov            const char *device_name = data.readCString();
995c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            if (device_address == nullptr || device_name == nullptr) {
996c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device);
997c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<int32_t> (BAD_VALUE));
998c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            } else {
999c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device,
1000c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  device_address,
1001c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov                                                                                  device_name)));
1002c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov            }
1003f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov            return NO_ERROR;
1004f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov        } break;
1005f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov
1006c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
100885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
100985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
1014c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
101585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
101685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
1017fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
1018fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
1019c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
1024c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
102585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
102685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
1027c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
1028c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1031c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
1032c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1033fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1034fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
1035f4e63452b37c799c9387a6a88b46e6191f6a5f7eEric Laurent            audio_io_handle_t output = getOutput(stream);
1036fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
10405bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
10415bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1042b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            audio_attributes_t attr = {};
1043e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasAttributes = data.readInt32() != 0;
1044e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasAttributes) {
1045e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.read(&attr, sizeof(audio_attributes_t));
104639fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard                sanetizeAudioAttributes(&attr);
1047e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
1048e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1049e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
1050e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasStream = data.readInt32() != 0;
1051e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasStream) {
1052e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                stream = (audio_stream_type_t)data.readInt32();
1053e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
1054766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar            pid_t pid = (pid_t)data.readInt32();
10558c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
105620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_config_t config;
105720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            memset(&config, 0, sizeof(audio_config_t));
105820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            data.read(&config, sizeof(audio_config_t));
10595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
10605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
1061aa9811945f575614b3482d09e4d969792701cebbPaul McLean            audio_port_handle_t selectedDeviceId = data.readInt32();
106220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
1063a946d844a77906072f5eb7093d41db465d6514bbRobert Shih            audio_io_handle_t output = 0;
1064e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = getOutputForAttr(hasAttributes ? &attr : NULL,
1065766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar                    &output, session, &stream, pid, uid,
106620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                    &config,
10679ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                    flags, &selectedDeviceId, &portId);
1068e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(status);
1069e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(output);
1070e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(stream);
10719ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent            reply->writeInt32(selectedDeviceId);
107220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            reply->writeInt32(portId);
10735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
10745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
10755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
1076c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1078fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
1079ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
1080ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
1081e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1082de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
1083ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
1084de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1090fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
1091ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
1092ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
1093e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1094de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
1095ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
1096de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1098c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1099c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
1101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1102fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
1103e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = (audio_stream_type_t)data.readInt32();
1104e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1105e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            releaseOutput(output, stream, session);
1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1109caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        case GET_INPUT_FOR_ATTR: {
1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1111b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            audio_attributes_t attr = {};
1112caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            data.read(&attr, sizeof(audio_attributes_t));
111339fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard            sanetizeAudioAttributes(&attr);
1114a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1115caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1116b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent            pid_t pid = (pid_t)data.readInt32();
11178c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
1118fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            const String16 opPackageName = data.readString16();
111920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_config_base_t config;
112020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            memset(&config, 0, sizeof(audio_config_base_t));
112120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            data.read(&config, sizeof(audio_config_base_t));
1122b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1123466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean            audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
112420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
1125b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent            status_t status = getInputForAttr(&attr, &input, session, pid, uid,
1126fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent                                              opPackageName, &config,
11279ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                                              flags, &selectedDeviceId, &portId);
1128caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            reply->writeInt32(status);
1129caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            if (status == NO_ERROR) {
1130caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                reply->writeInt32(input);
11319ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent                reply->writeInt32(selectedDeviceId);
113220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                reply->writeInt32(portId);
1133caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            }
1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1139fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1140f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            bool silenced = data.readInt32() == 1;
1141fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            status_t status = startInput(portId, &silenced);
1142f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            reply->writeInt32(static_cast <uint32_t>(status));
1143f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            reply->writeInt32(silenced ? 1 : 0);
1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1149fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1150fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1156fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
1157fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent            releaseInput(portId);
1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1163fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
1165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
1166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
1167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
1168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1173fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1174fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
1175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
117683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
117783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
117883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
117983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1181c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
1184c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1185fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1186fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
118783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
1188892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int index = 0;
118983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
1190c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
1192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1193c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1195de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
1196de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1197fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1198fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
1199de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
1200de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1201de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1202de070137f11d346fba77605bd76a44c040a618fcEric Laurent
12036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
12046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1205fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1206fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
12076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
12086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
12096b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
12106b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
1211de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
1212de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1213b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            effect_descriptor_t desc = {};
1214b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1215b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung                android_errorWriteLog(0x534e4554, "73126106");
1216b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            }
1217b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            (void)sanitizeEffectDescriptor(&desc);
1218de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
1219de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
1220de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1221de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1222de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1223de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
1224de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1225b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            effect_descriptor_t desc = {};
1226b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            if (data.read(&desc, sizeof(desc)) != NO_ERROR) {
1227b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung                android_errorWriteLog(0x534e4554, "73126106");
1228b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            }
1229b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            (void)sanitizeEffectDescriptor(&desc);
12307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
1231de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
1232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
1233de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1234de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
12357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
1236de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
1237de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
1238de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
1239de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1240de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1241de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1242de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
1243de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1244de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1245de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1246de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1247de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1248de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1249db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
1250db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1251db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
1252db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
1253db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1254db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
1255db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
1256db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
1257eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
1258eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1260eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
1261ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
1262eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
1263eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
1264eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
1265272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
1266272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1267272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1268272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
1269ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
1270272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
1271272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
1272272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
1273d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
1274d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1275d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
1276d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
1277d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
1278d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
1279d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
128057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
128157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1282d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
128357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
128474adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (count > AudioEffect::kMaxPreProcessing) {
128574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent                count = AudioEffect::kMaxPreProcessing;
128674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            }
128757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
1288b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            effect_descriptor_t *descriptors = new effect_descriptor_t[count]{};
128957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
129057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
129157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
129257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
129357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
129457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
129574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (retCount != 0) {
129657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
129757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
129857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
129957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
130057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
130157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
130257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
130357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
130457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
1305b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
1306b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1307b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            audio_offload_info_t info = {};
1308b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
1309b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
1310b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
1311b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
1312b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
1313b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
1314203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
1315203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1316203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
1317203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
1318203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
13191d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
13201d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
13211d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1322203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
1323203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
1324203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
13251d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (ports == NULL) {
13261d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
13271d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
13281d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
13291d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
13301d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1331203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1332203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1333203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
1334203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1335203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1336203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
1337203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
1338203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1339203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1340203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1341203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1342203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
1343203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1344203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1345203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1346203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
1347203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1348e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1349e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1350e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23912202");
1351e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1352203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
1353203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1354203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1355203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
1356203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1357203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1358203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1359203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1360203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
1361203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1362b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            struct audio_patch patch = {};
1363203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1364a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1365e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1366e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23912202");
1367e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1368203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
1369203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1370203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1371203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
1372203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1373203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1374203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1375203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1376203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
1377203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1378b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1379203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1380203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
1381203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1382203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1383203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1384203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1385203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
1386203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1387203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
13881d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
13891d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
13901d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1391203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
1392203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
1393203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
1394203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
13951d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (patches == NULL) {
13961d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
13971d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
13981d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
13991d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
14001d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1401203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
1402203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1403203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
1404203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1405203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
1406203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
1407203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1408203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1409203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1410203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1411203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
1412203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1413203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1414203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1415203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
1416203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1417b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            struct audio_port_config config = {};
1418203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
1419b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            (void)sanitizeAudioPortConfig(&config);
1420203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
1421203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1422203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1423203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1424df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1425b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
1426b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1427b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1428b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
1429b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
1430b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
1431b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
1432203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1433e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        case SET_AUDIO_PORT_CALLBACK_ENABLED: {
1434e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1435e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            setAudioPortCallbacksEnabled(data.readInt32() == 1);
1436e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            return NO_ERROR;
1437e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        } break;
1438e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent
1439df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION: {
1440df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1441df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1442df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1443a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_session_t session = AUDIO_SESSION_NONE;
1444a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE;
1445a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_devices_t device = AUDIO_DEVICE_NONE;
1446df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
1447df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1448df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            if (status == NO_ERROR) {
1449df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(session);
1450df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(ioHandle);
1451df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(device);
1452df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            }
1453df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1454df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1455df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1456df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case RELEASE_SOUNDTRIGGER_SESSION: {
1457df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1458df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1459df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1460df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1461df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = releaseSoundTriggerSession(session);
1462df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1463df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1464df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1465df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1466bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        case GET_PHONE_STATE: {
1467bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1468bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            reply->writeInt32((int32_t)getPhoneState());
1469bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return NO_ERROR;
1470bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        } break;
1471bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
1472baac183f3808d7b68f184647a97bd381620415feEric Laurent        case REGISTER_POLICY_MIXES: {
1473baac183f3808d7b68f184647a97bd381620415feEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1474baac183f3808d7b68f184647a97bd381620415feEric Laurent            bool registration = data.readInt32() == 1;
1475baac183f3808d7b68f184647a97bd381620415feEric Laurent            Vector<AudioMix> mixes;
1476baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t size = (size_t)data.readInt32();
1477baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (size > MAX_MIXES_PER_POLICY) {
1478baac183f3808d7b68f184647a97bd381620415feEric Laurent                size = MAX_MIXES_PER_POLICY;
1479baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1480baac183f3808d7b68f184647a97bd381620415feEric Laurent            for (size_t i = 0; i < size; i++) {
1481baac183f3808d7b68f184647a97bd381620415feEric Laurent                AudioMix mix;
1482baac183f3808d7b68f184647a97bd381620415feEric Laurent                if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
1483baac183f3808d7b68f184647a97bd381620415feEric Laurent                    mixes.add(mix);
1484baac183f3808d7b68f184647a97bd381620415feEric Laurent                }
1485baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1486baac183f3808d7b68f184647a97bd381620415feEric Laurent            status_t status = registerPolicyMixes(mixes, registration);
1487baac183f3808d7b68f184647a97bd381620415feEric Laurent            reply->writeInt32(status);
1488baac183f3808d7b68f184647a97bd381620415feEric Laurent            return NO_ERROR;
1489baac183f3808d7b68f184647a97bd381620415feEric Laurent        } break;
1490baac183f3808d7b68f184647a97bd381620415feEric Laurent
1491554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case START_AUDIO_SOURCE: {
1492554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1493b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            struct audio_port_config source = {};
1494554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&source, sizeof(struct audio_port_config));
1495b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            (void)sanitizeAudioPortConfig(&source);
1496b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung            audio_attributes_t attributes = {};
1497554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&attributes, sizeof(audio_attributes_t));
149839fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard            sanetizeAudioAttributes(&attributes);
1499559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1500554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = startAudioSource(&source, &attributes, &handle);
1501554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1502554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(handle);
1503554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1504554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1505554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
1506554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case STOP_AUDIO_SOURCE: {
1507554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1508559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten            audio_patch_handle_t handle = (audio_patch_handle_t) data.readInt32();
1509554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = stopAudioSource(handle);
1510554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1511554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1512554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1513554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
15142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        case SET_MASTER_MONO: {
15152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            CHECK_INTERFACE(IAudioPolicyService, data, reply);
15162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            bool mono = static_cast<bool>(data.readInt32());
15172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            status_t status = setMasterMono(mono);
15182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            reply->writeInt32(status);
15192ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            return NO_ERROR;
15202ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        } break;
15212ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
15222ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        case GET_MASTER_MONO: {
15232ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            CHECK_INTERFACE(IAudioPolicyService, data, reply);
15242ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            bool mono;
15252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            status_t status = getMasterMono(&mono);
15262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            reply->writeInt32(status);
15272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            if (status == NO_ERROR) {
15282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung                reply->writeInt32(static_cast<int32_t>(mono));
15292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            }
15302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung            return NO_ERROR;
15312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung        } break;
15322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
1533ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        case GET_STREAM_VOLUME_DB: {
1534ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1535ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            audio_stream_type_t stream =
1536ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent                    static_cast <audio_stream_type_t>(data.readInt32());
1537ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            int index = static_cast <int>(data.readInt32());
1538ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            audio_devices_t device =
1539ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent                    static_cast <audio_devices_t>(data.readUint32());
1540ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            reply->writeFloat(getStreamVolumeDB(stream, index, device));
1541ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent            return NO_ERROR;
1542ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent        }
1543ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent
1544817729095966c338615a8a791d2dbf774fc034efjiabin        case GET_SURROUND_FORMATS: {
1545817729095966c338615a8a791d2dbf774fc034efjiabin            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1546817729095966c338615a8a791d2dbf774fc034efjiabin            unsigned int numSurroundFormatsReq = data.readUint32();
1547817729095966c338615a8a791d2dbf774fc034efjiabin            if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) {
1548817729095966c338615a8a791d2dbf774fc034efjiabin                numSurroundFormatsReq = MAX_ITEMS_PER_LIST;
1549817729095966c338615a8a791d2dbf774fc034efjiabin            }
1550817729095966c338615a8a791d2dbf774fc034efjiabin            bool reported = data.readBool();
1551817729095966c338615a8a791d2dbf774fc034efjiabin            unsigned int numSurroundFormats = numSurroundFormatsReq;
1552817729095966c338615a8a791d2dbf774fc034efjiabin            audio_format_t *surroundFormats = (audio_format_t *)calloc(
1553817729095966c338615a8a791d2dbf774fc034efjiabin                    numSurroundFormats, sizeof(audio_format_t));
1554817729095966c338615a8a791d2dbf774fc034efjiabin            bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool));
1555817729095966c338615a8a791d2dbf774fc034efjiabin            if (numSurroundFormatsReq > 0 &&
1556817729095966c338615a8a791d2dbf774fc034efjiabin                    (surroundFormats == NULL || surroundFormatsEnabled == NULL)) {
1557817729095966c338615a8a791d2dbf774fc034efjiabin                free(surroundFormats);
1558817729095966c338615a8a791d2dbf774fc034efjiabin                free(surroundFormatsEnabled);
1559817729095966c338615a8a791d2dbf774fc034efjiabin                reply->writeInt32(NO_MEMORY);
1560817729095966c338615a8a791d2dbf774fc034efjiabin                return NO_ERROR;
1561817729095966c338615a8a791d2dbf774fc034efjiabin            }
1562817729095966c338615a8a791d2dbf774fc034efjiabin            status_t status = getSurroundFormats(
1563817729095966c338615a8a791d2dbf774fc034efjiabin                    &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported);
1564817729095966c338615a8a791d2dbf774fc034efjiabin            reply->writeInt32(status);
1565817729095966c338615a8a791d2dbf774fc034efjiabin
1566817729095966c338615a8a791d2dbf774fc034efjiabin            if (status == NO_ERROR) {
1567817729095966c338615a8a791d2dbf774fc034efjiabin                reply->writeUint32(numSurroundFormats);
1568817729095966c338615a8a791d2dbf774fc034efjiabin                if (numSurroundFormatsReq > numSurroundFormats) {
1569817729095966c338615a8a791d2dbf774fc034efjiabin                    numSurroundFormatsReq = numSurroundFormats;
1570817729095966c338615a8a791d2dbf774fc034efjiabin                }
1571817729095966c338615a8a791d2dbf774fc034efjiabin                reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t));
1572817729095966c338615a8a791d2dbf774fc034efjiabin                reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool));
1573817729095966c338615a8a791d2dbf774fc034efjiabin            }
1574817729095966c338615a8a791d2dbf774fc034efjiabin            free(surroundFormats);
1575817729095966c338615a8a791d2dbf774fc034efjiabin            free(surroundFormatsEnabled);
1576817729095966c338615a8a791d2dbf774fc034efjiabin            return NO_ERROR;
1577817729095966c338615a8a791d2dbf774fc034efjiabin        }
1578817729095966c338615a8a791d2dbf774fc034efjiabin
1579817729095966c338615a8a791d2dbf774fc034efjiabin        case SET_SURROUND_FORMAT_ENABLED: {
1580817729095966c338615a8a791d2dbf774fc034efjiabin            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1581817729095966c338615a8a791d2dbf774fc034efjiabin            audio_format_t audioFormat = (audio_format_t) data.readInt32();
1582817729095966c338615a8a791d2dbf774fc034efjiabin            bool enabled = data.readBool();
1583817729095966c338615a8a791d2dbf774fc034efjiabin            status_t status = setSurroundFormatEnabled(audioFormat, enabled);
1584817729095966c338615a8a791d2dbf774fc034efjiabin            reply->writeInt32(status);
1585817729095966c338615a8a791d2dbf774fc034efjiabin            return NO_ERROR;
1586817729095966c338615a8a791d2dbf774fc034efjiabin        }
1587817729095966c338615a8a791d2dbf774fc034efjiabin
1588c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
1589c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
1590c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
1591c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
1592c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1593b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns true if string overflow was prevented by zero termination */
1594b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungtemplate <size_t size>
1595b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatic bool preventStringOverflow(char (&s)[size]) {
1596b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    if (strnlen(s, size) < size) return false;
1597b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    s[size - 1] = '\0';
1598b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    return true;
1599b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung}
1600b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung
160139fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocardvoid BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr)
160239fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard{
160339fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard    const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE;
160439fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard    if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) {
160539fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard        android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging
160639fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard    }
160739fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard    attr->tags[tagsMaxSize - 1] = '\0';
160839fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard}
160939fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard
1610b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns BAD_VALUE if sanitization was required. */
1611b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatus_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc)
1612b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung{
1613b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    if (preventStringOverflow(desc->name)
1614b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung        | /* always */ preventStringOverflow(desc->implementor)) {
1615b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung        android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging
1616b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung        return BAD_VALUE;
1617b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    }
1618b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    return NO_ERROR;
1619b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung}
1620b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung
1621b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns BAD_VALUE if sanitization was required. */
1622b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatus_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config)
1623b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung{
1624b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    if (config->type == AUDIO_PORT_TYPE_DEVICE &&
1625b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung        preventStringOverflow(config->ext.device.address)) {
1626b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung        return BAD_VALUE;
1627b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    }
1628b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung    return NO_ERROR;
1629b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung}
1630b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung
1631c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1632c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
163340bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1634