IAudioPolicyService.cpp revision 090ef604f81447eab4aa0a5b45d6307482573560
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>
22c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <sys/types.h>
23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h>
25c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h>
27c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h>
28c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2964760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
30fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android {
32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum {
34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_DEVICE_CONNECTION_STATE,
36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PHONE_STATE,
370b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten    SET_RINGER_MODE,    // reserved, no longer used
38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_FORCE_USE,
39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_FORCE_USE,
40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_OUTPUT,
41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_OUTPUT,
42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_OUTPUT,
43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_OUTPUT,
44caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    GET_INPUT_FOR_ATTR,
45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_INPUT,
46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_INPUT,
47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_INPUT,
48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    INIT_STREAM_VOLUME,
49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_STREAM_VOLUME,
50de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STREAM_VOLUME,
51de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STRATEGY_FOR_STREAM,
52de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_OUTPUT_FOR_EFFECT,
53de070137f11d346fba77605bd76a44c040a618fcEric Laurent    REGISTER_EFFECT,
54eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    UNREGISTER_EFFECT,
556b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    IS_STREAM_ACTIVE,
56d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    IS_SOURCE_ACTIVE,
576b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    GET_DEVICES_FOR_STREAM,
58db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    QUERY_DEFAULT_PRE_PROCESSING,
59272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    SET_EFFECT_ENABLED,
60ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    IS_STREAM_ACTIVE_REMOTELY,
61203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    IS_OFFLOAD_SUPPORTED,
62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PORTS,
63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    GET_AUDIO_PORT,
64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    CREATE_AUDIO_PATCH,
65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    RELEASE_AUDIO_PATCH,
66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PATCHES,
67b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    SET_AUDIO_PORT_CONFIG,
685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi    REGISTER_CLIENT,
69df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    GET_OUTPUT_FOR_ATTR,
70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    ACQUIRE_SOUNDTRIGGER_SESSION,
71bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    RELEASE_SOUNDTRIGGER_SESSION,
72baac183f3808d7b68f184647a97bd381620415feEric Laurent    GET_PHONE_STATE,
73baac183f3808d7b68f184647a97bd381620415feEric Laurent    REGISTER_POLICY_MIXES,
74554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    START_AUDIO_SOURCE,
75e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    STOP_AUDIO_SOURCE,
76e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    SET_AUDIO_PORT_CALLBACK_ENABLED,
77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
791d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024
801d670b11313250442455a22f1056ad649d607fb2Eric Laurent
81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
84090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioPolicyService(const sp<IBinder>& impl)
85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
90fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
91fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
92e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_address,
93e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_name)
94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
100e743a47f445f02a0612018fa5640301304844fbfPaul McLean        data.writeCString(device_name);
101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
105fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
106fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
117f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
126fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
136fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
142fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getOutput(
146fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_stream_type_t stream,
147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t samplingRate,
14858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format,
149254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                        audio_channel_mask_t channelMask,
150ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        audio_output_flags_t flags,
151ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        const audio_offload_info_t *offloadInfo)
152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
158254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(flags));
1602301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // hasOffloadInfo
161b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
162b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
164b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
165b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
166b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
168fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual status_t getOutputForAttr(const audio_attributes_t *attr,
172e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_io_handle_t *output,
173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session,
174e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_stream_type_t *stream,
1758c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                        uid_t uid,
176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        uint32_t samplingRate,
177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_format_t format,
178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_channel_mask_t channelMask,
179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_output_flags_t flags,
180aa9811945f575614b3482d09e4d969792701cebbPaul McLean                                        audio_port_handle_t selectedDeviceId,
181e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        const audio_offload_info_t *offloadInfo)
1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1855bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (stream == NULL) {
187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr(): NULL audio attributes and stream type");
188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (*stream == AUDIO_STREAM_DEFAULT) {
191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr unspecified stream type");
192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (output == NULL) {
196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                ALOGE("getOutputForAttr NULL output - shouldn't happen");
197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return BAD_VALUE;
198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (attr == NULL) {
200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.write(attr, sizeof(audio_attributes_t));
204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            data.writeInt32(session);
206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream == NULL) {
207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
210e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(*stream);
2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
2128c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            data.writeInt32(uid);
2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(samplingRate);
2145bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(format));
2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(channelMask);
2165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
217aa9811945f575614b3482d09e4d969792701cebbPaul McLean            data.writeInt32(selectedDeviceId);
2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            // hasOffloadInfo
2195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (offloadInfo == NULL) {
2205bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(0);
2215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            } else {
2225bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(1);
2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.write(offloadInfo, sizeof(audio_offload_info_t));
2245bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status = (status_t)reply.readInt32();
230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            *output = (audio_io_handle_t)reply.readInt32();
234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream != NULL) {
235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                *stream = (audio_stream_type_t)reply.readInt32();
236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return status;
2385bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
2395bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
240de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
241fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                 audio_session_t session)
243c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
246fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
247fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
248e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
249c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
253de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
254fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
255e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                audio_session_t session)
256c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
259fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
260fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
266e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual void releaseOutput(audio_io_handle_t output,
267e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_stream_type_t stream,
268e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_session_t session)
269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
272fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
273e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)stream);
274e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    virtual status_t getInputForAttr(const audio_attributes_t *attr,
279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_io_handle_t *input,
280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_session_t session,
2818c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                     uid_t uid,
282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     uint32_t samplingRate,
283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_format_t format,
284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_channel_mask_t channelMask,
285466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                     audio_input_flags_t flags,
286466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                     audio_port_handle_t selectedDeviceId)
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
289c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (attr == NULL) {
291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL attr - shouldn't happen");
292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (input == NULL) {
295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL input - shouldn't happen");
296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.write(attr, sizeof(audio_attributes_t));
299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.writeInt32(session);
3008c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent        data.writeInt32(uid);
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
302c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
303254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
304b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
305466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean        data.writeInt32(selectedDeviceId);
306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
307caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
309caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status = reply.readInt32();
311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        *input = (audio_io_handle_t)reply.readInt32();
315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_ERROR;
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3184dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t startInput(audio_io_handle_t input,
3194dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                audio_session_t session)
320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
323fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3244dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3294dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t stopInput(audio_io_handle_t input,
3304dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                               audio_session_t session)
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
334fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3354dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual void releaseInput(audio_io_handle_t input,
3414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                              audio_session_t session)
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
345fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3464dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
350fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
36383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
36483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
36583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
37183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
37683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
37783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
37883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
38483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
390de070137f11d346fba77605bd76a44c040a618fcEric Laurent
391fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
392de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
393de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
394de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
395de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
396de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
397de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
398de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
399de070137f11d346fba77605bd76a44c040a618fcEric Laurent
4006374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
4016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
4026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
4036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
4046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
4056b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
4066374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
4076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
4086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
40958e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
410de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
411de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
412de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
413de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
414de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
415de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
416de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
417de070137f11d346fba77605bd76a44c040a618fcEric Laurent
41858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
4197c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
420de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
421de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int session,
422de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
423de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
424de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
425de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
426de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
4277c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
428de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
429de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
430de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
431de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
432de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
433de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
434de070137f11d346fba77605bd76a44c040a618fcEric Laurent
435de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
436de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
437de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
438de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
439de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
440de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
441de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
442de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
443de070137f11d346fba77605bd76a44c040a618fcEric Laurent
444db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
445db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
446db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
447db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
448db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
449db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
450db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
451db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
452db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
453db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
454fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
455eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
456eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
457eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
458fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
459eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
460eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
461eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
462eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
46357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
464272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
465272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
466272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
467272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
468272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
469272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
470272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
471272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
472272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
473272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
474d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
475d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
476d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
477d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
478d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
479d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
480d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
481d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
482d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
49857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
49957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
50057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
50157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
50257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
507ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
508ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
509ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
510b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
511b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
512b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
513b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, 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(handle, sizeof(audio_patch_handle_t));
583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
642b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
643b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
644b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
645b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
646f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
647b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
648b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
650e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    virtual void setAudioPortCallbacksEnabled(bool enabled)
651e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    {
652e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        Parcel data, reply;
653e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
654e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        data.writeInt32(enabled ? 1 : 0);
655e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
656e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent    }
657e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent
658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t acquireSoundTriggerSession(audio_session_t *session,
659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_io_handle_t *ioHandle,
660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_devices_t *device)
661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (session == NULL || ioHandle == NULL || device == NULL) {
663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return BAD_VALUE;
664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status = (status_t)reply.readInt32();
672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status == NO_ERROR) {
673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *session = (audio_session_t)reply.readInt32();
674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *ioHandle = (audio_io_handle_t)reply.readInt32();
675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *device = (audio_devices_t)reply.readInt32();
676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return status;
678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t releaseSoundTriggerSession(audio_session_t session)
681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInt32(session);
685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return (status_t)reply.readInt32();
690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
691bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
692bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    virtual audio_mode_t getPhoneState()
693bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    {
694bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        Parcel data, reply;
695bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
696bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
697bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        if (status != NO_ERROR) {
698bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return AUDIO_MODE_INVALID;
699bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        }
700bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        return (audio_mode_t)reply.readInt32();
701bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    }
702baac183f3808d7b68f184647a97bd381620415feEric Laurent
703baac183f3808d7b68f184647a97bd381620415feEric Laurent    virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
704baac183f3808d7b68f184647a97bd381620415feEric Laurent    {
705baac183f3808d7b68f184647a97bd381620415feEric Laurent        Parcel data, reply;
706baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
707baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(registration ? 1 : 0);
708baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t size = mixes.size();
709baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size > MAX_MIXES_PER_POLICY) {
710baac183f3808d7b68f184647a97bd381620415feEric Laurent            size = MAX_MIXES_PER_POLICY;
711baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
712baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t sizePosition = data.dataPosition();
713baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(size);
714baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t finalSize = size;
715baac183f3808d7b68f184647a97bd381620415feEric Laurent        for (size_t i = 0; i < size; i++) {
716baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
717baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (mixes[i].writeToParcel(&data) != NO_ERROR) {
718baac183f3808d7b68f184647a97bd381620415feEric Laurent                data.setDataPosition(position);
719baac183f3808d7b68f184647a97bd381620415feEric Laurent                finalSize--;
720baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
721baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
722baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size != finalSize) {
723baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
724baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(sizePosition);
725baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.writeInt32(finalSize);
726baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(position);
727baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
728baac183f3808d7b68f184647a97bd381620415feEric Laurent        status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
729baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (status == NO_ERROR) {
730baac183f3808d7b68f184647a97bd381620415feEric Laurent            status = (status_t)reply.readInt32();
731baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
732baac183f3808d7b68f184647a97bd381620415feEric Laurent        return status;
733baac183f3808d7b68f184647a97bd381620415feEric Laurent    }
734554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
735554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    virtual status_t startAudioSource(const struct audio_port_config *source,
736554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                      const audio_attributes_t *attributes,
737554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                      audio_io_handle_t *handle)
738554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
739554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
740554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
741554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (source == NULL || attributes == NULL || handle == NULL) {
742554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return BAD_VALUE;
743554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
744554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(source, sizeof(struct audio_port_config));
745554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(attributes, sizeof(audio_attributes_t));
746554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
747554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
748554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
749554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
750554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
751554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        *handle = (audio_io_handle_t)reply.readInt32();
755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
756554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    virtual status_t stopAudioSource(audio_io_handle_t handle)
759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInt32(handle);
763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
770c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
771c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
773c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
774c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
775c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
777c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
779c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
780e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
781c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
782c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
783fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
784fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
785fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
786fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
787c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
788e743a47f445f02a0612018fa5640301304844fbfPaul McLean            const char *device_name = data.readCString();
789de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
790de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              state,
791e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_address,
792e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_name)));
793c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
794c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
797c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
798fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
799fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
800c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
801de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
802de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
803c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
80885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
80985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
81585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
81685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
817fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
818fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
823c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
82585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
82685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
833fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
834fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
83658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
837254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
8380ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags =
8390ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                    static_cast <audio_output_flags_t>(data.readInt32());
840b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
841b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
842b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
843b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
844b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output = getOutput(stream,
846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 samplingRate,
847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 format,
848254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                                 channelMask,
849b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
850b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
851fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
8555bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
8565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
85785f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten            audio_attributes_t attr;
858e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasAttributes = data.readInt32() != 0;
859e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasAttributes) {
860e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.read(&attr, sizeof(audio_attributes_t));
861e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
862e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
863e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
864e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasStream = data.readInt32() != 0;
865e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasStream) {
866e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                stream = (audio_stream_type_t)data.readInt32();
867e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
8688c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
8695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            uint32_t samplingRate = data.readInt32();
8705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_format_t format = (audio_format_t) data.readInt32();
8715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_channel_mask_t channelMask = data.readInt32();
8725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
8735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
874aa9811945f575614b3482d09e4d969792701cebbPaul McLean            audio_port_handle_t selectedDeviceId = data.readInt32();
8755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            bool hasOffloadInfo = data.readInt32() != 0;
8765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_offload_info_t offloadInfo;
8775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (hasOffloadInfo) {
8785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.read(&offloadInfo, sizeof(audio_offload_info_t));
8795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
880a946d844a77906072f5eb7093d41db465d6514bbRobert Shih            audio_io_handle_t output = 0;
881e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = getOutputForAttr(hasAttributes ? &attr : NULL,
8828c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                    &output, session, &stream, uid,
883e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    samplingRate, format, channelMask,
884aa9811945f575614b3482d09e4d969792701cebbPaul McLean                    flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL);
885e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(status);
886e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(output);
887e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(stream);
8885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
8895bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
8905bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
893fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
894ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
895ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
896e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
897de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
898ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
899de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
900c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
902c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
905fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
906ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
907ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
908e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
909de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
910ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
911de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
917fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
918e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = (audio_stream_type_t)data.readInt32();
919e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
920e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            releaseOutput(output, stream, session);
921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
924caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        case GET_INPUT_FOR_ATTR: {
925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
926caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_attributes_t attr;
927caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            data.read(&attr, sizeof(audio_attributes_t));
928caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
9298c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
930c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
93158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
932254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
933b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
934466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean            audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
935983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            audio_io_handle_t input = {};
9368c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            status_t status = getInputForAttr(&attr, &input, session, uid,
937caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              samplingRate, format, channelMask,
938466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                              flags, selectedDeviceId);
939caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            reply->writeInt32(status);
940caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            if (status == NO_ERROR) {
941caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                reply->writeInt32(input);
942caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            }
943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
945c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
948fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9504dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
952c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
956fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9574dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9584dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
959c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
961c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
962c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
963c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
964fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9654dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9664dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            releaseInput(input, session);
967c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
968c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
970c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
972fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
973fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
976c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
977c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
978c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
982fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
983fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
984c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
98583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
98683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
98783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
98883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
989c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
994fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
995fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
99683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
997892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih            int index = 0;
99883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1002c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1003c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1004de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
1005de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1006fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1007fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
1008de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
1009de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent
10126b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
10136b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1014fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1015fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
10166b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
10176b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
10186b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
10196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
1020de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
1021de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1022de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
1023de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1024de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1027de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1028de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1029de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
1032de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
10337c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
1034de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
1035de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
1036de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1037de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
10387c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
1039de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
1040de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
1041de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
1042de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1043de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1044de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1045de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
1046de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1047de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1048de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1049de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1050de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1051de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1052db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
1053db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1054db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
1055db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
1056db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1057db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
1058db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
1059db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
1060eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
1061eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1062fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1063eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
1064ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
1065eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
1066eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
1067eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
1068272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
1069272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1070272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1071272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
1072ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
1073272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
1074272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
1075272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
1076d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
1077d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1078d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
1079d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
1080d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
1081d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
1082d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
108357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
108457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
108557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            int audioSession = data.readInt32();
108657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
108774adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (count > AudioEffect::kMaxPreProcessing) {
108874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent                count = AudioEffect::kMaxPreProcessing;
108974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            }
109057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
109174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            effect_descriptor_t *descriptors = new effect_descriptor_t[count];
109257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
109357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
109457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
109557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
109657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
109757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
109874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (retCount != 0) {
109957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
110057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
110157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
110257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
110357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
110457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
110557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
110657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
110757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
1108b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
1109b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1110b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t info;
1111b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
1112b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
1113b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
1114b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
1115b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
1116b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
1117203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
1118203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1119203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
1120203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
1121203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
11221d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
11231d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
11241d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1125203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
1126203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
1127203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
11281d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (ports == NULL) {
11291d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
11301d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
11311d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
11321d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
11331d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1134203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1135203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1136203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
1137203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1138203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1139203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
1140203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
1141203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1142203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1143203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1144203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1145203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
1146203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1147203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1148203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1149203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
1150203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1151e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1152e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1153e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23912202");
1154e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1158203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
1159203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1160203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
1164203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1165203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch patch;
1166203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1167e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_patch_handle_t handle = {};
1168e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1169e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23912202");
1170e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1171203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
1172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
1175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1176203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1177203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1178203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1179203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
1180203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1181203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1183203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
1184203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1185203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1186203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1187203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1188203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
1189203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1190203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
11911d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
11921d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
11931d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
11981d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (patches == NULL) {
11991d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
12001d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
12011d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
12021d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
12031d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1204203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
1205203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1206203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
1207203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1208203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
1209203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
1210203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1211203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1213203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1214203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
1215203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1216203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1217203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1218203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
1219203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1220203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port_config config;
1221203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
1222203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
1223203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1224203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1225203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1226df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1227b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
1228b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1229b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1230b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
1231b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
1232b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
1233b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
1234203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1235e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        case SET_AUDIO_PORT_CALLBACK_ENABLED: {
1236e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1237e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            setAudioPortCallbacksEnabled(data.readInt32() == 1);
1238e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent            return NO_ERROR;
1239e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent        } break;
1240e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent
1241df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION: {
1242df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1243df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1244df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1245983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            audio_session_t session = {};
1246983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            audio_io_handle_t ioHandle = {};
1247983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            audio_devices_t device = {};
1248df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
1249df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1250df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            if (status == NO_ERROR) {
1251df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(session);
1252df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(ioHandle);
1253df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(device);
1254df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            }
1255df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1256df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1257df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1258df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case RELEASE_SOUNDTRIGGER_SESSION: {
1259df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1260df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1261df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1262df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1263df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = releaseSoundTriggerSession(session);
1264df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1265df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1266df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1267df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1268bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        case GET_PHONE_STATE: {
1269bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1270bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            reply->writeInt32((int32_t)getPhoneState());
1271bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return NO_ERROR;
1272bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        } break;
1273bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
1274baac183f3808d7b68f184647a97bd381620415feEric Laurent        case REGISTER_POLICY_MIXES: {
1275baac183f3808d7b68f184647a97bd381620415feEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1276baac183f3808d7b68f184647a97bd381620415feEric Laurent            bool registration = data.readInt32() == 1;
1277baac183f3808d7b68f184647a97bd381620415feEric Laurent            Vector<AudioMix> mixes;
1278baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t size = (size_t)data.readInt32();
1279baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (size > MAX_MIXES_PER_POLICY) {
1280baac183f3808d7b68f184647a97bd381620415feEric Laurent                size = MAX_MIXES_PER_POLICY;
1281baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1282baac183f3808d7b68f184647a97bd381620415feEric Laurent            for (size_t i = 0; i < size; i++) {
1283baac183f3808d7b68f184647a97bd381620415feEric Laurent                AudioMix mix;
1284baac183f3808d7b68f184647a97bd381620415feEric Laurent                if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
1285baac183f3808d7b68f184647a97bd381620415feEric Laurent                    mixes.add(mix);
1286baac183f3808d7b68f184647a97bd381620415feEric Laurent                }
1287baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1288baac183f3808d7b68f184647a97bd381620415feEric Laurent            status_t status = registerPolicyMixes(mixes, registration);
1289baac183f3808d7b68f184647a97bd381620415feEric Laurent            reply->writeInt32(status);
1290baac183f3808d7b68f184647a97bd381620415feEric Laurent            return NO_ERROR;
1291baac183f3808d7b68f184647a97bd381620415feEric Laurent        } break;
1292baac183f3808d7b68f184647a97bd381620415feEric Laurent
1293554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case START_AUDIO_SOURCE: {
1294554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1295554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            struct audio_port_config source;
1296554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&source, sizeof(struct audio_port_config));
1297554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            audio_attributes_t attributes;
1298554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&attributes, sizeof(audio_attributes_t));
1299e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_io_handle_t handle = {};
1300554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = startAudioSource(&source, &attributes, &handle);
1301554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1302554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(handle);
1303554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1304554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1305554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
1306554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case STOP_AUDIO_SOURCE: {
1307554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1308554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            audio_io_handle_t handle = (audio_io_handle_t)data.readInt32();
1309554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = stopAudioSource(handle);
1310554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1311554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1312554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1313554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
1314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
1315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
1316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
1317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
1318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
132140bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1322