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
51ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Triviinline void readRecordClientInfoFromParcel(const Parcel& data, record_client_info_t *clientInfo) {
52ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    clientInfo->uid = (uid_t) data.readUint32();
53ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    clientInfo->session = (audio_session_t) data.readInt32();
54ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    clientInfo->source = (audio_source_t) data.readInt32();
55ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi}
56ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi
57ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Triviinline void writeRecordClientInfoFromParcel(Parcel& data, const record_client_info_t *clientInfo) {
58ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    data.writeUint32((uint32_t) clientInfo->uid);
59ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    data.writeInt32((int32_t) clientInfo->session);
60ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    data.writeInt32((int32_t) clientInfo->source);
61ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi}
62ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi
637281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi// ----------------------------------------------------------------------
64b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentclass BpAudioPolicyServiceClient : public BpInterface<IAudioPolicyServiceClient>
65b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{
66b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentpublic:
67090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioPolicyServiceClient(const sp<IBinder>& impl)
68b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        : BpInterface<IAudioPolicyServiceClient>(impl)
69b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
70b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
71b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
72b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    void onAudioPortListUpdate()
73b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
74b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
75b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
76b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(PORT_LIST_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
77b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
78b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
79b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    void onAudioPatchListUpdate()
80b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    {
81b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        Parcel data, reply;
82b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
83b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        remote()->transact(PATCH_LIST_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
84b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
85de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi
86de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state)
87de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    {
88de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        Parcel data, reply;
89de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
90de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeString8(regId);
91de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        data.writeInt32(state);
92de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi        remote()->transact(MIX_STATE_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
93de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    }
942f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi
95ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi    void onRecordingConfigurationUpdate(int event, const record_client_info_t *clientInfo,
96ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi            const audio_config_base_t *clientConfig,
978c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle) {
982f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        Parcel data, reply;
992f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
1002f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        data.writeInt32(event);
101ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi        writeRecordClientInfoFromParcel(data, clientInfo);
1027281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi        writeAudioConfigBaseToParcel(data, clientConfig);
1037281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi        writeAudioConfigBaseToParcel(data, deviceConfig);
1048c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi        data.writeInt32(patchHandle);
1052f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        remote()->transact(RECORDING_CONFIGURATION_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
1062f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    }
107b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent};
108b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
109b52c152d553556b2d227ffc943489de0c60b4b02Eric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyServiceClient, "android.media.IAudioPolicyServiceClient");
110b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
111b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent// ----------------------------------------------------------------------
112b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
113b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentstatus_t BnAudioPolicyServiceClient::onTransact(
114b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
115b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{
116b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    switch (code) {
117b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    case PORT_LIST_UPDATE: {
118b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
119b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            onAudioPortListUpdate();
120b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
121b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
122b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    case PATCH_LIST_UPDATE: {
123b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
124b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            onAudioPatchListUpdate();
125b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent            return NO_ERROR;
126b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        } break;
127de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi    case MIX_STATE_UPDATE: {
128de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
129de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            String8 regId = data.readString8();
130de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            int32_t state = data.readInt32();
131de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            onDynamicPolicyMixStateUpdate(regId, state);
132de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi            return NO_ERROR;
1332f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        } break;
1342f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi    case RECORDING_CONFIGURATION_UPDATE: {
1352f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            CHECK_INTERFACE(IAudioPolicyServiceClient, data, reply);
1362f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            int event = (int) data.readInt32();
137ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi            record_client_info_t clientInfo;
1387281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            audio_config_base_t clientConfig;
1397281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            audio_config_base_t deviceConfig;
140ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi            readRecordClientInfoFromParcel(data, &clientInfo);
1417281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            readAudioConfigBaseFromParcel(data, &clientConfig);
1427281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi            readAudioConfigBaseFromParcel(data, &deviceConfig);
1438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            audio_patch_handle_t patchHandle = (audio_patch_handle_t) data.readInt32();
144ac4e42982d4537732b30e71c9a00ba0077944984Jean-Michel Trivi            onRecordingConfigurationUpdate(event, &clientInfo, &clientConfig, &deviceConfig,
1458c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi                    patchHandle);
1462f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi            return NO_ERROR;
1472f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi        } break;
148b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    default:
149b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent        return BBinder::onTransact(code, data, reply, flags);
150b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent    }
151b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent}
152b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
153b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent// ----------------------------------------------------------------------------
154b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent
15540bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
156