IAudioPolicyService.cpp revision aa9811945f575614b3482d09e4d969792701cebb
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,
74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
761d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024
771d670b11313250442455a22f1056ad649d607fb2Eric Laurent
78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    BpAudioPolicyService(const sp<IBinder>& impl)
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
87fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
88fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
89e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_address,
90e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                    const char *device_name)
91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
97e743a47f445f02a0612018fa5640301304844fbfPaul McLean        data.writeCString(device_name);
98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
102fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
103fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
111fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
114f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
123fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
133fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
139fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getOutput(
143fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_stream_type_t stream,
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t samplingRate,
14558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format,
146254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                        audio_channel_mask_t channelMask,
147ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        audio_output_flags_t flags,
148ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        const audio_offload_info_t *offloadInfo)
149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
155254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(flags));
1572301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // hasOffloadInfo
158b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
159b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
160b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
161b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
162b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
164c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
165fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
168e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual status_t getOutputForAttr(const audio_attributes_t *attr,
169e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_io_handle_t *output,
170e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session,
171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_stream_type_t *stream,
172e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        uint32_t samplingRate,
173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_format_t format,
174e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_channel_mask_t channelMask,
175e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_output_flags_t flags,
176aa9811945f575614b3482d09e4d969792701cebbPaul McLean                                        audio_port_handle_t selectedDeviceId,
177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        const audio_offload_info_t *offloadInfo)
1785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
182e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (stream == NULL) {
183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr(): NULL audio attributes and stream type");
184e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
185e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (*stream == AUDIO_STREAM_DEFAULT) {
187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr unspecified stream type");
188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (output == NULL) {
192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                ALOGE("getOutputForAttr NULL output - shouldn't happen");
193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return BAD_VALUE;
194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (attr == NULL) {
196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.write(attr, sizeof(audio_attributes_t));
200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            data.writeInt32(session);
202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream == NULL) {
203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(*stream);
2075bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
2085bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(samplingRate);
2095bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(format));
2105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(channelMask);
2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
212aa9811945f575614b3482d09e4d969792701cebbPaul McLean            data.writeInt32(selectedDeviceId);
2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            // hasOffloadInfo
2145bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (offloadInfo == NULL) {
2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(0);
2165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            } else {
2175bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(1);
2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.write(offloadInfo, sizeof(audio_offload_info_t));
2195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status = (status_t)reply.readInt32();
225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            *output = (audio_io_handle_t)reply.readInt32();
229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream != NULL) {
230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                *stream = (audio_stream_type_t)reply.readInt32();
231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return status;
2335bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
2345bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
235de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
236fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                 audio_session_t session)
238c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
240c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
241fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
242fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
243e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
248de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
249fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
250e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                audio_session_t session)
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
254fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
255fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
256e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual void releaseOutput(audio_io_handle_t output,
262e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_stream_type_t stream,
263e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_session_t session)
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
267fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
268e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)stream);
269e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    virtual status_t getInputForAttr(const audio_attributes_t *attr,
274caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_io_handle_t *input,
275caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_session_t session,
276caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     uint32_t samplingRate,
277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_format_t format,
278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_channel_mask_t channelMask,
279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_input_flags_t flags)
280c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
281c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (attr == NULL) {
284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL attr - shouldn't happen");
285caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
286caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
287caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (input == NULL) {
288caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL input - shouldn't happen");
289caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.write(attr, sizeof(audio_attributes_t));
292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.writeInt32(session);
293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
295254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
296b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status = reply.readInt32();
302caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
303caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
304caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
305caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        *input = (audio_io_handle_t)reply.readInt32();
306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_ERROR;
307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t startInput(audio_io_handle_t input,
3104dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                audio_session_t session)
311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
314fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3154dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3204dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t stopInput(audio_io_handle_t input,
3214dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                               audio_session_t session)
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
325fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3264dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3314dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual void releaseInput(audio_io_handle_t input,
3324dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                              audio_session_t session)
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
336fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3374dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
341fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
35483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
35583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
35683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
36283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
36783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
36883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
36983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
37483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
37583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
381de070137f11d346fba77605bd76a44c040a618fcEric Laurent
382fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
383de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
384de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
385de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
386de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
387de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
388de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
389de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
390de070137f11d346fba77605bd76a44c040a618fcEric Laurent
3916374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
3926b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
3936b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
3946b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
3966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
3976374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
3986b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
3996b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
40058e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
401de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
402de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
403de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
404de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
405de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
406de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
407de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
408de070137f11d346fba77605bd76a44c040a618fcEric Laurent
40958e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
4107c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
411de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
412de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int session,
413de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
414de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
415de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
416de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
417de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
4187c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
419de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
420de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
421de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
422de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
423de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
424de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
425de070137f11d346fba77605bd76a44c040a618fcEric Laurent
426de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
427de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
428de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
429de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
430de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
431de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
432de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
433de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
434de070137f11d346fba77605bd76a44c040a618fcEric Laurent
435db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
436db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
437db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
438db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
439db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
440db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
441db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
442db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
443db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
444db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
445fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
446eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
447eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
448eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
449fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
450eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
451eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
452eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
453eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
45457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
455272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
456272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
457272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
458272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
459272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
460272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
461272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
462272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
463272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
464272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
465d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
466d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
467d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
468d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
469d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
470d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
471d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
472d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
473d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
47457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
47557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
47657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
47757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
47857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
47957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
48057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
48157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
498ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
499ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
500ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
501b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
502b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
503b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
504b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
632df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
633b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
634b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
635b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
636b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
637f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
638b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
639b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
640df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t acquireSoundTriggerSession(audio_session_t *session,
642df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_io_handle_t *ioHandle,
643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_devices_t *device)
644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (session == NULL || ioHandle == NULL || device == NULL) {
646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return BAD_VALUE;
647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status = (status_t)reply.readInt32();
655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status == NO_ERROR) {
656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *session = (audio_session_t)reply.readInt32();
657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *ioHandle = (audio_io_handle_t)reply.readInt32();
658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *device = (audio_devices_t)reply.readInt32();
659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return status;
661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t releaseSoundTriggerSession(audio_session_t session)
664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInt32(session);
668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return (status_t)reply.readInt32();
673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
674bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
675bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    virtual audio_mode_t getPhoneState()
676bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    {
677bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        Parcel data, reply;
678bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
679bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
680bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        if (status != NO_ERROR) {
681bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return AUDIO_MODE_INVALID;
682bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        }
683bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        return (audio_mode_t)reply.readInt32();
684bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    }
685baac183f3808d7b68f184647a97bd381620415feEric Laurent
686baac183f3808d7b68f184647a97bd381620415feEric Laurent    virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
687baac183f3808d7b68f184647a97bd381620415feEric Laurent    {
688baac183f3808d7b68f184647a97bd381620415feEric Laurent        Parcel data, reply;
689baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
690baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(registration ? 1 : 0);
691baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t size = mixes.size();
692baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size > MAX_MIXES_PER_POLICY) {
693baac183f3808d7b68f184647a97bd381620415feEric Laurent            size = MAX_MIXES_PER_POLICY;
694baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
695baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t sizePosition = data.dataPosition();
696baac183f3808d7b68f184647a97bd381620415feEric Laurent        data.writeInt32(size);
697baac183f3808d7b68f184647a97bd381620415feEric Laurent        size_t finalSize = size;
698baac183f3808d7b68f184647a97bd381620415feEric Laurent        for (size_t i = 0; i < size; i++) {
699baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
700baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (mixes[i].writeToParcel(&data) != NO_ERROR) {
701baac183f3808d7b68f184647a97bd381620415feEric Laurent                data.setDataPosition(position);
702baac183f3808d7b68f184647a97bd381620415feEric Laurent                finalSize--;
703baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
704baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
705baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (size != finalSize) {
706baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t position = data.dataPosition();
707baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(sizePosition);
708baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.writeInt32(finalSize);
709baac183f3808d7b68f184647a97bd381620415feEric Laurent            data.setDataPosition(position);
710baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
711baac183f3808d7b68f184647a97bd381620415feEric Laurent        status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply);
712baac183f3808d7b68f184647a97bd381620415feEric Laurent        if (status == NO_ERROR) {
713baac183f3808d7b68f184647a97bd381620415feEric Laurent            status = (status_t)reply.readInt32();
714baac183f3808d7b68f184647a97bd381620415feEric Laurent        }
715baac183f3808d7b68f184647a97bd381620415feEric Laurent        return status;
716baac183f3808d7b68f184647a97bd381620415feEric Laurent    }
717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
722c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
723c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
724c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
727e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
730fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
731fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
732fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
733fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
735e743a47f445f02a0612018fa5640301304844fbfPaul McLean            const char *device_name = data.readCString();
736de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
737de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              state,
738e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_address,
739e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                                              device_name)));
740c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
741c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
742c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
744c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
745fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
746fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
747c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
748de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
749de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
750c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
751c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
752c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
754c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
75585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
75685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
757c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
761c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
76285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
76385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
764fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
765fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
766c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
768c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
769c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
770c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
771c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
77285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
77385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
774c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
775c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
777c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
779c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
780fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
781fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
782c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
78358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
784254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
7850ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags =
7860ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                    static_cast <audio_output_flags_t>(data.readInt32());
787b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
788b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
789b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
790b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
791b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
792c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output = getOutput(stream,
793c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 samplingRate,
794c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 format,
795254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                                 channelMask,
796b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
797b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
798fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
799c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
800c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
801c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
8025bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
8035bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
80485f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten            audio_attributes_t attr;
805e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasAttributes = data.readInt32() != 0;
806e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasAttributes) {
807e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.read(&attr, sizeof(audio_attributes_t));
808e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
809e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
810e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
811e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasStream = data.readInt32() != 0;
812e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasStream) {
813e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                stream = (audio_stream_type_t)data.readInt32();
814e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
8155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            uint32_t samplingRate = data.readInt32();
8165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_format_t format = (audio_format_t) data.readInt32();
8175bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_channel_mask_t channelMask = data.readInt32();
8185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
8195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
820aa9811945f575614b3482d09e4d969792701cebbPaul McLean            audio_port_handle_t selectedDeviceId = data.readInt32();
8215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            bool hasOffloadInfo = data.readInt32() != 0;
8225bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_offload_info_t offloadInfo;
8235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (hasOffloadInfo) {
8245bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.read(&offloadInfo, sizeof(audio_offload_info_t));
8255bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
826e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_io_handle_t output;
827e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = getOutputForAttr(hasAttributes ? &attr : NULL,
828e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    &output, session, &stream,
829e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    samplingRate, format, channelMask,
830aa9811945f575614b3482d09e4d969792701cebbPaul McLean                    flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL);
831e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(status);
832e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(output);
833e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(stream);
8345bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
8355bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
8365bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
839fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
840ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
841ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
842e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
843de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
844ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
845de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
851fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
852ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
853ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
854e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
855de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
856ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
857de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
859c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
860c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
863fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
864e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = (audio_stream_type_t)data.readInt32();
865e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
866e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            releaseOutput(output, stream, session);
867c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
870caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        case GET_INPUT_FOR_ATTR: {
871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
872caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_attributes_t attr;
873caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            data.read(&attr, sizeof(audio_attributes_t));
874caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
87658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
877254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
878b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
879caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_io_handle_t input;
880caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            status_t status = getInputForAttr(&attr, &input, session,
881caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              samplingRate, format, channelMask,
882caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              flags);
883caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            reply->writeInt32(status);
884caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            if (status == NO_ERROR) {
885caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                reply->writeInt32(input);
886caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            }
887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
892fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
8934dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
8944dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
900fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9014dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9024dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
906c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
907c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
908fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
9094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
9104dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            releaseInput(input, session);
911c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
916fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
917fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
918c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
919c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
920c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
926fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
927fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
928c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
92983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
93083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
93183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
93283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
933c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
934c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
935c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
936c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
938fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
939fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
94083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
941c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index;
94283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
945c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
948de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
949de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
950fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
951fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
952de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
953de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
954de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
955de070137f11d346fba77605bd76a44c040a618fcEric Laurent
9566b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
9576b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
958fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
959fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
9606b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
9616b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
9626b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
9636b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
964de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
965de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
966de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
967de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
968de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
969de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
970de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
971de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
972de070137f11d346fba77605bd76a44c040a618fcEric Laurent
973de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
974de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
975de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
976de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
9777c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
978de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
979de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
980de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
981de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
9827c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
983de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
984de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
985de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
986de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
987de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
988de070137f11d346fba77605bd76a44c040a618fcEric Laurent
989de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
990de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
991de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
992de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
993de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
994de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
995de070137f11d346fba77605bd76a44c040a618fcEric Laurent
996db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
997db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
998db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
999db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
1000db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
1001db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
1002db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
1003db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
1004eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
1005eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1006fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1007eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
1008ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
1009eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
1010eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
1011eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
1012272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
1013272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1014272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1015272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
1016ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
1017272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
1018272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
1019272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
1020d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
1021d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1022d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
1023d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
1024d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
1025d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
1026d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
102757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
102857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
102957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            int audioSession = data.readInt32();
103057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
103174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (count > AudioEffect::kMaxPreProcessing) {
103274adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent                count = AudioEffect::kMaxPreProcessing;
103374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            }
103457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
103574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            effect_descriptor_t *descriptors = new effect_descriptor_t[count];
103657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
103757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
103857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
103957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
104057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
104157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
104274adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (retCount != 0) {
104357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
104457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
104557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
104657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
104757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
104857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
104957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
105057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
105157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
1052b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
1053b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1054b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t info;
1055b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
1056b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
1057b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
1058b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
1059b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
1060b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
1061203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
1062203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1063203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
1064203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
1065203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
10661d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
10671d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
10681d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1069203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
1070203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
1071203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
10721d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (ports == NULL) {
10731d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
10741d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
10751d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
10761d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
10771d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1078203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1079203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1080203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
1081203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1082203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1083203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
1084203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
1085203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1086203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1087203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1088203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1089203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
1090203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1091203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1092203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1093203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
1094203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1095203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port port;
1096203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&port, sizeof(struct audio_port));
1097203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
1098203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1099203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1100203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
1101203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1102203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1103203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1104203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1105203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
1106203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1107203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch patch;
1108203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1109203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1110203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1111203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
1112203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1113203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1114203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
1115203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1116203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1117203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1118203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1119203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
1120203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1121203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1122203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1123203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
1124203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1125203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1126203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1127203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1128203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
1129203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1130203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
11311d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
11321d670b11313250442455a22f1056ad649d607fb2Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
11331d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
1134203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
1135203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
1136203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
1137203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
11381d670b11313250442455a22f1056ad649d607fb2Eric Laurent            if (patches == NULL) {
11391d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(NO_MEMORY);
11401d670b11313250442455a22f1056ad649d607fb2Eric Laurent                reply->writeInt32(0);
11411d670b11313250442455a22f1056ad649d607fb2Eric Laurent                return NO_ERROR;
11421d670b11313250442455a22f1056ad649d607fb2Eric Laurent            }
11431d670b11313250442455a22f1056ad649d607fb2Eric Laurent            unsigned int generation;
1144203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
1145203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1146203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
1147203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1148203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
1149203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
1150203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1151203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1152203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1153203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1154203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1158203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
1159203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1160203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port_config config;
1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1164203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1165203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1166df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1167b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
1168b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1169b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1170b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
1171b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
1172b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
1173b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1175df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION: {
1176df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1177df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1178df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1179df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session;
1180df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_io_handle_t ioHandle;
1181df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_devices_t device;
1182df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
1183df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1184df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            if (status == NO_ERROR) {
1185df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(session);
1186df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(ioHandle);
1187df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(device);
1188df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            }
1189df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1190df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1191df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1192df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case RELEASE_SOUNDTRIGGER_SESSION: {
1193df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1194df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1195df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1196df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1197df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = releaseSoundTriggerSession(session);
1198df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1199df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1200df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1201df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1202bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        case GET_PHONE_STATE: {
1203bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1204bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            reply->writeInt32((int32_t)getPhoneState());
1205bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return NO_ERROR;
1206bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        } break;
1207bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
1208baac183f3808d7b68f184647a97bd381620415feEric Laurent        case REGISTER_POLICY_MIXES: {
1209baac183f3808d7b68f184647a97bd381620415feEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1210baac183f3808d7b68f184647a97bd381620415feEric Laurent            bool registration = data.readInt32() == 1;
1211baac183f3808d7b68f184647a97bd381620415feEric Laurent            Vector<AudioMix> mixes;
1212baac183f3808d7b68f184647a97bd381620415feEric Laurent            size_t size = (size_t)data.readInt32();
1213baac183f3808d7b68f184647a97bd381620415feEric Laurent            if (size > MAX_MIXES_PER_POLICY) {
1214baac183f3808d7b68f184647a97bd381620415feEric Laurent                size = MAX_MIXES_PER_POLICY;
1215baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1216baac183f3808d7b68f184647a97bd381620415feEric Laurent            for (size_t i = 0; i < size; i++) {
1217baac183f3808d7b68f184647a97bd381620415feEric Laurent                AudioMix mix;
1218baac183f3808d7b68f184647a97bd381620415feEric Laurent                if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) {
1219baac183f3808d7b68f184647a97bd381620415feEric Laurent                    mixes.add(mix);
1220baac183f3808d7b68f184647a97bd381620415feEric Laurent                }
1221baac183f3808d7b68f184647a97bd381620415feEric Laurent            }
1222baac183f3808d7b68f184647a97bd381620415feEric Laurent            status_t status = registerPolicyMixes(mixes, registration);
1223baac183f3808d7b68f184647a97bd381620415feEric Laurent            reply->writeInt32(status);
1224baac183f3808d7b68f184647a97bd381620415feEric Laurent            return NO_ERROR;
1225baac183f3808d7b68f184647a97bd381620415feEric Laurent        } break;
1226baac183f3808d7b68f184647a97bd381620415feEric Laurent
1227c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
1228c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
1229c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
1230c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
1231c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1232c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1233c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
123440bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1235