1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "IAudioManager" 18 //#define LOG_NDEBUG 0 19 #include <utils/Log.h> 20 21 #include <stdint.h> 22 #include <sys/types.h> 23 24 #include <binder/Parcel.h> 25 #include <audiomanager/AudioManager.h> 26 #include <audiomanager/IAudioManager.h> 27 28 namespace android { 29 30 class BpAudioManager : public BpInterface<IAudioManager> 31 { 32 public: BpAudioManager(const sp<IBinder> & impl)33 explicit BpAudioManager(const sp<IBinder>& impl) 34 : BpInterface<IAudioManager>(impl) 35 { 36 } 37 trackPlayer(player_type_t playerType,audio_usage_t usage,audio_content_type_t content,const sp<IBinder> & player)38 virtual audio_unique_id_t trackPlayer(player_type_t playerType, audio_usage_t usage, 39 audio_content_type_t content, const sp<IBinder>& player) { 40 Parcel data, reply; 41 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 42 data.writeInt32(1); // non-null PlayerIdCard parcelable 43 // marshall PlayerIdCard data 44 data.writeInt32((int32_t) playerType); 45 // write attributes of PlayerIdCard 46 data.writeInt32((int32_t) usage); 47 data.writeInt32((int32_t) content); 48 data.writeInt32(0 /*source: none here, this is a player*/); 49 data.writeInt32(0 /*flags*/); 50 // write attributes' tags 51 data.writeInt32(1 /*FLATTEN_TAGS*/); 52 data.writeString16(String16("")); // no tags 53 // write attributes' bundle 54 data.writeInt32(-1977 /*ATTR_PARCEL_IS_NULL_BUNDLE*/); // no bundle 55 // write IPlayer 56 data.writeStrongBinder(player); 57 // get new PIId in reply 58 const status_t res = remote()->transact(TRACK_PLAYER, data, &reply, 0); 59 if (res != OK || reply.readExceptionCode() != 0) { 60 ALOGE("trackPlayer() failed, piid is %d", PLAYER_PIID_INVALID); 61 return PLAYER_PIID_INVALID; 62 } else { 63 const audio_unique_id_t piid = (audio_unique_id_t) reply.readInt32(); 64 ALOGV("trackPlayer() returned piid %d", piid); 65 return piid; 66 } 67 } 68 playerAttributes(audio_unique_id_t piid,audio_usage_t usage,audio_content_type_t content)69 virtual status_t playerAttributes(audio_unique_id_t piid, audio_usage_t usage, 70 audio_content_type_t content) { 71 Parcel data, reply; 72 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 73 data.writeInt32((int32_t) piid); 74 data.writeInt32(1); // non-null AudioAttributes parcelable 75 data.writeInt32((int32_t) usage); 76 data.writeInt32((int32_t) content); 77 data.writeInt32(0 /*source: none here, this is a player*/); 78 data.writeInt32(0 /*flags*/); 79 // write attributes' tags 80 data.writeInt32(1 /*FLATTEN_TAGS*/); 81 data.writeString16(String16("")); // no tags 82 // write attributes' bundle 83 data.writeInt32(-1977 /*ATTR_PARCEL_IS_NULL_BUNDLE*/); // no bundle 84 return remote()->transact(PLAYER_ATTRIBUTES, data, &reply, IBinder::FLAG_ONEWAY); 85 } 86 playerEvent(audio_unique_id_t piid,player_state_t event)87 virtual status_t playerEvent(audio_unique_id_t piid, player_state_t event) { 88 Parcel data, reply; 89 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 90 data.writeInt32((int32_t) piid); 91 data.writeInt32((int32_t) event); 92 return remote()->transact(PLAYER_EVENT, data, &reply, IBinder::FLAG_ONEWAY); 93 } 94 releasePlayer(audio_unique_id_t piid)95 virtual status_t releasePlayer(audio_unique_id_t piid) { 96 Parcel data, reply; 97 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 98 data.writeInt32((int32_t) piid); 99 return remote()->transact(RELEASE_PLAYER, data, &reply, IBinder::FLAG_ONEWAY); 100 } 101 trackRecorder(const sp<IBinder> & recorder)102 virtual audio_unique_id_t trackRecorder(const sp<IBinder>& recorder) { 103 Parcel data, reply; 104 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 105 data.writeStrongBinder(recorder); 106 // get new RIId in reply 107 const status_t res = remote()->transact(TRACK_RECORDER, data, &reply, 0); 108 if (res != OK || reply.readExceptionCode() != 0) { 109 ALOGE("trackRecorder() failed, riid is %d", RECORD_RIID_INVALID); 110 return RECORD_RIID_INVALID; 111 } else { 112 const audio_unique_id_t riid = (audio_unique_id_t) reply.readInt32(); 113 ALOGV("trackRecorder() returned riid %d", riid); 114 return riid; 115 } 116 } 117 recorderEvent(audio_unique_id_t riid,recorder_state_t event)118 virtual status_t recorderEvent(audio_unique_id_t riid, recorder_state_t event) { 119 Parcel data, reply; 120 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 121 data.writeInt32((int32_t) riid); 122 data.writeInt32((int32_t) event); 123 return remote()->transact(RECORDER_EVENT, data, &reply, IBinder::FLAG_ONEWAY); 124 } 125 releaseRecorder(audio_unique_id_t riid)126 virtual status_t releaseRecorder(audio_unique_id_t riid) { 127 Parcel data, reply; 128 data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor()); 129 data.writeInt32((int32_t) riid); 130 return remote()->transact(RELEASE_RECORDER, data, &reply, IBinder::FLAG_ONEWAY); 131 } 132 }; 133 134 IMPLEMENT_META_INTERFACE(AudioManager, "android.media.IAudioService"); 135 136 // ---------------------------------------------------------------------------- 137 138 }; // namespace android 139