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