IAudioPolicyService.cpp revision caf7f48a0ef558689d39aafd187c1571ff4128b4
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,
72bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    GET_PHONE_STATE
73c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    BpAudioPolicyService(const sp<IBinder>& impl)
79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
84fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
85fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
97fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
98fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
106fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
109f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
118fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
134fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getOutput(
138fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_stream_type_t stream,
139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t samplingRate,
14058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format,
141254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                        audio_channel_mask_t channelMask,
142ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        audio_output_flags_t flags,
143ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        const audio_offload_info_t *offloadInfo)
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
150254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(flags));
1522301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // hasOffloadInfo
153b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
154b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
155b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
156b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
157b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
158b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
160fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
163e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual status_t getOutputForAttr(const audio_attributes_t *attr,
164e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_io_handle_t *output,
165e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session,
166e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_stream_type_t *stream,
167e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        uint32_t samplingRate,
168e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_format_t format,
169e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_channel_mask_t channelMask,
170e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_output_flags_t flags,
171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        const audio_offload_info_t *offloadInfo)
1725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (stream == NULL) {
177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr(): NULL audio attributes and stream type");
178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                if (*stream == AUDIO_STREAM_DEFAULT) {
181e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    ALOGE("getOutputForAttr unspecified stream type");
182e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    return BAD_VALUE;
183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                }
184e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
185e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (output == NULL) {
186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                ALOGE("getOutputForAttr NULL output - shouldn't happen");
187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return BAD_VALUE;
188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (attr == NULL) {
190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.write(attr, sizeof(audio_attributes_t));
194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            data.writeInt32(session);
196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream == NULL) {
197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(0);
198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            } else {
199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(1);
200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.writeInt32(*stream);
2015bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
2025bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(samplingRate);
2035bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(format));
2045bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(channelMask);
2055bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
2065bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            // hasOffloadInfo
2075bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (offloadInfo == NULL) {
2085bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(0);
2095bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            } else {
2105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(1);
2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.write(offloadInfo, sizeof(audio_offload_info_t));
2125bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
213e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
217e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status = (status_t)reply.readInt32();
218e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (status != NO_ERROR) {
219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                return status;
220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            *output = (audio_io_handle_t)reply.readInt32();
222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (stream != NULL) {
223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                *stream = (audio_stream_type_t)reply.readInt32();
224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return status;
2265bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
2275bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
228de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
229fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                 audio_session_t session)
231c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
232c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
233c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
234fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
235fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
237c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
238c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
240c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
241de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
242fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
243e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                audio_session_t session)
244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
247fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
248fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
249e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
254e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    virtual void releaseOutput(audio_io_handle_t output,
255e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_stream_type_t stream,
256e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                               audio_session_t session)
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
260fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)stream);
262e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        data.writeInt32((int32_t)session);
263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
266caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    virtual status_t getInputForAttr(const audio_attributes_t *attr,
267caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_io_handle_t *input,
268caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_session_t session,
269caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     uint32_t samplingRate,
270caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_format_t format,
271caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_channel_mask_t channelMask,
272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                     audio_input_flags_t flags)
273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
276caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (attr == NULL) {
277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL attr - shouldn't happen");
278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (input == NULL) {
281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            ALOGE("getInputForAttr NULL input - shouldn't happen");
282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return BAD_VALUE;
283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.write(attr, sizeof(audio_attributes_t));
285caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        data.writeInt32(session);
286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
288254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
289b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply);
291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        status = reply.readInt32();
295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        if (status != NO_ERROR) {
296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            return status;
297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        }
298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        *input = (audio_io_handle_t)reply.readInt32();
299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_ERROR;
300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3024dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t startInput(audio_io_handle_t input,
3034dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                audio_session_t session)
304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
307fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3134dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t stopInput(audio_io_handle_t input,
3144dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                               audio_session_t session)
315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
318fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3194dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
3244dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual void releaseInput(audio_io_handle_t input,
3254dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                              audio_session_t session)
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
329fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
3304dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
334fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
34783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
34883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
34983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
35583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
36083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
36183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
36283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
36783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
36883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
374de070137f11d346fba77605bd76a44c040a618fcEric Laurent
375fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
376de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
377de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
378de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
379de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
380de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
381de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
382de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
383de070137f11d346fba77605bd76a44c040a618fcEric Laurent
3846374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
3856b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
3866b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
3876b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3886b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
3896b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
3906374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
3916b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
3926b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
39358e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
394de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
395de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
396de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
397de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
398de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
399de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
400de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
401de070137f11d346fba77605bd76a44c040a618fcEric Laurent
40258e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
4037c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
404de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
405de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int session,
406de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
407de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
408de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
409de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
410de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
4117c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
412de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
413de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
414de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
415de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
416de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
417de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
418de070137f11d346fba77605bd76a44c040a618fcEric Laurent
419de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
420de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
421de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
422de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
423de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
424de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
425de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
426de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
427de070137f11d346fba77605bd76a44c040a618fcEric Laurent
428db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
429db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
430db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
431db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
432db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
433db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
434db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
435db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
436db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
437db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
438fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
439eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
440eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
441eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
442fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
443eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
444eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
445eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
446eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
44757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
448272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
449272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
450272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
451272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
452272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
453272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
454272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
455272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
456272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
457272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
458d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
459d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
460d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
461d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
462d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
463d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
464d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
465d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
466d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
46757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
46857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
46957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
47057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
47157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
47257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
47357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
47457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
47557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
47657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
47757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
47857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
47957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
48057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
48157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
491ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
492ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
493ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
494b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
495b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
496b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
497b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
498203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
499203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
500203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
501203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
502203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
503203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
504203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
625df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
626b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
627b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
628b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
629b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
630b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeStrongBinder(client->asBinder());
631b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
632b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
633df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
634df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t acquireSoundTriggerSession(audio_session_t *session,
635df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_io_handle_t *ioHandle,
636df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                                            audio_devices_t *device)
637df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
638df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (session == NULL || ioHandle == NULL || device == NULL) {
639df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return BAD_VALUE;
640df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
642df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status = (status_t)reply.readInt32();
648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status == NO_ERROR) {
649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *session = (audio_session_t)reply.readInt32();
650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *ioHandle = (audio_io_handle_t)reply.readInt32();
651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            *device = (audio_devices_t)reply.readInt32();
652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return status;
654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t releaseSoundTriggerSession(audio_session_t session)
657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInt32(session);
661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        if (status != NO_ERROR) {
663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return status;
664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        }
665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        return (status_t)reply.readInt32();
666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
667bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
668bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    virtual audio_mode_t getPhoneState()
669bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    {
670bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        Parcel data, reply;
671bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
672bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        status_t status = remote()->transact(GET_PHONE_STATE, data, &reply);
673bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        if (status != NO_ERROR) {
674bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return AUDIO_MODE_INVALID;
675bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        }
676bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        return (audio_mode_t)reply.readInt32();
677bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    }
678c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
684c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
688e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
691fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
692fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
693fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
694fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
695c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
696de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
697de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              state,
698de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
704fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
705fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
706c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
707de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
708de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
71485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
71585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
716c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
72185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
72285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
723fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
724fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
727c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
73185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
73285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
733c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
738c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
739fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
740fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
741c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
74258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
743254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
7440ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags =
7450ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                    static_cast <audio_output_flags_t>(data.readInt32());
746b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
747b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
748b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
749b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
750b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
751c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output = getOutput(stream,
752c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 samplingRate,
753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 format,
754254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                                 channelMask,
755b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
756b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
757fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
7615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
7625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
76385f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten            audio_attributes_t attr;
764e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasAttributes = data.readInt32() != 0;
765e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasAttributes) {
766e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                data.read(&attr, sizeof(audio_attributes_t));
767e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
768e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
769e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
770e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            bool hasStream = data.readInt32() != 0;
771e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            if (hasStream) {
772e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                stream = (audio_stream_type_t)data.readInt32();
773e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            }
7745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            uint32_t samplingRate = data.readInt32();
7755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_format_t format = (audio_format_t) data.readInt32();
7765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_channel_mask_t channelMask = data.readInt32();
7775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
7785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
7795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            bool hasOffloadInfo = data.readInt32() != 0;
7805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_offload_info_t offloadInfo;
7815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (hasOffloadInfo) {
7825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.read(&offloadInfo, sizeof(audio_offload_info_t));
7835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
784e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_io_handle_t output;
785e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            status_t status = getOutputForAttr(hasAttributes ? &attr : NULL,
786e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    &output, session, &stream,
787e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    samplingRate, format, channelMask,
788e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                    flags, hasOffloadInfo ? &offloadInfo : NULL);
789e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(status);
790e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(output);
791e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            reply->writeInt32(stream);
7925bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
7935bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
7945bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
797fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
798ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
799ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
800e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
801de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
802ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
803de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
809fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
810ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
811ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
812e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
813de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
814ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
815de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
821fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
822e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_stream_type_t stream = (audio_stream_type_t)data.readInt32();
823e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
824e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            releaseOutput(output, stream, session);
825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
828caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        case GET_INPUT_FOR_ATTR: {
829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
830caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_attributes_t attr;
831caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            data.read(&attr, sizeof(audio_attributes_t));
832caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
83458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
835254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
836b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
837caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            audio_io_handle_t input;
838caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            status_t status = getInputForAttr(&attr, &input, session,
839caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              samplingRate, format, channelMask,
840caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                              flags);
841caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            reply->writeInt32(status);
842caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            if (status == NO_ERROR) {
843caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                reply->writeInt32(input);
844caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent            }
845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
850fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
8514dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
8524dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
858fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
8594dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
8604dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
866fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
8674dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
8684dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            releaseInput(input, session);
869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
874fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
875fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
878c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
879c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
884fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
885fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
88783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
88883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
88983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
89083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
894c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
896fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
897fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
89883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index;
90083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
902c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
906de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
907de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
908fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
909fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
910de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
911de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
912de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
913de070137f11d346fba77605bd76a44c040a618fcEric Laurent
9146b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
9156b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
916fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
917fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
9186b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
9196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
9206b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
9216b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
922de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
923de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
924de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
925de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
926de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
927de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
928de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
929de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
930de070137f11d346fba77605bd76a44c040a618fcEric Laurent
931de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
932de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
933de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
934de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
9357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
936de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
937de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
938de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
939de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
9407c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
941de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
942de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
943de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
944de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
945de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
946de070137f11d346fba77605bd76a44c040a618fcEric Laurent
947de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
948de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
949de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
950de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
951de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
952de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
953de070137f11d346fba77605bd76a44c040a618fcEric Laurent
954db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
955db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
956db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
957db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
958db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
959db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
960db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
961db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
962eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
963eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
964fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
965eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
966ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
967eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
968eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
969eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
970272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
971272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
972272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
973272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
974ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
975272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
976272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
977272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
978d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
979d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
980d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
981d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
982d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
983d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
984d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
98557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
98657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
98757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            int audioSession = data.readInt32();
98857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
98974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (count > AudioEffect::kMaxPreProcessing) {
99074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent                count = AudioEffect::kMaxPreProcessing;
99174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            }
99257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
99374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            effect_descriptor_t *descriptors = new effect_descriptor_t[count];
99457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
99557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
99657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
99757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
99857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
99957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
100074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent            if (retCount != 0) {
100157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
100257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
100357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
100457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
100557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
100657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
100757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
100857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
100957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
1010b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
1011b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1012b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t info;
1013b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
1014b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
1015b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
1016b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
1017b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
1018b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
1019203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
1020203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1021203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
1022203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
1023203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
1024203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
1025203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int generation;
1026203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
1027203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
1028203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
1029203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1030203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
1031203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1032203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1033203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
1034203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
1035203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1036203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1037203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1038203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1039203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
1040203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1041203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1042203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1043203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
1044203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1045203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port port;
1046203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&port, sizeof(struct audio_port));
1047203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
1048203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1049203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1050203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
1051203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1052203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1053203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1054203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1055203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
1056203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1057203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch patch;
1058203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1059203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1060203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1061203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
1062203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1063203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1064203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
1065203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1066203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1067203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1068203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1069203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
1070203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1071203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
1072203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
1073203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
1074203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1075203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1076203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1077203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1078203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
1079203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1080203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
1081203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
1082203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int generation;
1083203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
1084203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
1085203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
1086203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
1087203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1088203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
1089203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
1090203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
1091203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
1092203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
1093203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1094203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
1095203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
1096203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
1097203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1098203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1099203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1100203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
1101203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1102203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port_config config;
1103203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
1104203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
1105203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
1106203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
1107203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
1108df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1109b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
1110b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1111b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1112b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
1113b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
1114b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
1115b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
1116203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
1117df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ACQUIRE_SOUNDTRIGGER_SESSION: {
1118df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1119df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1120df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1121df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session;
1122df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_io_handle_t ioHandle;
1123df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_devices_t device;
1124df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
1125df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1126df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            if (status == NO_ERROR) {
1127df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(session);
1128df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(ioHandle);
1129df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                reply->writeInt32(device);
1130df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            }
1131df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1132df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1133df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1134df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case RELEASE_SOUNDTRIGGER_SESSION: {
1135df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1136df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
1137df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                    data.readStrongBinder());
1138df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            audio_session_t session = (audio_session_t)data.readInt32();
1139df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            status_t status = releaseSoundTriggerSession(session);
1140df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            reply->writeInt32(status);
1141df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
1142df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
1143df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
1144bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        case GET_PHONE_STATE: {
1145bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
1146bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            reply->writeInt32((int32_t)getPhoneState());
1147bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent            return NO_ERROR;
1148bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent        } break;
1149bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; // namespace android
1158