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