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