IAudioPolicyService.cpp revision 8c7e6dac6f5eb38cef627dab92eac8b38513450c
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,
75554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    STOP_AUDIO_SOURCE
76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
781d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024
791d670b11313250442455a22f1056ad649d607fb2Eric Laurent
80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    BpAudioPolicyService(const sp<IBinder>& impl)
84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
89fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
90fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
91e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_address,
92e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_name)
93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
99e743a47f445f02a0612018fa5640301304844fbfPaul McLean        data.writeCString(device_name);
100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
104fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
105fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
113fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
116f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
125fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
135fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
141fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getOutput(
145fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_stream_type_t stream,
146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t samplingRate,
14758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format,
148254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                        audio_channel_mask_t channelMask,
149ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        audio_output_flags_t flags,
150ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        const audio_offload_info_t *offloadInfo)
151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
157254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(flags));
1592301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // hasOffloadInfo
160b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
161b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
162b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
164b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
165b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
167fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
170e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual status_t getOutputForAttr(const audio_attributes_t *attr,
171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_io_handle_t *output,
172e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session,
173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_stream_type_t *stream,
1748c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                        uid_t uid,
175e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        uint32_t samplingRate,
176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_format_t format,
177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_channel_mask_t channelMask,
178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_output_flags_t flags,
179aa9811945f575614b3482d09e4d969792701cebbPaul McLean                                        audio_port_handle_t selectedDeviceId,
180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        const audio_offload_info_t *offloadInfo)
1815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
185e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (stream == NULL) {
186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr(): NULL audio attributes and stream type");
187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (*stream == AUDIO_STREAM_DEFAULT) {
190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr unspecified stream type");
191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (output == NULL) {
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                ALOGE("getOutputForAttr NULL output - shouldn't happen");
196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return BAD_VALUE;
197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (attr == NULL) {
199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.write(attr, sizeof(audio_attributes_t));
203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            data.writeInt32(session);
205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream == NULL) {
206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(*stream);
2105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
2118c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            data.writeInt32(uid);
2125bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(samplingRate);
2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(format));
2145bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(channelMask);
2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
216aa9811945f575614b3482d09e4d969792701cebbPaul McLean            data.writeInt32(selectedDeviceId);
2175bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            // hasOffloadInfo
2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (offloadInfo == NULL) {
2195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(0);
2205bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            } else {
2215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(1);
2225bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.write(offloadInfo, sizeof(audio_offload_info_t));
2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status = (status_t)reply.readInt32();
229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            *output = (audio_io_handle_t)reply.readInt32();
233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream != NULL) {
234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                *stream = (audio_stream_type_t)reply.readInt32();
235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return status;
2375bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
2385bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
239de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
240fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
241e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                 audio_session_t session)
242c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
243c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
245fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
246fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
247e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
248c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
249c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
252de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
253fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
254e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                audio_session_t session)
255c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
256c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
258fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
260e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
261c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
265e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual void releaseOutput(audio_io_handle_t output,
266e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_stream_type_t stream,
267e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_session_t session)
268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
271fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
272e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)stream);
273e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    virtual status_t getInputForAttr(const audio_attributes_t *attr,
278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_io_handle_t *input,
279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_session_t session,
2808c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                     uid_t uid,
281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     uint32_t samplingRate,
282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_format_t format,
283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_channel_mask_t channelMask,
284466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                     audio_input_flags_t flags,
285466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                     audio_port_handle_t selectedDeviceId)
286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
289caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (attr == NULL) {
290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL attr - shouldn't happen");
291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (input == NULL) {
294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL input - shouldn't happen");
295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.write(attr, sizeof(audio_attributes_t));
298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.writeInt32(session);
2998c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent        data.writeInt32(uid);
300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
302254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
303b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
304466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean        data.writeInt32(selectedDeviceId);
305caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
307caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
309caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status = reply.readInt32();
310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        *input = (audio_io_handle_t)reply.readInt32();
314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_ERROR;
315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3174dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t startInput(audio_io_handle_t input,
3184dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                audio_session_t session)
319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
322fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3234dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3284dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t stopInput(audio_io_handle_t input,
3294dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                               audio_session_t session)
330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
333fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3344dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3394dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual void releaseInput(audio_io_handle_t input,
3404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                              audio_session_t session)
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
344fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3454dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
349fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
36283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
36383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
36483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
37083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
37583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
37683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
37783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
38283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
389de070137f11d346fba77605bd76a44c040a618fcEric Laurent
390fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
391de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
392de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
393de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
394de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
395de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
396de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
397de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
398de070137f11d346fba77605bd76a44c040a618fcEric Laurent
3996374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
4006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
4016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
4026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
4036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
4046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
4056374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
4066b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
4076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
40858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
409de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
410de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
411de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
412de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
413de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
414de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
415de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
416de070137f11d346fba77605bd76a44c040a618fcEric Laurent
41758e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
4187c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
419de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
420de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int session,
421de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
422de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
423de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
424de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
425de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
4267c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
427de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
428de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
429de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
430de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
431de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
432de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
433de070137f11d346fba77605bd76a44c040a618fcEric Laurent
434de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
435de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
436de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
437de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
438de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
439de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
440de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
441de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
442de070137f11d346fba77605bd76a44c040a618fcEric Laurent
443db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
444db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
445db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
446db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
447db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
448db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
449db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
450db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
451db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
452db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
453fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
454eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
455eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
456eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
457fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
458eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
459eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
460eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
461eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
46257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
463272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
464272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
465272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
466272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
467272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
468272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
469272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
470272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
471272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
472272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
473d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
474d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
475d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
476d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
477d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
478d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
479d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
480d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
481d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
49857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
49957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
50057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
50157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
50257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
506ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
507ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
508ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
509b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
510b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
511b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
512b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
640df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
641b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
642b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
643b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
644b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
645f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
646b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
647b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t acquireSoundTriggerSession(audio_session_t *session,
650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_io_handle_t *ioHandle,
651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_devices_t *device)
652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (session == NULL || ioHandle == NULL || device == NULL) {
654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return BAD_VALUE;
655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status = (status_t)reply.readInt32();
663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status == NO_ERROR) {
664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *session = (audio_session_t)reply.readInt32();
665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *ioHandle = (audio_io_handle_t)reply.readInt32();
666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *device = (audio_devices_t)reply.readInt32();
667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return status;
669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t releaseSoundTriggerSession(audio_session_t session)
672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInt32(session);
676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return (status_t)reply.readInt32();
681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
682bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
683bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    virtual audio_mode_t getPhoneState()
684bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    {
685bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        Parcel data, reply;
686bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
687bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
688bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        if (status != NO_ERROR) {
689bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return AUDIO_MODE_INVALID;
690bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        }
691bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        return (audio_mode_t)reply.readInt32();
692bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    }
693baac183f3808d7b68f184647a97bd381620415feEric Laurent
694baac183f3808d7b68f184647a97bd381620415feEric Laurent    virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
695baac183f3808d7b68f184647a97bd381620415feEric Laurent    {
696baac183f3808d7b68f184647a97bd381620415feEric Laurent        Parcel data, reply;
697baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
698baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(registration ? 1 : 0);
699baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t size = mixes.size();
700baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size > MAX_MIXES_PER_POLICY) {
701baac183f3808d7b68f184647a97bd381620415feEric Laurent            size = MAX_MIXES_PER_POLICY;
702baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
703baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t sizePosition = data.dataPosition();
704baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(size);
705baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t finalSize = size;
706baac183f3808d7b68f184647a97bd381620415feEric Laurent        for (size_t i = 0; i < size; i++) {
707baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
708baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (mixes[i].writeToParcel(&data) != NO_ERROR) {
709baac183f3808d7b68f184647a97bd381620415feEric Laurent                data.setDataPosition(position);
710baac183f3808d7b68f184647a97bd381620415feEric Laurent                finalSize--;
711baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
712baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
713baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size != finalSize) {
714baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
715baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(sizePosition);
716baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.writeInt32(finalSize);
717baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(position);
718baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
719baac183f3808d7b68f184647a97bd381620415feEric Laurent        status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
720baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (status == NO_ERROR) {
721baac183f3808d7b68f184647a97bd381620415feEric Laurent            status = (status_t)reply.readInt32();
722baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
723baac183f3808d7b68f184647a97bd381620415feEric Laurent        return status;
724baac183f3808d7b68f184647a97bd381620415feEric Laurent    }
725554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
726554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    virtual status_t startAudioSource(const struct audio_port_config *source,
727554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                      const audio_attributes_t *attributes,
728554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                      audio_io_handle_t *handle)
729554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
730554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
731554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
732554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (source == NULL || attributes == NULL || handle == NULL) {
733554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return BAD_VALUE;
734554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
735554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(source, sizeof(struct audio_port_config));
736554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.write(attributes, sizeof(audio_attributes_t));
737554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply);
738554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
739554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
740554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
741554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
742554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
743554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
744554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
745554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        *handle = (audio_io_handle_t)reply.readInt32();
746554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
747554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
748554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
749554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    virtual status_t stopAudioSource(audio_io_handle_t handle)
750554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    {
751554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        Parcel data, reply;
752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        data.writeInt32(handle);
754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply);
755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        if (status != NO_ERROR) {
756554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return status;
757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        }
758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        status = (status_t)reply.readInt32();
759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        return status;
760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    }
761c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
762c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
764c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
765c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
766c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
768c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
769c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
770c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
771e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
773c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
774fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
775fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
776fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
777fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
779e743a47f445f02a0612018fa5640301304844fbfPaul McLean            const char *device_name = data.readCString();
780de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
781de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              state,
782e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_address,
783e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_name)));
784c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
785c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
786c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
787c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
788c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
789fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
790fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
791c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
792de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
793de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
794c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
797c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
798c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
79985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
80085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
801c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
802c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
803c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
80685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
80785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
808fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
809fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
81685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
81785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
823c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
824fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
825fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
82758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
828254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
8290ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags =
8300ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                    static_cast <audio_output_flags_t>(data.readInt32());
831b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
832b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
833b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
834b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
835b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output = getOutput(stream,
837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 samplingRate,
838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 format,
839254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                                 channelMask,
840b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
841b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
842fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
843c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
844c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
8465bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
8475bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
84885f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten            audio_attributes_t attr;
849e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasAttributes = data.readInt32() != 0;
850e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasAttributes) {
851e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.read(&attr, sizeof(audio_attributes_t));
852e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
853e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
854e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
855e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasStream = data.readInt32() != 0;
856e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasStream) {
857e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                stream = (audio_stream_type_t)data.readInt32();
858e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
8598c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
8605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            uint32_t samplingRate = data.readInt32();
8615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_format_t format = (audio_format_t) data.readInt32();
8625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_channel_mask_t channelMask = data.readInt32();
8635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
8645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
865aa9811945f575614b3482d09e4d969792701cebbPaul McLean            audio_port_handle_t selectedDeviceId = data.readInt32();
8665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            bool hasOffloadInfo = data.readInt32() != 0;
8675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_offload_info_t offloadInfo;
8685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (hasOffloadInfo) {
8695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.read(&offloadInfo, sizeof(audio_offload_info_t));
8705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
871e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_io_handle_t output;
872e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = getOutputForAttr(hasAttributes ? &attr : NULL,
8738c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                    &output, session, &stream, uid,
874e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    samplingRate, format, channelMask,
875aa9811945f575614b3482d09e4d969792701cebbPaul McLean                    flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL);
876e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(status);
877e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(output);
878e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(stream);
8795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
8805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
8815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
884fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
885ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
886ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
887e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
888de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
889ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
890de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
894c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
896fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
897ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
898ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
899e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
900de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
901ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
902de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
906c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
907c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
908fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
909e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = (audio_stream_type_t)data.readInt32();
910e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
911e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            releaseOutput(output, stream, session);
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
915caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        case GET_INPUT_FOR_ATTR: {
916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
917caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_attributes_t attr;
918caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            data.read(&attr, sizeof(audio_attributes_t));
919caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
9208c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            uid_t uid = (uid_t)data.readInt32();
921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
92258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
923254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
924b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
925466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean            audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
926caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_io_handle_t input;
9278c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent            status_t status = getInputForAttr(&attr, &input, session, uid,
928caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              samplingRate, format, channelMask,
929466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                              flags, selectedDeviceId);
930caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            reply->writeInt32(status);
931caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            if (status == NO_ERROR) {
932caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                reply->writeInt32(input);
933caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            }
934c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
935c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
936c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
938c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
939fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
942c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
945c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
947fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
952c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
955fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9564dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9574dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            releaseInput(input, session);
958c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
959c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
961c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
962c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
963fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
964fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
965c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
966c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
967c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
968c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
970c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
972c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
973fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
974fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
97683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
97783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
97883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
97983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
982c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
983c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
984c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
985fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
986fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
98783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
988c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index;
98983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
994c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
995de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
996de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
997fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
998fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
999de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
1000de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1001de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1002de070137f11d346fba77605bd76a44c040a618fcEric Laurent
10036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
10046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1005fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
1006fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
10076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
10086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
10096b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
10106b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
1012de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1013de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
1014de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1015de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
1016de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
1017de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1018de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1019de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1020de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
1021de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1022de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
1023de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
10247c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
1027de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1028de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
10297c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
1032de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
1033de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1034de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1035de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1036de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
1037de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1038de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
1039de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
1040de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1041de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1042de070137f11d346fba77605bd76a44c040a618fcEric Laurent
1043db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
1044db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1045db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
1046db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
1047db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1048db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
1049db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
1050db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
1051eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
1052eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1053fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1054eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
1055ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
1056eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
1057eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
1058eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
1059272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
1060272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1061272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1062272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
1063ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
1064272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
1065272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
1066272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
1067d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
1068d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1069d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
1070d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
1071d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
1072d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
1073d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
107457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
107557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
107657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            int audioSession = data.readInt32();
107757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
107874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (count > AudioEffect::kMaxPreProcessing) {
107974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent                count = AudioEffect::kMaxPreProcessing;
108074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            }
108157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
108274adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            effect_descriptor_t *descriptors = new effect_descriptor_t[count];
108357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
108457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
108557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
108657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
108757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
108857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
108974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (retCount != 0) {
109057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
109157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
109257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
109357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
109457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
109557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
109657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
109757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
109857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
1099b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
1100b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1101b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t info;
1102b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
1103b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
1104b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
1105b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
1106b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
1107b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
1108203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
1109203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1110203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
1111203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
1112203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
11131d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
11141d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
11151d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1116203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
1117203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
1118203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
11191d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (ports == NULL) {
11201d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
11211d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
11221d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
11231d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
11241d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1125203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1126203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1127203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
1128203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1129203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1130203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
1131203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
1132203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1133203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1134203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1135203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1136203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
1137203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1138203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1139203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1140203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
1141203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1142203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port port;
1143203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&port, sizeof(struct audio_port));
1144203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
1145203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1146203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1147203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
1148203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1149203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1150203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1151203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1152203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
1153203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1154203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch patch;
1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1158203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
1159203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1160203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1164203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1165203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1166203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
1167203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1168203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1169203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1170203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
1171203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
1176203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1177203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
11781d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
11791d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
11801d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1181203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
1182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
1183203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
1184203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
11851d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (patches == NULL) {
11861d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
11871d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
11881d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
11891d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
11901d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1191203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
1192203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1193203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1198203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1199203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1200203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1201203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
1202203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1203203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1204203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1205203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
1206203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1207203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port_config config;
1208203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
1209203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
1210203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1211203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1213df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1214b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
1215b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1216b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1217b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
1218b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
1219b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
1220b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
1221203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1222df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION: {
1223df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1224df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1225df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1226df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session;
1227df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_io_handle_t ioHandle;
1228df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_devices_t device;
1229df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
1230df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1231df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            if (status == NO_ERROR) {
1232df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(session);
1233df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(ioHandle);
1234df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(device);
1235df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            }
1236df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1237df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1238df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1239df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case RELEASE_SOUNDTRIGGER_SESSION: {
1240df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1241df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1242df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1243df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1244df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = releaseSoundTriggerSession(session);
1245df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1246df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1247df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1248df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1249bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        case GET_PHONE_STATE: {
1250bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1251bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            reply->writeInt32((int32_t)getPhoneState());
1252bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return NO_ERROR;
1253bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        } break;
1254bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
1255baac183f3808d7b68f184647a97bd381620415feEric Laurent        case REGISTER_POLICY_MIXES: {
1256baac183f3808d7b68f184647a97bd381620415feEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1257baac183f3808d7b68f184647a97bd381620415feEric Laurent            bool registration = data.readInt32() == 1;
1258baac183f3808d7b68f184647a97bd381620415feEric Laurent            Vector<AudioMix> mixes;
1259baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t size = (size_t)data.readInt32();
1260baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (size > MAX_MIXES_PER_POLICY) {
1261baac183f3808d7b68f184647a97bd381620415feEric Laurent                size = MAX_MIXES_PER_POLICY;
1262baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1263baac183f3808d7b68f184647a97bd381620415feEric Laurent            for (size_t i = 0; i < size; i++) {
1264baac183f3808d7b68f184647a97bd381620415feEric Laurent                AudioMix mix;
1265baac183f3808d7b68f184647a97bd381620415feEric Laurent                if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
1266baac183f3808d7b68f184647a97bd381620415feEric Laurent                    mixes.add(mix);
1267baac183f3808d7b68f184647a97bd381620415feEric Laurent                }
1268baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1269baac183f3808d7b68f184647a97bd381620415feEric Laurent            status_t status = registerPolicyMixes(mixes, registration);
1270baac183f3808d7b68f184647a97bd381620415feEric Laurent            reply->writeInt32(status);
1271baac183f3808d7b68f184647a97bd381620415feEric Laurent            return NO_ERROR;
1272baac183f3808d7b68f184647a97bd381620415feEric Laurent        } break;
1273baac183f3808d7b68f184647a97bd381620415feEric Laurent
1274554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case START_AUDIO_SOURCE: {
1275554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1276554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            struct audio_port_config source;
1277554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&source, sizeof(struct audio_port_config));
1278554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            audio_attributes_t attributes;
1279554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            data.read(&attributes, sizeof(audio_attributes_t));
1280554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            audio_io_handle_t handle;
1281554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = startAudioSource(&source, &attributes, &handle);
1282554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1283554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(handle);
1284554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1285554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1286554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
1287554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        case STOP_AUDIO_SOURCE: {
1288554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1289554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            audio_io_handle_t handle = (audio_io_handle_t)data.readInt32();
1290554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            status_t status = stopAudioSource(handle);
1291554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            reply->writeInt32(status);
1292554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent            return NO_ERROR;
1293554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent        } break;
1294554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
1295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
1296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
1297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
1298c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
1299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
130240bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1303