1b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent/*
2b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * Copyright (C) 2009 The Android Open Source Project
3b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent *
4b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * you may not use this file except in compliance with the License.
6b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * You may obtain a copy of the License at
7b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent *
8b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent *
10b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * Unless required by applicable law or agreed to in writing, software
11b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * See the License for the specific language governing permissions and
14b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent * limitations under the License.
15b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent */
16b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
17b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#define LOG_TAG "IAudioPolicyServiceClient"
18b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <utils/Log.h>
19b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
20b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <stdint.h>
21b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <sys/types.h>
22b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
23b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <binder/Parcel.h>
24b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
25b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <media/IAudioPolicyServiceClient.h>
26b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent#include <media/AudioSystem.h>
27b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
28b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentnamespace android {
29b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
30b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentenum {
31b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    PORT_LIST_UPDATE = IBinder::FIRST_CALL_TRANSACTION,
32de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    PATCH_LIST_UPDATE,
332f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    MIX_STATE_UPDATE,
342f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    RECORDING_CONFIGURATION_UPDATE
35b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent};
36b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
377281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi// ----------------------------------------------------------------------
387281aa9810b33eff47b00104db26c97c77931611Jean-Michel Triviinline void readAudioConfigBaseFromParcel(const Parcel& data, audio_config_base_t *config) {
397281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    config->sample_rate = data.readUint32();
407281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    config->channel_mask = (audio_channel_mask_t) data.readInt32();
417281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    config->format = (audio_format_t) data.readInt32();
427281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi}
437281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi
447281aa9810b33eff47b00104db26c97c77931611Jean-Michel Triviinline void writeAudioConfigBaseToParcel(Parcel& data, const audio_config_base_t *config)
457281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi{
467281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    data.writeUint32(config->sample_rate);
477281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    data.writeInt32((int32_t) config->channel_mask);
487281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi    data.writeInt32((int32_t) config->format);
497281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi}
507281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi
517281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi// ----------------------------------------------------------------------
52b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentclass BpAudioPolicyServiceClient : public BpInterface<IAudioPolicyServiceClient>
53b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{
54b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentpublic:
55b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    BpAudioPolicyServiceClient(const sp<IBinder>& impl)
56b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        : BpInterface<IAudioPolicyServiceClient>(impl)
57b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
58b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
59b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
60b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    void onAudioPortListUpdate()
61b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
62b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
63b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
64b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(PORT_LIST_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
65b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
66b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
67b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    void onAudioPatchListUpdate()
68b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
69b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
70b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
71b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(PATCH_LIST_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
72b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
73de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi
74de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state)
75de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    {
76de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        Parcel data, reply;
77de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
78de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeString8(regId);
79de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeInt32(state);
80de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        remote()->transact(MIX_STATE_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
81de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    }
822f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi
832f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    void onRecordingConfigurationUpdate(int event, audio_session_t session,
847281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            audio_source_t source, const audio_config_base_t *clientConfig,
858c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle) {
862f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        Parcel data, reply;
872f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
882f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInt32(event);
892f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInt32(session);
902f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInt32(source);
917281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi        writeAudioConfigBaseToParcel(data, clientConfig);
927281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi        writeAudioConfigBaseToParcel(data, deviceConfig);
938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi        data.writeInt32(patchHandle);
942f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        remote()->transact(RECORDING_CONFIGURATION_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
952f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    }
96b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent};
97b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
98b52c152d553556b2d227ffc943489de0c60b4b02Eric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyServiceClient, "android.media.IAudioPolicyServiceClient");
99b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
100b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent// ----------------------------------------------------------------------
101b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
102b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentstatus_t BnAudioPolicyServiceClient::onTransact(
103b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
104b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{
105b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    switch (code) {
106b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    case PORT_LIST_UPDATE: {
107b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
108b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            onAudioPortListUpdate();
109b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
110b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
111b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    case PATCH_LIST_UPDATE: {
112b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
113b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            onAudioPatchListUpdate();
114b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
115b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
116de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    case MIX_STATE_UPDATE: {
117de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
118de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            String8 regId = data.readString8();
119de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            int32_t state = data.readInt32();
120de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            onDynamicPolicyMixStateUpdate(regId, state);
121de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            return NO_ERROR;
1222f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        } break;
1232f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    case RECORDING_CONFIGURATION_UPDATE: {
1242f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
1252f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            int event = (int) data.readInt32();
1262f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            audio_session_t session = (audio_session_t) data.readInt32();
1272f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            audio_source_t source = (audio_source_t) data.readInt32();
1287281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            audio_config_base_t clientConfig;
1297281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            audio_config_base_t deviceConfig;
1307281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            readAudioConfigBaseFromParcel(data, &clientConfig);
1317281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            readAudioConfigBaseFromParcel(data, &deviceConfig);
1328c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            audio_patch_handle_t patchHandle = (audio_patch_handle_t) data.readInt32();
1338c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            onRecordingConfigurationUpdate(event, session, source, &clientConfig, &deviceConfig,
1348c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi                    patchHandle);
1352f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            return NO_ERROR;
1362f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        } break;
137b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    default:
138b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        return BBinder::onTransact(code, data, reply, flags);
139b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
140b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent}
141b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
142b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent// ----------------------------------------------------------------------------
143b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
14440bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
145