IAudioPolicyService.cpp revision 4dc680607181e6a76f4e91a39366c4f5dfb7b03e
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
26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h>
27c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2864760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
29fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
30c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android {
31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum {
33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_DEVICE_CONNECTION_STATE,
35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PHONE_STATE,
360b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten    SET_RINGER_MODE,    // reserved, no longer used
37c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_FORCE_USE,
38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_FORCE_USE,
39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_OUTPUT,
40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_OUTPUT,
41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_OUTPUT,
42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_OUTPUT,
43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_INPUT,
44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    START_INPUT,
45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    STOP_INPUT,
46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RELEASE_INPUT,
47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    INIT_STREAM_VOLUME,
48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_STREAM_VOLUME,
49de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STREAM_VOLUME,
50de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_STRATEGY_FOR_STREAM,
51de070137f11d346fba77605bd76a44c040a618fcEric Laurent    GET_OUTPUT_FOR_EFFECT,
52de070137f11d346fba77605bd76a44c040a618fcEric Laurent    REGISTER_EFFECT,
53eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    UNREGISTER_EFFECT,
546b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    IS_STREAM_ACTIVE,
55d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    IS_SOURCE_ACTIVE,
566b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    GET_DEVICES_FOR_STREAM,
57db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    QUERY_DEFAULT_PRE_PROCESSING,
58272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    SET_EFFECT_ENABLED,
59ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    IS_STREAM_ACTIVE_REMOTELY,
60203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    IS_OFFLOAD_SUPPORTED,
61203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PORTS,
62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    GET_AUDIO_PORT,
63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    CREATE_AUDIO_PATCH,
64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    RELEASE_AUDIO_PATCH,
65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    LIST_AUDIO_PATCHES,
66b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    SET_AUDIO_PORT_CONFIG,
675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi    REGISTER_CLIENT,
685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi    GET_OUTPUT_FOR_ATTR
69c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
70c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
71c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
72c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
73c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic:
74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    BpAudioPolicyService(const sp<IBinder>& impl)
75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        : BpInterface<IAudioPolicyService>(impl)
76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setDeviceConnectionState(
80fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
81fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_policy_dev_state_t state,
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(state));
88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
93fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_dev_state_t getDeviceConnectionState(
94fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                    audio_devices_t device,
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    const char *device_address)
96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(device));
100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeCString(device_address);
101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
102fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
105f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setPhoneState(audio_mode_t state)
106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PHONE_STATE, data, &reply);
111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(config));
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_FORCE_USE, data, &reply);
121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
124fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(usage));
129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_FORCE_USE, data, &reply);
130fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getOutput(
134fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                        audio_stream_type_t stream,
135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t samplingRate,
13658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                        audio_format_t format,
137254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                        audio_channel_mask_t channelMask,
138ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        audio_output_flags_t flags,
139ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                        const audio_offload_info_t *offloadInfo)
140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
146254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(flags));
1482301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // hasOffloadInfo
149b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
150b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
151b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
152b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
153b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
154b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_OUTPUT, data, &reply);
156fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi    virtual audio_io_handle_t getOutputForAttr(
1605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            const audio_attributes_t *attr,
1615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            uint32_t samplingRate,
1625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            audio_format_t format,
1635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            audio_channel_mask_t channelMask,
1645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            audio_output_flags_t flags,
1655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                                            const audio_offload_info_t *offloadInfo)
1665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        {
1675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            Parcel data, reply;
1685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (attr == NULL) {
1705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                ALOGE("Writing NULL audio attributes - shouldn't happen");
1715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                return (audio_io_handle_t) 0;
1725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
1735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.write(attr, sizeof(audio_attributes_t));
1745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(samplingRate);
1755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(format));
1765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(channelMask);
1775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.writeInt32(static_cast <uint32_t>(flags));
1785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            // hasOffloadInfo
1795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (offloadInfo == NULL) {
1805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(0);
1815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            } else {
1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.writeInt32(1);
1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.write(offloadInfo, sizeof(audio_offload_info_t));
1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
1855bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply);
1865bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return static_cast <audio_io_handle_t> (reply.readInt32());
1875bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        }
1885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
189de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t startOutput(audio_io_handle_t output,
190fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                 audio_stream_type_t stream,
191de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                 int session)
192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
193c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
195fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
196fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
197de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
198c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_OUTPUT, data, &reply);
199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
202de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t stopOutput(audio_io_handle_t output,
203fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                                audio_stream_type_t stream,
204de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                int session)
205c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
206c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
207c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
208fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
209fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
210de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
211c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_OUTPUT, data, &reply);
212c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
213c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
214c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
215c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void releaseOutput(audio_io_handle_t output)
216c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
217c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
218c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
219fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
220c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_OUTPUT, data, &reply);
221c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
222c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
223c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual audio_io_handle_t getInput(
224eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten                                    audio_source_t inputSource,
225c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    uint32_t samplingRate,
22658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                    audio_format_t format,
227254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                    audio_channel_mask_t channelMask,
228b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten                                    int audioSession,
229b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten                                    audio_input_flags_t flags)
230c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
231c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
232c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
233eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten        data.writeInt32((int32_t) inputSource);
234c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
235c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(format));
236254af180475346b6186b49c297f340c9c4817511Glenn Kasten        data.writeInt32(channelMask);
2377c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(audioSession);
238b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten        data.writeInt32(flags);
239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUT, data, &reply);
240fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
241c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
242c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2434dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t startInput(audio_io_handle_t input,
2444dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                audio_session_t session)
245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
248fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
2494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(START_INPUT, data, &reply);
251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2544dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual status_t stopInput(audio_io_handle_t input,
2554dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                               audio_session_t session)
256c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
259fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
2604dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
261c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STOP_INPUT, data, &reply);
262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
2654dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent    virtual void releaseInput(audio_io_handle_t input,
2664dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                              audio_session_t session)
267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
270fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
2714dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent        data.writeInt32(session);
272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RELEASE_INPUT, data, &reply);
273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
275fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual status_t initStreamVolume(audio_stream_type_t stream,
276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMin,
277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    int indexMax)
278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
280c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
281c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMin);
283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(indexMax);
284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
28883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
28983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int index,
29083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(index);
29683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
298c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
30183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
30283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          int *index,
30383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                          audio_devices_t device)
304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
30883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent        data.writeInt32(static_cast <uint32_t>(device));
30983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent
310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_STREAM_VOLUME, data, &reply);
311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        int lIndex = reply.readInt32();
312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (index) *index = lIndex;
313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return static_cast <status_t> (reply.readInt32());
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
315de070137f11d346fba77605bd76a44c040a618fcEric Laurent
316fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
317de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
318de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
319de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
320de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(static_cast <uint32_t>(stream));
321de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
322de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
323de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
324de070137f11d346fba77605bd76a44c040a618fcEric Laurent
3256374252107fd6539397598195ea6defd5870fafbEric Laurent    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
3266b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    {
3276b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        Parcel data, reply;
3286b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
3296b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        data.writeInt32(static_cast <uint32_t>(stream));
3306b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
3316374252107fd6539397598195ea6defd5870fafbEric Laurent        return (audio_devices_t) reply.readInt32();
3326b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten    }
3336b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
33458e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
335de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
336de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
337de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
338de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
339de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
340de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <audio_io_handle_t> (reply.readInt32());
341de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
342de070137f11d346fba77605bd76a44c040a618fcEric Laurent
34358e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten    virtual status_t registerEffect(const effect_descriptor_t *desc,
3447c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                        audio_io_handle_t io,
345de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        uint32_t strategy,
346de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int session,
347de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                        int id)
348de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
349de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
350de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
351de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.write(desc, sizeof(effect_descriptor_t));
3527c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        data.writeInt32(io);
353de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(strategy);
354de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
355de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
356de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(REGISTER_EFFECT, data, &reply);
357de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
358de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
359de070137f11d346fba77605bd76a44c040a618fcEric Laurent
360de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t unregisterEffect(int id)
361de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
362de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
363de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
364de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(id);
365de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(UNREGISTER_EFFECT, data, &reply);
366de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return static_cast <status_t> (reply.readInt32());
367de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
368de070137f11d346fba77605bd76a44c040a618fcEric Laurent
369db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    virtual status_t setEffectEnabled(int id, bool enabled)
370db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    {
371db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        Parcel data, reply;
372db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
373db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(id);
374db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        data.writeInt32(enabled);
375db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
376db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        return static_cast <status_t> (reply.readInt32());
377db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent    }
378db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
379fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
380eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    {
381eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        Parcel data, reply;
382eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
383fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
384eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        data.writeInt32(inPastMs);
385eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
386eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        return reply.readInt32();
387eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent    }
38857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
389272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
390272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    {
391272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        Parcel data, reply;
392272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
393272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32((int32_t) stream);
394272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        data.writeInt32(inPastMs);
395272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
396272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        return reply.readInt32();
397272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi    }
398272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
399d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    virtual bool isSourceActive(audio_source_t source) const
400d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    {
401d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        Parcel data, reply;
402d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
403d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        data.writeInt32((int32_t) source);
404d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
405d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        return reply.readInt32();
406d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi    }
407d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
40857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    virtual status_t queryDefaultPreProcessing(int audioSession,
40957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               effect_descriptor_t *descriptors,
41057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                                               uint32_t *count)
41157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    {
41257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (descriptors == NULL || count == NULL) {
41357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return BAD_VALUE;
41457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
41557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        Parcel data, reply;
41657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
41757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(audioSession);
41857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        data.writeInt32(*count);
41957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
42057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (status != NO_ERROR) {
42157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
42257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
42357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        status = static_cast <status_t> (reply.readInt32());
42457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        uint32_t retCount = reply.readInt32();
42557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        if (retCount != 0) {
42657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t numDesc = (retCount < *count) ? retCount : *count;
42757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
42857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
42957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        *count = retCount;
43057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        return status;
43157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent    }
432ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
433ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual bool isOffloadSupported(const audio_offload_info_t& info)
434ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    {
435b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        Parcel data, reply;
436b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
437b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        data.write(&info, sizeof(audio_offload_info_t));
438b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
439203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return reply.readInt32();
440203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
441203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
442203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPorts(audio_port_role_t role,
443203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    audio_port_type_t type,
444203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *num_ports,
445203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    struct audio_port *ports,
446203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                    unsigned int *generation)
447203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
448203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_ports == NULL || (*num_ports != 0 && ports == NULL) ||
449203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
450203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
451203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
452203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
453203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
454203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;
455203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(role);
456203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(type);
457203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPortsReq);
458203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
459203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
460203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
461203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_ports = (unsigned int)reply.readInt32();
462203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
463203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
464203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > *num_ports) {
465203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPortsReq = *num_ports;
466203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
467203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPortsReq > 0) {
468203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(ports, numPortsReq * sizeof(struct audio_port));
469203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
470203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
471203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
472203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
473203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
474203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
475203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
476203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
477203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (port == NULL) {
478203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
479203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
480203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
481203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
482203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(port, sizeof(struct audio_port));
483203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
484203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
485203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
486203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
487203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
488203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(port, sizeof(struct audio_port));
489203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
490203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
491203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
492203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
493203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                       audio_patch_handle_t *handle)
494203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
495203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (patch == NULL || handle == NULL) {
496203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
497203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
498203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
499203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
500203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(patch, sizeof(struct audio_patch));
501203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
502203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
503203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR ||
504203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return status;
506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      struct audio_patch *patches,
525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                      unsigned int *generation)
526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (num_patches == NULL || (*num_patches != 0 && patches == NULL) ||
528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                generation == NULL) {
529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches;
534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInt32(numPatchesReq);
535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *num_patches = (unsigned int)reply.readInt32();
539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status == NO_ERROR) {
541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > *num_patches) {
542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                numPatchesReq = *num_patches;
543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (numPatchesReq > 0) {
545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply.read(patches, numPatchesReq * sizeof(struct audio_patch));
546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            *generation = reply.readInt32();
548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    {
554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (config == NULL) {
555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return BAD_VALUE;
556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        Parcel data, reply;
558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        data.write(config, sizeof(struct audio_port_config));
560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        if (status != NO_ERROR) {
562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status = (status_t)reply.readInt32();
563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        return status;
565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent    }
566b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
567b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
568b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
569b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
570b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeStrongBinder(client->asBinder());
571b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
572b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
573c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent};
574c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
575c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
576c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
577c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------
578c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
579c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
580c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact(
581c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
582c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{
583e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
584c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_DEVICE_CONNECTION_STATE: {
585c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
586fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
587fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_devices_t>(data.readInt32());
588fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_dev_state_t state =
589fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_dev_state_t>(data.readInt32());
590c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
591de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
592de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              state,
593de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
594c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
595c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
596c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
597c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_DEVICE_CONNECTION_STATE: {
598c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
599fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_devices_t device =
600fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast<audio_devices_t> (data.readInt32());
601c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            const char *device_address = data.readCString();
602de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
603de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                              device_address)));
604c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
605c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
606c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
607c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PHONE_STATE: {
608c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
60985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
61085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    (audio_mode_t) data.readInt32())));
611c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
612c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
613c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
614c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_FORCE_USE: {
615c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
61685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
61785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
618fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_policy_forced_cfg_t config =
619fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
620c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
621c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
622c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
623c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
624c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_FORCE_USE: {
625c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
62685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
62785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readInt32());
628c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
629c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
630c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
631c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
632c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_OUTPUT: {
633c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
634fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
635fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
636c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
63758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
638254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
6390ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags =
6400ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent                    static_cast <audio_output_flags_t>(data.readInt32());
641b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
642b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
643b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
644b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
645b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output = getOutput(stream,
647c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 samplingRate,
648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                                 format,
649254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                                 channelMask,
650b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
651b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
652fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(output));
653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
654c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
655c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
6565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        case GET_OUTPUT_FOR_ATTR: {
6575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
6585bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_attributes_t *attr = (audio_attributes_t *) calloc(1, sizeof(audio_attributes_t));
6595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            data.read(attr, sizeof(audio_attributes_t));
6605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            uint32_t samplingRate = data.readInt32();
6615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_format_t format = (audio_format_t) data.readInt32();
6625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_channel_mask_t channelMask = data.readInt32();
6635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_output_flags_t flags =
6645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    static_cast <audio_output_flags_t>(data.readInt32());
6655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            bool hasOffloadInfo = data.readInt32() != 0;
6665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_offload_info_t offloadInfo;
6675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            if (hasOffloadInfo) {
6685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                data.read(&offloadInfo, sizeof(audio_offload_info_t));
6695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            }
6705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            audio_io_handle_t output = getOutputForAttr(attr,
6715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    samplingRate,
6725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    format,
6735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    channelMask,
6745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    flags,
6755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi                    hasOffloadInfo ? &offloadInfo : NULL);
6765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            reply->writeInt32(static_cast <int>(output));
6775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi            return NO_ERROR;
6785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi        } break;
6795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi
680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_OUTPUT: {
681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
682fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
683ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
684ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
685de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
686de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
687ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                 stream,
688de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                 session)));
689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
692c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_OUTPUT: {
693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
694fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
695ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            audio_stream_type_t stream =
696ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                static_cast <audio_stream_type_t>(data.readInt32());
697de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
698de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
699ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent                                                                stream,
700de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                session)));
701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_OUTPUT: {
705c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
706fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
707c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            releaseOutput(output);
708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_INPUT: {
712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
713eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten            audio_source_t inputSource = (audio_source_t) data.readInt32();
714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
71558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
716254af180475346b6186b49c297f340c9c4817511Glenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
7177c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            int audioSession = data.readInt32();
718b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t input = getInput(inputSource,
720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                               samplingRate,
721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                               format,
722254af180475346b6186b49c297f340c9c4817511Glenn Kasten                                               channelMask,
723b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten                                               audioSession,
724b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten                                               flags);
725fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(static_cast <int>(input));
726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
727c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case START_INPUT: {
730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
731fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
7324dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
7334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(startInput(input, session)));
734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case STOP_INPUT: {
738c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
739fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
7404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
7414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
742c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
744c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
745c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RELEASE_INPUT: {
746c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
747fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
7484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            audio_session_t session = static_cast <audio_session_t>(data.readInt32());
7494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent            releaseInput(input, session);
750c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
751c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
752c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case INIT_STREAM_VOLUME: {
754c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
755fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
756fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
757c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMin = data.readInt32();
758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int indexMax = data.readInt32();
759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
761c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
762c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_VOLUME: {
764c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
765fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
766fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index = data.readInt32();
76883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
76983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
77083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          index,
77183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent                                                                          device)));
772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
773c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
774c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
775c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_STREAM_VOLUME: {
776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
777fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
778fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
77983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            int index;
78183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent            status_t status = getStreamVolumeIndex(stream, &index, device);
782c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(index);
783c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(static_cast <uint32_t>(status));
784c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
785c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
786c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
787de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_STRATEGY_FOR_STREAM: {
788de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
789fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
790fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
791de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(getStrategyForStream(stream));
792de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
793de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
794de070137f11d346fba77605bd76a44c040a618fcEric Laurent
7956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        case GET_DEVICES_FOR_STREAM: {
7966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            CHECK_INTERFACE(IAudioPolicyService, data, reply);
797fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            audio_stream_type_t stream =
798fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin                    static_cast <audio_stream_type_t>(data.readInt32());
7996b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
8006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten            return NO_ERROR;
8016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten        } break;
8026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten
803de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case GET_OUTPUT_FOR_EFFECT: {
804de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
805de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
806de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
807de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t output = getOutputForEffect(&desc);
808de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int>(output));
809de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
810de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
811de070137f11d346fba77605bd76a44c040a618fcEric Laurent
812de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case REGISTER_EFFECT: {
813de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
814de070137f11d346fba77605bd76a44c040a618fcEric Laurent            effect_descriptor_t desc;
815de070137f11d346fba77605bd76a44c040a618fcEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
8167c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent            audio_io_handle_t io = data.readInt32();
817de070137f11d346fba77605bd76a44c040a618fcEric Laurent            uint32_t strategy = data.readInt32();
818de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
819de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
820de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
8217c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                                   io,
822de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   strategy,
823de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   session,
824de070137f11d346fba77605bd76a44c040a618fcEric Laurent                                                                   id)));
825de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
826de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
827de070137f11d346fba77605bd76a44c040a618fcEric Laurent
828de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case UNREGISTER_EFFECT: {
829de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
830de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int id = data.readInt32();
831de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
832de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
833de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
834de070137f11d346fba77605bd76a44c040a618fcEric Laurent
835db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        case SET_EFFECT_ENABLED: {
836db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
837db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            int id = data.readInt32();
838db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            bool enabled = static_cast <bool>(data.readInt32());
839db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
840db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent            return NO_ERROR;
841db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent        } break;
842db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent
843eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        case IS_STREAM_ACTIVE: {
844eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
845fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
846eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            uint32_t inPastMs = (uint32_t)data.readInt32();
847ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActive(stream, inPastMs) );
848eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent            return NO_ERROR;
849eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent        } break;
850eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent
851272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        case IS_STREAM_ACTIVE_REMOTELY: {
852272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
853272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
854272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            uint32_t inPastMs = (uint32_t)data.readInt32();
855ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
856272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi            return NO_ERROR;
857272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi        } break;
858272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi
859d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        case IS_SOURCE_ACTIVE: {
860d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyService, data, reply);
861d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
862d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            reply->writeInt32( isSourceActive(source));
863d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi            return NO_ERROR;
864d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi        }
865d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi
86657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        case QUERY_DEFAULT_PRE_PROCESSING: {
86757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
86857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            int audioSession = data.readInt32();
86957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t count = data.readInt32();
87057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            uint32_t retCount = count;
87157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            effect_descriptor_t *descriptors =
87257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
87357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
87457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(status);
87557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (status != NO_ERROR && status != NO_MEMORY) {
87657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                retCount = 0;
87757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
87857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            reply->writeInt32(retCount);
87957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            if (retCount) {
88057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                if (retCount < count) {
88157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                    count = retCount;
88257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                }
88357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
88457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            }
88557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            delete[] descriptors;
88657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent            return status;
88757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent        }
88857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent
889b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        case IS_OFFLOAD_SUPPORTED: {
890b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            CHECK_INTERFACE(IAudioPolicyService, data, reply);
891b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t info;
892b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.read(&info, sizeof(audio_offload_info_t));
893b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool isSupported = isOffloadSupported(info);
894b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            reply->writeInt32(isSupported);
895b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            return NO_ERROR;
896b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
897b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald
898203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PORTS: {
899203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
900203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_role_t role = (audio_port_role_t)data.readInt32();
901203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_port_type_t type = (audio_port_type_t)data.readInt32();
902203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPortsReq = data.readInt32();
903203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPorts = numPortsReq;
904203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int generation;
905203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port *ports =
906203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port));
907203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPorts(role, type, &numPorts, ports, &generation);
908203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
909203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPorts);
910203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
911203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
912203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPortsReq > numPorts) {
913203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPortsReq = numPorts;
914203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
915203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
916203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
917203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
918203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(ports);
919203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
920203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
921203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
922203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case GET_AUDIO_PORT: {
923203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
924203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port port;
925203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&port, sizeof(struct audio_port));
926203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = getAudioPort(&port);
927203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
928203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
929203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&port, sizeof(struct audio_port));
930203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
931203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
932203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
933203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
934203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case CREATE_AUDIO_PATCH: {
935203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
936203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch patch;
937203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&patch, sizeof(struct audio_patch));
938203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
939203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
940203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = createAudioPatch(&patch, &handle);
941203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
942203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
943203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
944203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
945203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
946203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
947203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
948203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case RELEASE_AUDIO_PATCH: {
949203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
950203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            audio_patch_handle_t handle;
951203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
952203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = releaseAudioPatch(handle);
953203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
954203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
955203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
956203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
957203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case LIST_AUDIO_PATCHES: {
958203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
959203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatchesReq = data.readInt32();
960203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int numPatches = numPatchesReq;
961203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            unsigned int generation;
962203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_patch *patches =
963203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
964203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                                                 sizeof(struct audio_patch));
965203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = listAudioPatches(&numPatches, patches, &generation);
966203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
967203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(numPatches);
968203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            if (status == NO_ERROR) {
969203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                if (numPatchesReq > numPatches) {
970203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                    numPatchesReq = numPatches;
971203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                }
972203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
973203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent                reply->writeInt32(generation);
974203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            }
975203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            free(patches);
976203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
977203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
978203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
979203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        case SET_AUDIO_PORT_CONFIG: {
980203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
981203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            struct audio_port_config config;
982203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            data.read(&config, sizeof(struct audio_port_config));
983203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            status_t status = setAudioPortConfig(&config);
984203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            reply->writeInt32(status);
985203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent            return NO_ERROR;
986203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent        }
987b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        case REGISTER_CLIENT: {
988b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyService, data, reply);
989b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
990b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent                    data.readStrongBinder());
991b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            registerClient(client);
992b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
993b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
994203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent
995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        default:
996c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BBinder::onTransact(code, data, reply, flags);
997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ----------------------------------------------------------------------------
1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1002c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; // namespace android
1003