IAudioFlinger.cpp revision 2729ea9262ca60d93047e984739887cfc89e82eb
1/* //device/extlibs/pv/android/IAudioflinger.cpp 2** 3** Copyright 2007, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#define LOG_TAG "IAudioFlinger" 19#include <utils/Log.h> 20 21#include <stdint.h> 22#include <sys/types.h> 23 24#include <utils/Parcel.h> 25 26#include <media/IAudioFlinger.h> 27 28namespace android { 29 30enum { 31 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 32 OPEN_RECORD, 33 SAMPLE_RATE, 34 CHANNEL_COUNT, 35 FORMAT, 36 FRAME_COUNT, 37 SET_MASTER_VOLUME, 38 SET_MASTER_MUTE, 39 MASTER_VOLUME, 40 MASTER_MUTE, 41 SET_STREAM_VOLUME, 42 SET_STREAM_MUTE, 43 STREAM_VOLUME, 44 STREAM_MUTE, 45 SET_MODE, 46 GET_MODE, 47 SET_ROUTING, 48 GET_ROUTING, 49 SET_MIC_MUTE, 50 GET_MIC_MUTE, 51 IS_MUSIC_ACTIVE, 52 SET_PARAMETER, 53}; 54 55class BpAudioFlinger : public BpInterface<IAudioFlinger> 56{ 57public: 58 BpAudioFlinger(const sp<IBinder>& impl) 59 : BpInterface<IAudioFlinger>(impl) 60 { 61 } 62 63 virtual sp<IAudioTrack> createTrack( 64 pid_t pid, 65 int streamType, 66 uint32_t sampleRate, 67 int format, 68 int channelCount, 69 int bufferCount, 70 uint32_t flags) 71 { 72 Parcel data, reply; 73 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 74 data.writeInt32(pid); 75 data.writeInt32(streamType); 76 data.writeInt32(sampleRate); 77 data.writeInt32(format); 78 data.writeInt32(channelCount); 79 data.writeInt32(bufferCount); 80 data.writeInt32(flags); 81 status_t status = remote()->transact(CREATE_TRACK, data, &reply); 82 if ( status != NO_ERROR) { 83 LOGE("createTrack error: %s", strerror(-status)); 84 } 85 86 return interface_cast<IAudioTrack>(reply.readStrongBinder()); 87 } 88 89 virtual sp<IAudioRecord> openRecord( 90 pid_t pid, 91 int streamType, 92 uint32_t sampleRate, 93 int format, 94 int channelCount, 95 int bufferCount, 96 uint32_t flags) 97 { 98 Parcel data, reply; 99 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 100 data.writeInt32(pid); 101 data.writeInt32(streamType); 102 data.writeInt32(sampleRate); 103 data.writeInt32(format); 104 data.writeInt32(channelCount); 105 data.writeInt32(bufferCount); 106 data.writeInt32(flags); 107 remote()->transact(OPEN_RECORD, data, &reply); 108 return interface_cast<IAudioRecord>(reply.readStrongBinder()); 109 } 110 111 virtual uint32_t sampleRate() const 112 { 113 Parcel data, reply; 114 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 115 remote()->transact(SAMPLE_RATE, data, &reply); 116 return reply.readInt32(); 117 } 118 119 virtual int channelCount() const 120 { 121 Parcel data, reply; 122 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 123 remote()->transact(CHANNEL_COUNT, data, &reply); 124 return reply.readInt32(); 125 } 126 127 virtual int format() const 128 { 129 Parcel data, reply; 130 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 131 remote()->transact(FORMAT, data, &reply); 132 return reply.readInt32(); 133 } 134 135 virtual size_t frameCount() const 136 { 137 Parcel data, reply; 138 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 139 remote()->transact(FRAME_COUNT, data, &reply); 140 return reply.readInt32(); 141 } 142 143 virtual status_t setMasterVolume(float value) 144 { 145 Parcel data, reply; 146 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 147 data.writeFloat(value); 148 remote()->transact(SET_MASTER_VOLUME, data, &reply); 149 return reply.readInt32(); 150 } 151 152 virtual status_t setMasterMute(bool muted) 153 { 154 Parcel data, reply; 155 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 156 data.writeInt32(muted); 157 remote()->transact(SET_MASTER_MUTE, data, &reply); 158 return reply.readInt32(); 159 } 160 161 virtual float masterVolume() const 162 { 163 Parcel data, reply; 164 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 165 remote()->transact(MASTER_VOLUME, data, &reply); 166 return reply.readFloat(); 167 } 168 169 virtual bool masterMute() const 170 { 171 Parcel data, reply; 172 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 173 remote()->transact(MASTER_MUTE, data, &reply); 174 return reply.readInt32(); 175 } 176 177 virtual status_t setStreamVolume(int stream, float value) 178 { 179 Parcel data, reply; 180 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 181 data.writeInt32(stream); 182 data.writeFloat(value); 183 remote()->transact(SET_STREAM_VOLUME, data, &reply); 184 return reply.readInt32(); 185 } 186 187 virtual status_t setStreamMute(int stream, bool muted) 188 { 189 Parcel data, reply; 190 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 191 data.writeInt32(stream); 192 data.writeInt32(muted); 193 remote()->transact(SET_STREAM_MUTE, data, &reply); 194 return reply.readInt32(); 195 } 196 197 virtual float streamVolume(int stream) const 198 { 199 Parcel data, reply; 200 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 201 data.writeInt32(stream); 202 remote()->transact(STREAM_VOLUME, data, &reply); 203 return reply.readFloat(); 204 } 205 206 virtual bool streamMute(int stream) const 207 { 208 Parcel data, reply; 209 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 210 data.writeInt32(stream); 211 remote()->transact(STREAM_MUTE, data, &reply); 212 return reply.readInt32(); 213 } 214 215 virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask) 216 { 217 Parcel data, reply; 218 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 219 data.writeInt32(mode); 220 data.writeInt32(routes); 221 data.writeInt32(mask); 222 remote()->transact(SET_ROUTING, data, &reply); 223 return reply.readInt32(); 224 } 225 226 virtual uint32_t getRouting(int mode) const 227 { 228 Parcel data, reply; 229 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 230 data.writeInt32(mode); 231 remote()->transact(GET_ROUTING, data, &reply); 232 return reply.readInt32(); 233 } 234 235 virtual status_t setMode(int mode) 236 { 237 Parcel data, reply; 238 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 239 data.writeInt32(mode); 240 remote()->transact(SET_MODE, data, &reply); 241 return reply.readInt32(); 242 } 243 244 virtual int getMode() const 245 { 246 Parcel data, reply; 247 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 248 remote()->transact(GET_MODE, data, &reply); 249 return reply.readInt32(); 250 } 251 252 virtual status_t setMicMute(bool state) 253 { 254 Parcel data, reply; 255 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 256 data.writeInt32(state); 257 remote()->transact(SET_MIC_MUTE, data, &reply); 258 return reply.readInt32(); 259 } 260 261 virtual bool getMicMute() const 262 { 263 Parcel data, reply; 264 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 265 remote()->transact(GET_MIC_MUTE, data, &reply); 266 return reply.readInt32(); 267 } 268 269 virtual bool isMusicActive() const 270 { 271 Parcel data, reply; 272 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 273 remote()->transact(IS_MUSIC_ACTIVE, data, &reply); 274 return reply.readInt32(); 275 } 276 277 virtual status_t setParameter(const char* key, const char* value) 278 { 279 Parcel data, reply; 280 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 281 data.writeCString(key); 282 data.writeCString(value); 283 remote()->transact(SET_PARAMETER, data, &reply); 284 return reply.readInt32(); 285 } 286}; 287 288IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 289 290// ---------------------------------------------------------------------- 291 292#define CHECK_INTERFACE(interface, data, reply) \ 293 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 294 LOGW("Call incorrectly routed to " #interface); \ 295 return PERMISSION_DENIED; \ 296 } } while (0) 297 298status_t BnAudioFlinger::onTransact( 299 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 300{ 301 switch(code) { 302 case CREATE_TRACK: { 303 CHECK_INTERFACE(IAudioFlinger, data, reply); 304 pid_t pid = data.readInt32(); 305 int streamType = data.readInt32(); 306 uint32_t sampleRate = data.readInt32(); 307 int format = data.readInt32(); 308 int channelCount = data.readInt32(); 309 size_t bufferCount = data.readInt32(); 310 uint32_t flags = data.readInt32(); 311 sp<IAudioTrack> track = createTrack(pid, 312 streamType, sampleRate, format, 313 channelCount, bufferCount, flags); 314 reply->writeStrongBinder(track->asBinder()); 315 return NO_ERROR; 316 } break; 317 case OPEN_RECORD: { 318 CHECK_INTERFACE(IAudioFlinger, data, reply); 319 pid_t pid = data.readInt32(); 320 int streamType = data.readInt32(); 321 uint32_t sampleRate = data.readInt32(); 322 int format = data.readInt32(); 323 int channelCount = data.readInt32(); 324 size_t bufferCount = data.readInt32(); 325 uint32_t flags = data.readInt32(); 326 sp<IAudioRecord> record = openRecord(pid, streamType, 327 sampleRate, format, channelCount, bufferCount, flags); 328 reply->writeStrongBinder(record->asBinder()); 329 return NO_ERROR; 330 } break; 331 case SAMPLE_RATE: { 332 CHECK_INTERFACE(IAudioFlinger, data, reply); 333 reply->writeInt32( sampleRate() ); 334 return NO_ERROR; 335 } break; 336 case CHANNEL_COUNT: { 337 CHECK_INTERFACE(IAudioFlinger, data, reply); 338 reply->writeInt32( channelCount() ); 339 return NO_ERROR; 340 } break; 341 case FORMAT: { 342 CHECK_INTERFACE(IAudioFlinger, data, reply); 343 reply->writeInt32( format() ); 344 return NO_ERROR; 345 } break; 346 case FRAME_COUNT: { 347 CHECK_INTERFACE(IAudioFlinger, data, reply); 348 reply->writeInt32( frameCount() ); 349 return NO_ERROR; 350 } break; 351 case SET_MASTER_VOLUME: { 352 CHECK_INTERFACE(IAudioFlinger, data, reply); 353 reply->writeInt32( setMasterVolume(data.readFloat()) ); 354 return NO_ERROR; 355 } break; 356 case SET_MASTER_MUTE: { 357 CHECK_INTERFACE(IAudioFlinger, data, reply); 358 reply->writeInt32( setMasterMute(data.readInt32()) ); 359 return NO_ERROR; 360 } break; 361 case MASTER_VOLUME: { 362 CHECK_INTERFACE(IAudioFlinger, data, reply); 363 reply->writeFloat( masterVolume() ); 364 return NO_ERROR; 365 } break; 366 case MASTER_MUTE: { 367 CHECK_INTERFACE(IAudioFlinger, data, reply); 368 reply->writeInt32( masterMute() ); 369 return NO_ERROR; 370 } break; 371 case SET_STREAM_VOLUME: { 372 CHECK_INTERFACE(IAudioFlinger, data, reply); 373 int stream = data.readInt32(); 374 reply->writeInt32( setStreamVolume(stream, data.readFloat()) ); 375 return NO_ERROR; 376 } break; 377 case SET_STREAM_MUTE: { 378 CHECK_INTERFACE(IAudioFlinger, data, reply); 379 int stream = data.readInt32(); 380 reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 381 return NO_ERROR; 382 } break; 383 case STREAM_VOLUME: { 384 CHECK_INTERFACE(IAudioFlinger, data, reply); 385 int stream = data.readInt32(); 386 reply->writeFloat( streamVolume(stream) ); 387 return NO_ERROR; 388 } break; 389 case STREAM_MUTE: { 390 CHECK_INTERFACE(IAudioFlinger, data, reply); 391 int stream = data.readInt32(); 392 reply->writeInt32( streamMute(stream) ); 393 return NO_ERROR; 394 } break; 395 case SET_ROUTING: { 396 CHECK_INTERFACE(IAudioFlinger, data, reply); 397 int mode = data.readInt32(); 398 uint32_t routes = data.readInt32(); 399 uint32_t mask = data.readInt32(); 400 reply->writeInt32( setRouting(mode, routes, mask) ); 401 return NO_ERROR; 402 } break; 403 case GET_ROUTING: { 404 CHECK_INTERFACE(IAudioFlinger, data, reply); 405 int mode = data.readInt32(); 406 reply->writeInt32( getRouting(mode) ); 407 return NO_ERROR; 408 } break; 409 case SET_MODE: { 410 CHECK_INTERFACE(IAudioFlinger, data, reply); 411 int mode = data.readInt32(); 412 reply->writeInt32( setMode(mode) ); 413 return NO_ERROR; 414 } break; 415 case GET_MODE: { 416 CHECK_INTERFACE(IAudioFlinger, data, reply); 417 reply->writeInt32( getMode() ); 418 return NO_ERROR; 419 } break; 420 case SET_MIC_MUTE: { 421 CHECK_INTERFACE(IAudioFlinger, data, reply); 422 int state = data.readInt32(); 423 reply->writeInt32( setMicMute(state) ); 424 return NO_ERROR; 425 } break; 426 case GET_MIC_MUTE: { 427 CHECK_INTERFACE(IAudioFlinger, data, reply); 428 reply->writeInt32( getMicMute() ); 429 return NO_ERROR; 430 } break; 431 case IS_MUSIC_ACTIVE: { 432 CHECK_INTERFACE(IAudioFlinger, data, reply); 433 reply->writeInt32( isMusicActive() ); 434 return NO_ERROR; 435 } break; 436 case SET_PARAMETER: { 437 CHECK_INTERFACE(IAudioFlinger, data, reply); 438 const char *key = data.readCString(); 439 const char *value = data.readCString(); 440 reply->writeInt32( setParameter(key, value) ); 441 return NO_ERROR; 442 } break; 443 default: 444 return BBinder::onTransact(code, data, reply, flags); 445 } 446} 447 448// ---------------------------------------------------------------------------- 449 450}; // namespace android 451