1 /* 2 ** 3 ** Copyright 2008, 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 // Proxy for media player implementations 19 20 //#define LOG_NDEBUG 0 21 #define LOG_TAG "MediaPlayerService" 22 #include <utils/Log.h> 23 24 #include <sys/types.h> 25 #include <sys/stat.h> 26 #include <sys/time.h> 27 #include <dirent.h> 28 #include <unistd.h> 29 30 #include <string.h> 31 32 #include <cutils/atomic.h> 33 #include <cutils/properties.h> // for property_get 34 35 #include <utils/misc.h> 36 37 #include <android_runtime/ActivityManager.h> 38 39 #include <binder/IPCThreadState.h> 40 #include <binder/IServiceManager.h> 41 #include <binder/MemoryHeapBase.h> 42 #include <binder/MemoryBase.h> 43 #include <gui/SurfaceTextureClient.h> 44 #include <utils/Errors.h> // for status_t 45 #include <utils/String8.h> 46 #include <utils/SystemClock.h> 47 #include <utils/Vector.h> 48 #include <cutils/properties.h> 49 50 #include <media/MediaPlayerInterface.h> 51 #include <media/mediarecorder.h> 52 #include <media/MediaMetadataRetrieverInterface.h> 53 #include <media/Metadata.h> 54 #include <media/AudioTrack.h> 55 #include <media/MemoryLeakTrackUtil.h> 56 #include <media/stagefright/MediaErrors.h> 57 58 #include <system/audio.h> 59 60 #include <private/android_filesystem_config.h> 61 62 #include "MediaRecorderClient.h" 63 #include "MediaPlayerService.h" 64 #include "MetadataRetrieverClient.h" 65 66 #include "MidiFile.h" 67 #include "TestPlayerStub.h" 68 #include "StagefrightPlayer.h" 69 #include "nuplayer/NuPlayerDriver.h" 70 71 #include <OMX.h> 72 73 namespace { 74 using android::media::Metadata; 75 using android::status_t; 76 using android::OK; 77 using android::BAD_VALUE; 78 using android::NOT_ENOUGH_DATA; 79 using android::Parcel; 80 81 // Max number of entries in the filter. 82 const int kMaxFilterSize = 64; // I pulled that out of thin air. 83 84 // FIXME: Move all the metadata related function in the Metadata.cpp 85 86 87 // Unmarshall a filter from a Parcel. 88 // Filter format in a parcel: 89 // 90 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 91 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 92 // | number of entries (n) | 93 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 94 // | metadata type 1 | 95 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 96 // | metadata type 2 | 97 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 98 // .... 99 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 100 // | metadata type n | 101 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 102 // 103 // @param p Parcel that should start with a filter. 104 // @param[out] filter On exit contains the list of metadata type to be 105 // filtered. 106 // @param[out] status On exit contains the status code to be returned. 107 // @return true if the parcel starts with a valid filter. 108 bool unmarshallFilter(const Parcel& p, 109 Metadata::Filter *filter, 110 status_t *status) 111 { 112 int32_t val; 113 if (p.readInt32(&val) != OK) 114 { 115 LOGE("Failed to read filter's length"); 116 *status = NOT_ENOUGH_DATA; 117 return false; 118 } 119 120 if( val > kMaxFilterSize || val < 0) 121 { 122 LOGE("Invalid filter len %d", val); 123 *status = BAD_VALUE; 124 return false; 125 } 126 127 const size_t num = val; 128 129 filter->clear(); 130 filter->setCapacity(num); 131 132 size_t size = num * sizeof(Metadata::Type); 133 134 135 if (p.dataAvail() < size) 136 { 137 LOGE("Filter too short expected %d but got %d", size, p.dataAvail()); 138 *status = NOT_ENOUGH_DATA; 139 return false; 140 } 141 142 const Metadata::Type *data = 143 static_cast<const Metadata::Type*>(p.readInplace(size)); 144 145 if (NULL == data) 146 { 147 LOGE("Filter had no data"); 148 *status = BAD_VALUE; 149 return false; 150 } 151 152 // TODO: The stl impl of vector would be more efficient here 153 // because it degenerates into a memcpy on pod types. Try to 154 // replace later or use stl::set. 155 for (size_t i = 0; i < num; ++i) 156 { 157 filter->add(*data); 158 ++data; 159 } 160 *status = OK; 161 return true; 162 } 163 164 // @param filter Of metadata type. 165 // @param val To be searched. 166 // @return true if a match was found. 167 bool findMetadata(const Metadata::Filter& filter, const int32_t val) 168 { 169 // Deal with empty and ANY right away 170 if (filter.isEmpty()) return false; 171 if (filter[0] == Metadata::kAny) return true; 172 173 return filter.indexOf(val) >= 0; 174 } 175 176 } // anonymous namespace 177 178 179 namespace android { 180 181 static bool checkPermission(const char* permissionString) { 182 #ifndef HAVE_ANDROID_OS 183 return true; 184 #endif 185 if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 186 bool ok = checkCallingPermission(String16(permissionString)); 187 if (!ok) LOGE("Request requires %s", permissionString); 188 return ok; 189 } 190 191 // TODO: Temp hack until we can register players 192 typedef struct { 193 const char *extension; 194 const player_type playertype; 195 } extmap; 196 extmap FILE_EXTS [] = { 197 {".mid", SONIVOX_PLAYER}, 198 {".midi", SONIVOX_PLAYER}, 199 {".smf", SONIVOX_PLAYER}, 200 {".xmf", SONIVOX_PLAYER}, 201 {".imy", SONIVOX_PLAYER}, 202 {".rtttl", SONIVOX_PLAYER}, 203 {".rtx", SONIVOX_PLAYER}, 204 {".ota", SONIVOX_PLAYER}, 205 }; 206 207 // TODO: Find real cause of Audio/Video delay in PV framework and remove this workaround 208 /* static */ int MediaPlayerService::AudioOutput::mMinBufferCount = 4; 209 /* static */ bool MediaPlayerService::AudioOutput::mIsOnEmulator = false; 210 211 void MediaPlayerService::instantiate() { 212 defaultServiceManager()->addService( 213 String16("media.player"), new MediaPlayerService()); 214 } 215 216 MediaPlayerService::MediaPlayerService() 217 { 218 LOGV("MediaPlayerService created"); 219 mNextConnId = 1; 220 221 mBatteryAudio.refCount = 0; 222 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 223 mBatteryAudio.deviceOn[i] = 0; 224 mBatteryAudio.lastTime[i] = 0; 225 mBatteryAudio.totalTime[i] = 0; 226 } 227 // speaker is on by default 228 mBatteryAudio.deviceOn[SPEAKER] = 1; 229 } 230 231 MediaPlayerService::~MediaPlayerService() 232 { 233 LOGV("MediaPlayerService destroyed"); 234 } 235 236 sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(pid_t pid) 237 { 238 sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid); 239 wp<MediaRecorderClient> w = recorder; 240 Mutex::Autolock lock(mLock); 241 mMediaRecorderClients.add(w); 242 LOGV("Create new media recorder client from pid %d", pid); 243 return recorder; 244 } 245 246 void MediaPlayerService::removeMediaRecorderClient(wp<MediaRecorderClient> client) 247 { 248 Mutex::Autolock lock(mLock); 249 mMediaRecorderClients.remove(client); 250 LOGV("Delete media recorder client"); 251 } 252 253 sp<IMediaMetadataRetriever> MediaPlayerService::createMetadataRetriever(pid_t pid) 254 { 255 sp<MetadataRetrieverClient> retriever = new MetadataRetrieverClient(pid); 256 LOGV("Create new media retriever from pid %d", pid); 257 return retriever; 258 } 259 260 sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, 261 int audioSessionId) 262 { 263 int32_t connId = android_atomic_inc(&mNextConnId); 264 265 sp<Client> c = new Client( 266 this, pid, connId, client, audioSessionId, 267 IPCThreadState::self()->getCallingUid()); 268 269 LOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid, 270 IPCThreadState::self()->getCallingUid()); 271 272 wp<Client> w = c; 273 { 274 Mutex::Autolock lock(mLock); 275 mClients.add(w); 276 } 277 return c; 278 } 279 280 sp<IOMX> MediaPlayerService::getOMX() { 281 Mutex::Autolock autoLock(mLock); 282 283 if (mOMX.get() == NULL) { 284 mOMX = new OMX; 285 } 286 287 return mOMX; 288 } 289 290 status_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& args) const 291 { 292 const size_t SIZE = 256; 293 char buffer[SIZE]; 294 String8 result; 295 296 result.append(" AudioCache\n"); 297 if (mHeap != 0) { 298 snprintf(buffer, 255, " heap base(%p), size(%d), flags(%d), device(%s)\n", 299 mHeap->getBase(), mHeap->getSize(), mHeap->getFlags(), mHeap->getDevice()); 300 result.append(buffer); 301 } 302 snprintf(buffer, 255, " msec per frame(%f), channel count(%d), format(%d), frame count(%ld)\n", 303 mMsecsPerFrame, mChannelCount, mFormat, mFrameCount); 304 result.append(buffer); 305 snprintf(buffer, 255, " sample rate(%d), size(%d), error(%d), command complete(%s)\n", 306 mSampleRate, mSize, mError, mCommandComplete?"true":"false"); 307 result.append(buffer); 308 ::write(fd, result.string(), result.size()); 309 return NO_ERROR; 310 } 311 312 status_t MediaPlayerService::AudioOutput::dump(int fd, const Vector<String16>& args) const 313 { 314 const size_t SIZE = 256; 315 char buffer[SIZE]; 316 String8 result; 317 318 result.append(" AudioOutput\n"); 319 snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", 320 mStreamType, mLeftVolume, mRightVolume); 321 result.append(buffer); 322 snprintf(buffer, 255, " msec per frame(%f), latency (%d)\n", 323 mMsecsPerFrame, mLatency); 324 result.append(buffer); 325 snprintf(buffer, 255, " aux effect id(%d), send level (%f)\n", 326 mAuxEffectId, mSendLevel); 327 result.append(buffer); 328 329 ::write(fd, result.string(), result.size()); 330 if (mTrack != 0) { 331 mTrack->dump(fd, args); 332 } 333 return NO_ERROR; 334 } 335 336 status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) const 337 { 338 const size_t SIZE = 256; 339 char buffer[SIZE]; 340 String8 result; 341 result.append(" Client\n"); 342 snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", 343 mPid, mConnId, mStatus, mLoop?"true": "false"); 344 result.append(buffer); 345 write(fd, result.string(), result.size()); 346 if (mPlayer != NULL) { 347 mPlayer->dump(fd, args); 348 } 349 if (mAudioOutput != 0) { 350 mAudioOutput->dump(fd, args); 351 } 352 write(fd, "\n", 1); 353 return NO_ERROR; 354 } 355 356 status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) 357 { 358 const size_t SIZE = 256; 359 char buffer[SIZE]; 360 String8 result; 361 if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 362 snprintf(buffer, SIZE, "Permission Denial: " 363 "can't dump MediaPlayerService from pid=%d, uid=%d\n", 364 IPCThreadState::self()->getCallingPid(), 365 IPCThreadState::self()->getCallingUid()); 366 result.append(buffer); 367 } else { 368 Mutex::Autolock lock(mLock); 369 for (int i = 0, n = mClients.size(); i < n; ++i) { 370 sp<Client> c = mClients[i].promote(); 371 if (c != 0) c->dump(fd, args); 372 } 373 if (mMediaRecorderClients.size() == 0) { 374 result.append(" No media recorder client\n\n"); 375 } else { 376 for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) { 377 sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote(); 378 if (c != 0) { 379 snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid); 380 result.append(buffer); 381 write(fd, result.string(), result.size()); 382 result = "\n"; 383 c->dump(fd, args); 384 } 385 } 386 } 387 388 result.append(" Files opened and/or mapped:\n"); 389 snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); 390 FILE *f = fopen(buffer, "r"); 391 if (f) { 392 while (!feof(f)) { 393 fgets(buffer, SIZE, f); 394 if (strstr(buffer, " /mnt/sdcard/") || 395 strstr(buffer, " /system/sounds/") || 396 strstr(buffer, " /data/") || 397 strstr(buffer, " /system/media/")) { 398 result.append(" "); 399 result.append(buffer); 400 } 401 } 402 fclose(f); 403 } else { 404 result.append("couldn't open "); 405 result.append(buffer); 406 result.append("\n"); 407 } 408 409 snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); 410 DIR *d = opendir(buffer); 411 if (d) { 412 struct dirent *ent; 413 while((ent = readdir(d)) != NULL) { 414 if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { 415 snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); 416 struct stat s; 417 if (lstat(buffer, &s) == 0) { 418 if ((s.st_mode & S_IFMT) == S_IFLNK) { 419 char linkto[256]; 420 int len = readlink(buffer, linkto, sizeof(linkto)); 421 if(len > 0) { 422 if(len > 255) { 423 linkto[252] = '.'; 424 linkto[253] = '.'; 425 linkto[254] = '.'; 426 linkto[255] = 0; 427 } else { 428 linkto[len] = 0; 429 } 430 if (strstr(linkto, "/mnt/sdcard/") == linkto || 431 strstr(linkto, "/system/sounds/") == linkto || 432 strstr(linkto, "/data/") == linkto || 433 strstr(linkto, "/system/media/") == linkto) { 434 result.append(" "); 435 result.append(buffer); 436 result.append(" -> "); 437 result.append(linkto); 438 result.append("\n"); 439 } 440 } 441 } else { 442 result.append(" unexpected type for "); 443 result.append(buffer); 444 result.append("\n"); 445 } 446 } 447 } 448 } 449 closedir(d); 450 } else { 451 result.append("couldn't open "); 452 result.append(buffer); 453 result.append("\n"); 454 } 455 456 bool dumpMem = false; 457 for (size_t i = 0; i < args.size(); i++) { 458 if (args[i] == String16("-m")) { 459 dumpMem = true; 460 } 461 } 462 if (dumpMem) { 463 dumpMemoryAddresses(fd); 464 } 465 } 466 write(fd, result.string(), result.size()); 467 return NO_ERROR; 468 } 469 470 void MediaPlayerService::removeClient(wp<Client> client) 471 { 472 Mutex::Autolock lock(mLock); 473 mClients.remove(client); 474 } 475 476 MediaPlayerService::Client::Client( 477 const sp<MediaPlayerService>& service, pid_t pid, 478 int32_t connId, const sp<IMediaPlayerClient>& client, 479 int audioSessionId, uid_t uid) 480 { 481 LOGV("Client(%d) constructor", connId); 482 mPid = pid; 483 mConnId = connId; 484 mService = service; 485 mClient = client; 486 mLoop = false; 487 mStatus = NO_INIT; 488 mAudioSessionId = audioSessionId; 489 mUID = uid; 490 491 #if CALLBACK_ANTAGONIZER 492 LOGD("create Antagonizer"); 493 mAntagonizer = new Antagonizer(notify, this); 494 #endif 495 } 496 497 MediaPlayerService::Client::~Client() 498 { 499 LOGV("Client(%d) destructor pid = %d", mConnId, mPid); 500 mAudioOutput.clear(); 501 wp<Client> client(this); 502 disconnect(); 503 mService->removeClient(client); 504 } 505 506 void MediaPlayerService::Client::disconnect() 507 { 508 LOGV("disconnect(%d) from pid %d", mConnId, mPid); 509 // grab local reference and clear main reference to prevent future 510 // access to object 511 sp<MediaPlayerBase> p; 512 { 513 Mutex::Autolock l(mLock); 514 p = mPlayer; 515 } 516 mClient.clear(); 517 518 mPlayer.clear(); 519 520 // clear the notification to prevent callbacks to dead client 521 // and reset the player. We assume the player will serialize 522 // access to itself if necessary. 523 if (p != 0) { 524 p->setNotifyCallback(0, 0); 525 #if CALLBACK_ANTAGONIZER 526 LOGD("kill Antagonizer"); 527 mAntagonizer->kill(); 528 #endif 529 p->reset(); 530 } 531 532 disconnectNativeWindow(); 533 534 IPCThreadState::self()->flushCommands(); 535 } 536 537 static player_type getDefaultPlayerType() { 538 return STAGEFRIGHT_PLAYER; 539 } 540 541 player_type getPlayerType(int fd, int64_t offset, int64_t length) 542 { 543 char buf[20]; 544 lseek(fd, offset, SEEK_SET); 545 read(fd, buf, sizeof(buf)); 546 lseek(fd, offset, SEEK_SET); 547 548 long ident = *((long*)buf); 549 550 // Ogg vorbis? 551 if (ident == 0x5367674f) // 'OggS' 552 return STAGEFRIGHT_PLAYER; 553 554 // Some kind of MIDI? 555 EAS_DATA_HANDLE easdata; 556 if (EAS_Init(&easdata) == EAS_SUCCESS) { 557 EAS_FILE locator; 558 locator.path = NULL; 559 locator.fd = fd; 560 locator.offset = offset; 561 locator.length = length; 562 EAS_HANDLE eashandle; 563 if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) { 564 EAS_CloseFile(easdata, eashandle); 565 EAS_Shutdown(easdata); 566 return SONIVOX_PLAYER; 567 } 568 EAS_Shutdown(easdata); 569 } 570 571 return getDefaultPlayerType(); 572 } 573 574 player_type getPlayerType(const char* url) 575 { 576 if (TestPlayerStub::canBeUsed(url)) { 577 return TEST_PLAYER; 578 } 579 580 if (!strncasecmp("http://", url, 7) 581 || !strncasecmp("https://", url, 8)) { 582 size_t len = strlen(url); 583 if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 584 return NU_PLAYER; 585 } 586 587 if (strstr(url,"m3u8")) { 588 return NU_PLAYER; 589 } 590 } 591 592 // use MidiFile for MIDI extensions 593 int lenURL = strlen(url); 594 for (int i = 0; i < NELEM(FILE_EXTS); ++i) { 595 int len = strlen(FILE_EXTS[i].extension); 596 int start = lenURL - len; 597 if (start > 0) { 598 if (!strncasecmp(url + start, FILE_EXTS[i].extension, len)) { 599 return FILE_EXTS[i].playertype; 600 } 601 } 602 } 603 604 return getDefaultPlayerType(); 605 } 606 607 static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie, 608 notify_callback_f notifyFunc) 609 { 610 sp<MediaPlayerBase> p; 611 switch (playerType) { 612 case SONIVOX_PLAYER: 613 LOGV(" create MidiFile"); 614 p = new MidiFile(); 615 break; 616 case STAGEFRIGHT_PLAYER: 617 LOGV(" create StagefrightPlayer"); 618 p = new StagefrightPlayer; 619 break; 620 case NU_PLAYER: 621 LOGV(" create NuPlayer"); 622 p = new NuPlayerDriver; 623 break; 624 case TEST_PLAYER: 625 LOGV("Create Test Player stub"); 626 p = new TestPlayerStub(); 627 break; 628 default: 629 LOGE("Unknown player type: %d", playerType); 630 return NULL; 631 } 632 if (p != NULL) { 633 if (p->initCheck() == NO_ERROR) { 634 p->setNotifyCallback(cookie, notifyFunc); 635 } else { 636 p.clear(); 637 } 638 } 639 if (p == NULL) { 640 LOGE("Failed to create player object"); 641 } 642 return p; 643 } 644 645 sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) 646 { 647 // determine if we have the right player type 648 sp<MediaPlayerBase> p = mPlayer; 649 if ((p != NULL) && (p->playerType() != playerType)) { 650 LOGV("delete player"); 651 p.clear(); 652 } 653 if (p == NULL) { 654 p = android::createPlayer(playerType, this, notify); 655 } 656 657 if (p != NULL) { 658 p->setUID(mUID); 659 } 660 661 return p; 662 } 663 664 status_t MediaPlayerService::Client::setDataSource( 665 const char *url, const KeyedVector<String8, String8> *headers) 666 { 667 LOGV("setDataSource(%s)", url); 668 if (url == NULL) 669 return UNKNOWN_ERROR; 670 671 if ((strncmp(url, "http://", 7) == 0) || 672 (strncmp(url, "https://", 8) == 0) || 673 (strncmp(url, "rtsp://", 7) == 0)) { 674 if (!checkPermission("android.permission.INTERNET")) { 675 return PERMISSION_DENIED; 676 } 677 } 678 679 if (strncmp(url, "content://", 10) == 0) { 680 // get a filedescriptor for the content Uri and 681 // pass it to the setDataSource(fd) method 682 683 String16 url16(url); 684 int fd = android::openContentProviderFile(url16); 685 if (fd < 0) 686 { 687 LOGE("Couldn't open fd for %s", url); 688 return UNKNOWN_ERROR; 689 } 690 setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus 691 close(fd); 692 return mStatus; 693 } else { 694 player_type playerType = getPlayerType(url); 695 LOGV("player type = %d", playerType); 696 697 // create the right type of player 698 sp<MediaPlayerBase> p = createPlayer(playerType); 699 if (p == NULL) return NO_INIT; 700 701 if (!p->hardwareOutput()) { 702 mAudioOutput = new AudioOutput(mAudioSessionId); 703 static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 704 } 705 706 // now set data source 707 LOGV(" setDataSource"); 708 mStatus = p->setDataSource(url, headers); 709 if (mStatus == NO_ERROR) { 710 mPlayer = p; 711 } else { 712 LOGE(" error: %d", mStatus); 713 } 714 return mStatus; 715 } 716 } 717 718 status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length) 719 { 720 LOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); 721 struct stat sb; 722 int ret = fstat(fd, &sb); 723 if (ret != 0) { 724 LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 725 return UNKNOWN_ERROR; 726 } 727 728 LOGV("st_dev = %llu", sb.st_dev); 729 LOGV("st_mode = %u", sb.st_mode); 730 LOGV("st_uid = %lu", sb.st_uid); 731 LOGV("st_gid = %lu", sb.st_gid); 732 LOGV("st_size = %llu", sb.st_size); 733 734 if (offset >= sb.st_size) { 735 LOGE("offset error"); 736 ::close(fd); 737 return UNKNOWN_ERROR; 738 } 739 if (offset + length > sb.st_size) { 740 length = sb.st_size - offset; 741 LOGV("calculated length = %lld", length); 742 } 743 744 player_type playerType = getPlayerType(fd, offset, length); 745 LOGV("player type = %d", playerType); 746 747 // create the right type of player 748 sp<MediaPlayerBase> p = createPlayer(playerType); 749 if (p == NULL) return NO_INIT; 750 751 if (!p->hardwareOutput()) { 752 mAudioOutput = new AudioOutput(mAudioSessionId); 753 static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 754 } 755 756 // now set data source 757 mStatus = p->setDataSource(fd, offset, length); 758 if (mStatus == NO_ERROR) mPlayer = p; 759 760 return mStatus; 761 } 762 763 status_t MediaPlayerService::Client::setDataSource( 764 const sp<IStreamSource> &source) { 765 // create the right type of player 766 sp<MediaPlayerBase> p = createPlayer(NU_PLAYER); 767 768 if (p == NULL) { 769 return NO_INIT; 770 } 771 772 if (!p->hardwareOutput()) { 773 mAudioOutput = new AudioOutput(mAudioSessionId); 774 static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 775 } 776 777 // now set data source 778 mStatus = p->setDataSource(source); 779 780 if (mStatus == OK) { 781 mPlayer = p; 782 } 783 784 return mStatus; 785 } 786 787 status_t MediaPlayerService::Client::setVideoSurface(const sp<Surface>& surface) 788 { 789 LOGV("[%d] setVideoSurface(%p)", mConnId, surface.get()); 790 sp<MediaPlayerBase> p = getPlayer(); 791 if (p == 0) return UNKNOWN_ERROR; 792 return p->setVideoSurface(surface); 793 } 794 795 void MediaPlayerService::Client::disconnectNativeWindow() { 796 if (mConnectedWindow != NULL) { 797 status_t err = native_window_api_disconnect(mConnectedWindow.get(), 798 NATIVE_WINDOW_API_MEDIA); 799 800 if (err != OK) { 801 LOGW("native_window_api_disconnect returned an error: %s (%d)", 802 strerror(-err), err); 803 } 804 } 805 mConnectedWindow.clear(); 806 } 807 808 status_t MediaPlayerService::Client::setVideoSurfaceTexture( 809 const sp<ISurfaceTexture>& surfaceTexture) 810 { 811 LOGV("[%d] setVideoSurfaceTexture(%p)", mConnId, surfaceTexture.get()); 812 sp<MediaPlayerBase> p = getPlayer(); 813 if (p == 0) return UNKNOWN_ERROR; 814 815 sp<IBinder> binder(surfaceTexture == NULL ? NULL : 816 surfaceTexture->asBinder()); 817 if (mConnectedWindowBinder == binder) { 818 return OK; 819 } 820 821 sp<ANativeWindow> anw; 822 if (surfaceTexture != NULL) { 823 anw = new SurfaceTextureClient(surfaceTexture); 824 status_t err = native_window_api_connect(anw.get(), 825 NATIVE_WINDOW_API_MEDIA); 826 827 if (err != OK) { 828 LOGE("setVideoSurfaceTexture failed: %d", err); 829 // Note that we must do the reset before disconnecting from the ANW. 830 // Otherwise queue/dequeue calls could be made on the disconnected 831 // ANW, which may result in errors. 832 reset(); 833 834 disconnectNativeWindow(); 835 836 return err; 837 } 838 } 839 840 // Note that we must set the player's new SurfaceTexture before 841 // disconnecting the old one. Otherwise queue/dequeue calls could be made 842 // on the disconnected ANW, which may result in errors. 843 status_t err = p->setVideoSurfaceTexture(surfaceTexture); 844 845 disconnectNativeWindow(); 846 847 mConnectedWindow = anw; 848 849 if (err == OK) { 850 mConnectedWindowBinder = binder; 851 } else { 852 disconnectNativeWindow(); 853 } 854 855 return err; 856 } 857 858 status_t MediaPlayerService::Client::invoke(const Parcel& request, 859 Parcel *reply) 860 { 861 sp<MediaPlayerBase> p = getPlayer(); 862 if (p == NULL) return UNKNOWN_ERROR; 863 return p->invoke(request, reply); 864 } 865 866 // This call doesn't need to access the native player. 867 status_t MediaPlayerService::Client::setMetadataFilter(const Parcel& filter) 868 { 869 status_t status; 870 media::Metadata::Filter allow, drop; 871 872 if (unmarshallFilter(filter, &allow, &status) && 873 unmarshallFilter(filter, &drop, &status)) { 874 Mutex::Autolock lock(mLock); 875 876 mMetadataAllow = allow; 877 mMetadataDrop = drop; 878 } 879 return status; 880 } 881 882 status_t MediaPlayerService::Client::getMetadata( 883 bool update_only, bool apply_filter, Parcel *reply) 884 { 885 sp<MediaPlayerBase> player = getPlayer(); 886 if (player == 0) return UNKNOWN_ERROR; 887 888 status_t status; 889 // Placeholder for the return code, updated by the caller. 890 reply->writeInt32(-1); 891 892 media::Metadata::Filter ids; 893 894 // We don't block notifications while we fetch the data. We clear 895 // mMetadataUpdated first so we don't lose notifications happening 896 // during the rest of this call. 897 { 898 Mutex::Autolock lock(mLock); 899 if (update_only) { 900 ids = mMetadataUpdated; 901 } 902 mMetadataUpdated.clear(); 903 } 904 905 media::Metadata metadata(reply); 906 907 metadata.appendHeader(); 908 status = player->getMetadata(ids, reply); 909 910 if (status != OK) { 911 metadata.resetParcel(); 912 LOGE("getMetadata failed %d", status); 913 return status; 914 } 915 916 // FIXME: Implement filtering on the result. Not critical since 917 // filtering takes place on the update notifications already. This 918 // would be when all the metadata are fetch and a filter is set. 919 920 // Everything is fine, update the metadata length. 921 metadata.updateLength(); 922 return OK; 923 } 924 925 status_t MediaPlayerService::Client::prepareAsync() 926 { 927 LOGV("[%d] prepareAsync", mConnId); 928 sp<MediaPlayerBase> p = getPlayer(); 929 if (p == 0) return UNKNOWN_ERROR; 930 status_t ret = p->prepareAsync(); 931 #if CALLBACK_ANTAGONIZER 932 LOGD("start Antagonizer"); 933 if (ret == NO_ERROR) mAntagonizer->start(); 934 #endif 935 return ret; 936 } 937 938 status_t MediaPlayerService::Client::start() 939 { 940 LOGV("[%d] start", mConnId); 941 sp<MediaPlayerBase> p = getPlayer(); 942 if (p == 0) return UNKNOWN_ERROR; 943 p->setLooping(mLoop); 944 return p->start(); 945 } 946 947 status_t MediaPlayerService::Client::stop() 948 { 949 LOGV("[%d] stop", mConnId); 950 sp<MediaPlayerBase> p = getPlayer(); 951 if (p == 0) return UNKNOWN_ERROR; 952 return p->stop(); 953 } 954 955 status_t MediaPlayerService::Client::pause() 956 { 957 LOGV("[%d] pause", mConnId); 958 sp<MediaPlayerBase> p = getPlayer(); 959 if (p == 0) return UNKNOWN_ERROR; 960 return p->pause(); 961 } 962 963 status_t MediaPlayerService::Client::isPlaying(bool* state) 964 { 965 *state = false; 966 sp<MediaPlayerBase> p = getPlayer(); 967 if (p == 0) return UNKNOWN_ERROR; 968 *state = p->isPlaying(); 969 LOGV("[%d] isPlaying: %d", mConnId, *state); 970 return NO_ERROR; 971 } 972 973 status_t MediaPlayerService::Client::getCurrentPosition(int *msec) 974 { 975 LOGV("getCurrentPosition"); 976 sp<MediaPlayerBase> p = getPlayer(); 977 if (p == 0) return UNKNOWN_ERROR; 978 status_t ret = p->getCurrentPosition(msec); 979 if (ret == NO_ERROR) { 980 LOGV("[%d] getCurrentPosition = %d", mConnId, *msec); 981 } else { 982 LOGE("getCurrentPosition returned %d", ret); 983 } 984 return ret; 985 } 986 987 status_t MediaPlayerService::Client::getDuration(int *msec) 988 { 989 LOGV("getDuration"); 990 sp<MediaPlayerBase> p = getPlayer(); 991 if (p == 0) return UNKNOWN_ERROR; 992 status_t ret = p->getDuration(msec); 993 if (ret == NO_ERROR) { 994 LOGV("[%d] getDuration = %d", mConnId, *msec); 995 } else { 996 LOGE("getDuration returned %d", ret); 997 } 998 return ret; 999 } 1000 1001 status_t MediaPlayerService::Client::seekTo(int msec) 1002 { 1003 LOGV("[%d] seekTo(%d)", mConnId, msec); 1004 sp<MediaPlayerBase> p = getPlayer(); 1005 if (p == 0) return UNKNOWN_ERROR; 1006 return p->seekTo(msec); 1007 } 1008 1009 status_t MediaPlayerService::Client::reset() 1010 { 1011 LOGV("[%d] reset", mConnId); 1012 sp<MediaPlayerBase> p = getPlayer(); 1013 if (p == 0) return UNKNOWN_ERROR; 1014 return p->reset(); 1015 } 1016 1017 status_t MediaPlayerService::Client::setAudioStreamType(int type) 1018 { 1019 LOGV("[%d] setAudioStreamType(%d)", mConnId, type); 1020 // TODO: for hardware output, call player instead 1021 Mutex::Autolock l(mLock); 1022 if (mAudioOutput != 0) mAudioOutput->setAudioStreamType(type); 1023 return NO_ERROR; 1024 } 1025 1026 status_t MediaPlayerService::Client::setLooping(int loop) 1027 { 1028 LOGV("[%d] setLooping(%d)", mConnId, loop); 1029 mLoop = loop; 1030 sp<MediaPlayerBase> p = getPlayer(); 1031 if (p != 0) return p->setLooping(loop); 1032 return NO_ERROR; 1033 } 1034 1035 status_t MediaPlayerService::Client::setVolume(float leftVolume, float rightVolume) 1036 { 1037 LOGV("[%d] setVolume(%f, %f)", mConnId, leftVolume, rightVolume); 1038 // TODO: for hardware output, call player instead 1039 Mutex::Autolock l(mLock); 1040 if (mAudioOutput != 0) mAudioOutput->setVolume(leftVolume, rightVolume); 1041 return NO_ERROR; 1042 } 1043 1044 status_t MediaPlayerService::Client::setAuxEffectSendLevel(float level) 1045 { 1046 LOGV("[%d] setAuxEffectSendLevel(%f)", mConnId, level); 1047 Mutex::Autolock l(mLock); 1048 if (mAudioOutput != 0) return mAudioOutput->setAuxEffectSendLevel(level); 1049 return NO_ERROR; 1050 } 1051 1052 status_t MediaPlayerService::Client::attachAuxEffect(int effectId) 1053 { 1054 LOGV("[%d] attachAuxEffect(%d)", mConnId, effectId); 1055 Mutex::Autolock l(mLock); 1056 if (mAudioOutput != 0) return mAudioOutput->attachAuxEffect(effectId); 1057 return NO_ERROR; 1058 } 1059 1060 status_t MediaPlayerService::Client::setParameter(int key, const Parcel &request) { 1061 LOGV("[%d] setParameter(%d)", mConnId, key); 1062 sp<MediaPlayerBase> p = getPlayer(); 1063 if (p == 0) return UNKNOWN_ERROR; 1064 return p->setParameter(key, request); 1065 } 1066 1067 status_t MediaPlayerService::Client::getParameter(int key, Parcel *reply) { 1068 LOGV("[%d] getParameter(%d)", mConnId, key); 1069 sp<MediaPlayerBase> p = getPlayer(); 1070 if (p == 0) return UNKNOWN_ERROR; 1071 return p->getParameter(key, reply); 1072 } 1073 1074 void MediaPlayerService::Client::notify( 1075 void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 1076 { 1077 Client* client = static_cast<Client*>(cookie); 1078 1079 if (MEDIA_INFO == msg && 1080 MEDIA_INFO_METADATA_UPDATE == ext1) { 1081 const media::Metadata::Type metadata_type = ext2; 1082 1083 if(client->shouldDropMetadata(metadata_type)) { 1084 return; 1085 } 1086 1087 // Update the list of metadata that have changed. getMetadata 1088 // also access mMetadataUpdated and clears it. 1089 client->addNewMetadataUpdate(metadata_type); 1090 } 1091 LOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2); 1092 client->mClient->notify(msg, ext1, ext2, obj); 1093 } 1094 1095 1096 bool MediaPlayerService::Client::shouldDropMetadata(media::Metadata::Type code) const 1097 { 1098 Mutex::Autolock lock(mLock); 1099 1100 if (findMetadata(mMetadataDrop, code)) { 1101 return true; 1102 } 1103 1104 if (mMetadataAllow.isEmpty() || findMetadata(mMetadataAllow, code)) { 1105 return false; 1106 } else { 1107 return true; 1108 } 1109 } 1110 1111 1112 void MediaPlayerService::Client::addNewMetadataUpdate(media::Metadata::Type metadata_type) { 1113 Mutex::Autolock lock(mLock); 1114 if (mMetadataUpdated.indexOf(metadata_type) < 0) { 1115 mMetadataUpdated.add(metadata_type); 1116 } 1117 } 1118 1119 #if CALLBACK_ANTAGONIZER 1120 const int Antagonizer::interval = 10000; // 10 msecs 1121 1122 Antagonizer::Antagonizer(notify_callback_f cb, void* client) : 1123 mExit(false), mActive(false), mClient(client), mCb(cb) 1124 { 1125 createThread(callbackThread, this); 1126 } 1127 1128 void Antagonizer::kill() 1129 { 1130 Mutex::Autolock _l(mLock); 1131 mActive = false; 1132 mExit = true; 1133 mCondition.wait(mLock); 1134 } 1135 1136 int Antagonizer::callbackThread(void* user) 1137 { 1138 LOGD("Antagonizer started"); 1139 Antagonizer* p = reinterpret_cast<Antagonizer*>(user); 1140 while (!p->mExit) { 1141 if (p->mActive) { 1142 LOGV("send event"); 1143 p->mCb(p->mClient, 0, 0, 0); 1144 } 1145 usleep(interval); 1146 } 1147 Mutex::Autolock _l(p->mLock); 1148 p->mCondition.signal(); 1149 LOGD("Antagonizer stopped"); 1150 return 0; 1151 } 1152 #endif 1153 1154 static size_t kDefaultHeapSize = 1024 * 1024; // 1MB 1155 1156 sp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) 1157 { 1158 LOGV("decode(%s)", url); 1159 sp<MemoryBase> mem; 1160 sp<MediaPlayerBase> player; 1161 1162 // Protect our precious, precious DRMd ringtones by only allowing 1163 // decoding of http, but not filesystem paths or content Uris. 1164 // If the application wants to decode those, it should open a 1165 // filedescriptor for them and use that. 1166 if (url != NULL && strncmp(url, "http://", 7) != 0) { 1167 LOGD("Can't decode %s by path, use filedescriptor instead", url); 1168 return mem; 1169 } 1170 1171 player_type playerType = getPlayerType(url); 1172 LOGV("player type = %d", playerType); 1173 1174 // create the right type of player 1175 sp<AudioCache> cache = new AudioCache(url); 1176 player = android::createPlayer(playerType, cache.get(), cache->notify); 1177 if (player == NULL) goto Exit; 1178 if (player->hardwareOutput()) goto Exit; 1179 1180 static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 1181 1182 // set data source 1183 if (player->setDataSource(url) != NO_ERROR) goto Exit; 1184 1185 LOGV("prepare"); 1186 player->prepareAsync(); 1187 1188 LOGV("wait for prepare"); 1189 if (cache->wait() != NO_ERROR) goto Exit; 1190 1191 LOGV("start"); 1192 player->start(); 1193 1194 LOGV("wait for playback complete"); 1195 cache->wait(); 1196 // in case of error, return what was successfully decoded. 1197 if (cache->size() == 0) { 1198 goto Exit; 1199 } 1200 1201 mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 1202 *pSampleRate = cache->sampleRate(); 1203 *pNumChannels = cache->channelCount(); 1204 *pFormat = (int)cache->format(); 1205 LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 1206 1207 Exit: 1208 if (player != 0) player->reset(); 1209 return mem; 1210 } 1211 1212 sp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) 1213 { 1214 LOGV("decode(%d, %lld, %lld)", fd, offset, length); 1215 sp<MemoryBase> mem; 1216 sp<MediaPlayerBase> player; 1217 1218 player_type playerType = getPlayerType(fd, offset, length); 1219 LOGV("player type = %d", playerType); 1220 1221 // create the right type of player 1222 sp<AudioCache> cache = new AudioCache("decode_fd"); 1223 player = android::createPlayer(playerType, cache.get(), cache->notify); 1224 if (player == NULL) goto Exit; 1225 if (player->hardwareOutput()) goto Exit; 1226 1227 static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 1228 1229 // set data source 1230 if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; 1231 1232 LOGV("prepare"); 1233 player->prepareAsync(); 1234 1235 LOGV("wait for prepare"); 1236 if (cache->wait() != NO_ERROR) goto Exit; 1237 1238 LOGV("start"); 1239 player->start(); 1240 1241 LOGV("wait for playback complete"); 1242 cache->wait(); 1243 // in case of error, return what was successfully decoded. 1244 if (cache->size() == 0) { 1245 goto Exit; 1246 } 1247 1248 mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 1249 *pSampleRate = cache->sampleRate(); 1250 *pNumChannels = cache->channelCount(); 1251 *pFormat = cache->format(); 1252 LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 1253 1254 Exit: 1255 if (player != 0) player->reset(); 1256 ::close(fd); 1257 return mem; 1258 } 1259 1260 1261 #undef LOG_TAG 1262 #define LOG_TAG "AudioSink" 1263 MediaPlayerService::AudioOutput::AudioOutput(int sessionId) 1264 : mCallback(NULL), 1265 mCallbackCookie(NULL), 1266 mSessionId(sessionId) { 1267 LOGV("AudioOutput(%d)", sessionId); 1268 mTrack = 0; 1269 mStreamType = AUDIO_STREAM_MUSIC; 1270 mLeftVolume = 1.0; 1271 mRightVolume = 1.0; 1272 mLatency = 0; 1273 mMsecsPerFrame = 0; 1274 mAuxEffectId = 0; 1275 mSendLevel = 0.0; 1276 setMinBufferCount(); 1277 } 1278 1279 MediaPlayerService::AudioOutput::~AudioOutput() 1280 { 1281 close(); 1282 } 1283 1284 void MediaPlayerService::AudioOutput::setMinBufferCount() 1285 { 1286 char value[PROPERTY_VALUE_MAX]; 1287 if (property_get("ro.kernel.qemu", value, 0)) { 1288 mIsOnEmulator = true; 1289 mMinBufferCount = 12; // to prevent systematic buffer underrun for emulator 1290 } 1291 } 1292 1293 bool MediaPlayerService::AudioOutput::isOnEmulator() 1294 { 1295 setMinBufferCount(); 1296 return mIsOnEmulator; 1297 } 1298 1299 int MediaPlayerService::AudioOutput::getMinBufferCount() 1300 { 1301 setMinBufferCount(); 1302 return mMinBufferCount; 1303 } 1304 1305 ssize_t MediaPlayerService::AudioOutput::bufferSize() const 1306 { 1307 if (mTrack == 0) return NO_INIT; 1308 return mTrack->frameCount() * frameSize(); 1309 } 1310 1311 ssize_t MediaPlayerService::AudioOutput::frameCount() const 1312 { 1313 if (mTrack == 0) return NO_INIT; 1314 return mTrack->frameCount(); 1315 } 1316 1317 ssize_t MediaPlayerService::AudioOutput::channelCount() const 1318 { 1319 if (mTrack == 0) return NO_INIT; 1320 return mTrack->channelCount(); 1321 } 1322 1323 ssize_t MediaPlayerService::AudioOutput::frameSize() const 1324 { 1325 if (mTrack == 0) return NO_INIT; 1326 return mTrack->frameSize(); 1327 } 1328 1329 uint32_t MediaPlayerService::AudioOutput::latency () const 1330 { 1331 return mLatency; 1332 } 1333 1334 float MediaPlayerService::AudioOutput::msecsPerFrame() const 1335 { 1336 return mMsecsPerFrame; 1337 } 1338 1339 status_t MediaPlayerService::AudioOutput::getPosition(uint32_t *position) 1340 { 1341 if (mTrack == 0) return NO_INIT; 1342 return mTrack->getPosition(position); 1343 } 1344 1345 status_t MediaPlayerService::AudioOutput::open( 1346 uint32_t sampleRate, int channelCount, int format, int bufferCount, 1347 AudioCallback cb, void *cookie) 1348 { 1349 mCallback = cb; 1350 mCallbackCookie = cookie; 1351 1352 // Check argument "bufferCount" against the mininum buffer count 1353 if (bufferCount < mMinBufferCount) { 1354 LOGD("bufferCount (%d) is too small and increased to %d", bufferCount, mMinBufferCount); 1355 bufferCount = mMinBufferCount; 1356 1357 } 1358 LOGV("open(%u, %d, %d, %d, %d)", sampleRate, channelCount, format, bufferCount,mSessionId); 1359 if (mTrack) close(); 1360 int afSampleRate; 1361 int afFrameCount; 1362 int frameCount; 1363 1364 if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) { 1365 return NO_INIT; 1366 } 1367 if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != NO_ERROR) { 1368 return NO_INIT; 1369 } 1370 1371 frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 1372 1373 AudioTrack *t; 1374 if (mCallback != NULL) { 1375 t = new AudioTrack( 1376 mStreamType, 1377 sampleRate, 1378 format, 1379 (channelCount == 2) ? AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO, 1380 frameCount, 1381 0 /* flags */, 1382 CallbackWrapper, 1383 this, 1384 0, 1385 mSessionId); 1386 } else { 1387 t = new AudioTrack( 1388 mStreamType, 1389 sampleRate, 1390 format, 1391 (channelCount == 2) ? AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO, 1392 frameCount, 1393 0, 1394 NULL, 1395 NULL, 1396 0, 1397 mSessionId); 1398 } 1399 1400 if ((t == 0) || (t->initCheck() != NO_ERROR)) { 1401 LOGE("Unable to create audio track"); 1402 delete t; 1403 return NO_INIT; 1404 } 1405 1406 LOGV("setVolume"); 1407 t->setVolume(mLeftVolume, mRightVolume); 1408 1409 mMsecsPerFrame = 1.e3 / (float) sampleRate; 1410 mLatency = t->latency(); 1411 mTrack = t; 1412 1413 t->setAuxEffectSendLevel(mSendLevel); 1414 return t->attachAuxEffect(mAuxEffectId);; 1415 } 1416 1417 void MediaPlayerService::AudioOutput::start() 1418 { 1419 LOGV("start"); 1420 if (mTrack) { 1421 mTrack->setVolume(mLeftVolume, mRightVolume); 1422 mTrack->setAuxEffectSendLevel(mSendLevel); 1423 mTrack->start(); 1424 } 1425 } 1426 1427 1428 1429 ssize_t MediaPlayerService::AudioOutput::write(const void* buffer, size_t size) 1430 { 1431 LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback."); 1432 1433 //LOGV("write(%p, %u)", buffer, size); 1434 if (mTrack) { 1435 ssize_t ret = mTrack->write(buffer, size); 1436 return ret; 1437 } 1438 return NO_INIT; 1439 } 1440 1441 void MediaPlayerService::AudioOutput::stop() 1442 { 1443 LOGV("stop"); 1444 if (mTrack) mTrack->stop(); 1445 } 1446 1447 void MediaPlayerService::AudioOutput::flush() 1448 { 1449 LOGV("flush"); 1450 if (mTrack) mTrack->flush(); 1451 } 1452 1453 void MediaPlayerService::AudioOutput::pause() 1454 { 1455 LOGV("pause"); 1456 if (mTrack) mTrack->pause(); 1457 } 1458 1459 void MediaPlayerService::AudioOutput::close() 1460 { 1461 LOGV("close"); 1462 delete mTrack; 1463 mTrack = 0; 1464 } 1465 1466 void MediaPlayerService::AudioOutput::setVolume(float left, float right) 1467 { 1468 LOGV("setVolume(%f, %f)", left, right); 1469 mLeftVolume = left; 1470 mRightVolume = right; 1471 if (mTrack) { 1472 mTrack->setVolume(left, right); 1473 } 1474 } 1475 1476 status_t MediaPlayerService::AudioOutput::setAuxEffectSendLevel(float level) 1477 { 1478 LOGV("setAuxEffectSendLevel(%f)", level); 1479 mSendLevel = level; 1480 if (mTrack) { 1481 return mTrack->setAuxEffectSendLevel(level); 1482 } 1483 return NO_ERROR; 1484 } 1485 1486 status_t MediaPlayerService::AudioOutput::attachAuxEffect(int effectId) 1487 { 1488 LOGV("attachAuxEffect(%d)", effectId); 1489 mAuxEffectId = effectId; 1490 if (mTrack) { 1491 return mTrack->attachAuxEffect(effectId); 1492 } 1493 return NO_ERROR; 1494 } 1495 1496 // static 1497 void MediaPlayerService::AudioOutput::CallbackWrapper( 1498 int event, void *cookie, void *info) { 1499 //LOGV("callbackwrapper"); 1500 if (event != AudioTrack::EVENT_MORE_DATA) { 1501 return; 1502 } 1503 1504 AudioOutput *me = (AudioOutput *)cookie; 1505 AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 1506 1507 size_t actualSize = (*me->mCallback)( 1508 me, buffer->raw, buffer->size, me->mCallbackCookie); 1509 1510 if (actualSize == 0 && buffer->size > 0) { 1511 // We've reached EOS but the audio track is not stopped yet, 1512 // keep playing silence. 1513 1514 memset(buffer->raw, 0, buffer->size); 1515 actualSize = buffer->size; 1516 } 1517 1518 buffer->size = actualSize; 1519 } 1520 1521 int MediaPlayerService::AudioOutput::getSessionId() 1522 { 1523 return mSessionId; 1524 } 1525 1526 #undef LOG_TAG 1527 #define LOG_TAG "AudioCache" 1528 MediaPlayerService::AudioCache::AudioCache(const char* name) : 1529 mChannelCount(0), mFrameCount(1024), mSampleRate(0), mSize(0), 1530 mError(NO_ERROR), mCommandComplete(false) 1531 { 1532 // create ashmem heap 1533 mHeap = new MemoryHeapBase(kDefaultHeapSize, 0, name); 1534 } 1535 1536 uint32_t MediaPlayerService::AudioCache::latency () const 1537 { 1538 return 0; 1539 } 1540 1541 float MediaPlayerService::AudioCache::msecsPerFrame() const 1542 { 1543 return mMsecsPerFrame; 1544 } 1545 1546 status_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) 1547 { 1548 if (position == 0) return BAD_VALUE; 1549 *position = mSize; 1550 return NO_ERROR; 1551 } 1552 1553 //////////////////////////////////////////////////////////////////////////////// 1554 1555 struct CallbackThread : public Thread { 1556 CallbackThread(const wp<MediaPlayerBase::AudioSink> &sink, 1557 MediaPlayerBase::AudioSink::AudioCallback cb, 1558 void *cookie); 1559 1560 protected: 1561 virtual ~CallbackThread(); 1562 1563 virtual bool threadLoop(); 1564 1565 private: 1566 wp<MediaPlayerBase::AudioSink> mSink; 1567 MediaPlayerBase::AudioSink::AudioCallback mCallback; 1568 void *mCookie; 1569 void *mBuffer; 1570 size_t mBufferSize; 1571 1572 CallbackThread(const CallbackThread &); 1573 CallbackThread &operator=(const CallbackThread &); 1574 }; 1575 1576 CallbackThread::CallbackThread( 1577 const wp<MediaPlayerBase::AudioSink> &sink, 1578 MediaPlayerBase::AudioSink::AudioCallback cb, 1579 void *cookie) 1580 : mSink(sink), 1581 mCallback(cb), 1582 mCookie(cookie), 1583 mBuffer(NULL), 1584 mBufferSize(0) { 1585 } 1586 1587 CallbackThread::~CallbackThread() { 1588 if (mBuffer) { 1589 free(mBuffer); 1590 mBuffer = NULL; 1591 } 1592 } 1593 1594 bool CallbackThread::threadLoop() { 1595 sp<MediaPlayerBase::AudioSink> sink = mSink.promote(); 1596 if (sink == NULL) { 1597 return false; 1598 } 1599 1600 if (mBuffer == NULL) { 1601 mBufferSize = sink->bufferSize(); 1602 mBuffer = malloc(mBufferSize); 1603 } 1604 1605 size_t actualSize = 1606 (*mCallback)(sink.get(), mBuffer, mBufferSize, mCookie); 1607 1608 if (actualSize > 0) { 1609 sink->write(mBuffer, actualSize); 1610 } 1611 1612 return true; 1613 } 1614 1615 //////////////////////////////////////////////////////////////////////////////// 1616 1617 status_t MediaPlayerService::AudioCache::open( 1618 uint32_t sampleRate, int channelCount, int format, int bufferCount, 1619 AudioCallback cb, void *cookie) 1620 { 1621 LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); 1622 if (mHeap->getHeapID() < 0) { 1623 return NO_INIT; 1624 } 1625 1626 mSampleRate = sampleRate; 1627 mChannelCount = (uint16_t)channelCount; 1628 mFormat = (uint16_t)format; 1629 mMsecsPerFrame = 1.e3 / (float) sampleRate; 1630 1631 if (cb != NULL) { 1632 mCallbackThread = new CallbackThread(this, cb, cookie); 1633 } 1634 return NO_ERROR; 1635 } 1636 1637 void MediaPlayerService::AudioCache::start() { 1638 if (mCallbackThread != NULL) { 1639 mCallbackThread->run("AudioCache callback"); 1640 } 1641 } 1642 1643 void MediaPlayerService::AudioCache::stop() { 1644 if (mCallbackThread != NULL) { 1645 mCallbackThread->requestExitAndWait(); 1646 } 1647 } 1648 1649 ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) 1650 { 1651 LOGV("write(%p, %u)", buffer, size); 1652 if ((buffer == 0) || (size == 0)) return size; 1653 1654 uint8_t* p = static_cast<uint8_t*>(mHeap->getBase()); 1655 if (p == NULL) return NO_INIT; 1656 p += mSize; 1657 LOGV("memcpy(%p, %p, %u)", p, buffer, size); 1658 if (mSize + size > mHeap->getSize()) { 1659 LOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize()); 1660 size = mHeap->getSize() - mSize; 1661 } 1662 memcpy(p, buffer, size); 1663 mSize += size; 1664 return size; 1665 } 1666 1667 // call with lock held 1668 status_t MediaPlayerService::AudioCache::wait() 1669 { 1670 Mutex::Autolock lock(mLock); 1671 while (!mCommandComplete) { 1672 mSignal.wait(mLock); 1673 } 1674 mCommandComplete = false; 1675 1676 if (mError == NO_ERROR) { 1677 LOGV("wait - success"); 1678 } else { 1679 LOGV("wait - error"); 1680 } 1681 return mError; 1682 } 1683 1684 void MediaPlayerService::AudioCache::notify( 1685 void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 1686 { 1687 LOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); 1688 AudioCache* p = static_cast<AudioCache*>(cookie); 1689 1690 // ignore buffering messages 1691 switch (msg) 1692 { 1693 case MEDIA_ERROR: 1694 LOGE("Error %d, %d occurred", ext1, ext2); 1695 p->mError = ext1; 1696 break; 1697 case MEDIA_PREPARED: 1698 LOGV("prepared"); 1699 break; 1700 case MEDIA_PLAYBACK_COMPLETE: 1701 LOGV("playback complete"); 1702 break; 1703 default: 1704 LOGV("ignored"); 1705 return; 1706 } 1707 1708 // wake up thread 1709 Mutex::Autolock lock(p->mLock); 1710 p->mCommandComplete = true; 1711 p->mSignal.signal(); 1712 } 1713 1714 int MediaPlayerService::AudioCache::getSessionId() 1715 { 1716 return 0; 1717 } 1718 1719 void MediaPlayerService::addBatteryData(uint32_t params) 1720 { 1721 Mutex::Autolock lock(mLock); 1722 1723 int32_t time = systemTime() / 1000000L; 1724 1725 // change audio output devices. This notification comes from AudioFlinger 1726 if ((params & kBatteryDataSpeakerOn) 1727 || (params & kBatteryDataOtherAudioDeviceOn)) { 1728 1729 int deviceOn[NUM_AUDIO_DEVICES]; 1730 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 1731 deviceOn[i] = 0; 1732 } 1733 1734 if ((params & kBatteryDataSpeakerOn) 1735 && (params & kBatteryDataOtherAudioDeviceOn)) { 1736 deviceOn[SPEAKER_AND_OTHER] = 1; 1737 } else if (params & kBatteryDataSpeakerOn) { 1738 deviceOn[SPEAKER] = 1; 1739 } else { 1740 deviceOn[OTHER_AUDIO_DEVICE] = 1; 1741 } 1742 1743 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 1744 if (mBatteryAudio.deviceOn[i] != deviceOn[i]){ 1745 1746 if (mBatteryAudio.refCount > 0) { // if playing audio 1747 if (!deviceOn[i]) { 1748 mBatteryAudio.lastTime[i] += time; 1749 mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 1750 mBatteryAudio.lastTime[i] = 0; 1751 } else { 1752 mBatteryAudio.lastTime[i] = 0 - time; 1753 } 1754 } 1755 1756 mBatteryAudio.deviceOn[i] = deviceOn[i]; 1757 } 1758 } 1759 return; 1760 } 1761 1762 // an sudio stream is started 1763 if (params & kBatteryDataAudioFlingerStart) { 1764 // record the start time only if currently no other audio 1765 // is being played 1766 if (mBatteryAudio.refCount == 0) { 1767 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 1768 if (mBatteryAudio.deviceOn[i]) { 1769 mBatteryAudio.lastTime[i] -= time; 1770 } 1771 } 1772 } 1773 1774 mBatteryAudio.refCount ++; 1775 return; 1776 1777 } else if (params & kBatteryDataAudioFlingerStop) { 1778 if (mBatteryAudio.refCount <= 0) { 1779 LOGW("Battery track warning: refCount is <= 0"); 1780 return; 1781 } 1782 1783 // record the stop time only if currently this is the only 1784 // audio being played 1785 if (mBatteryAudio.refCount == 1) { 1786 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 1787 if (mBatteryAudio.deviceOn[i]) { 1788 mBatteryAudio.lastTime[i] += time; 1789 mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 1790 mBatteryAudio.lastTime[i] = 0; 1791 } 1792 } 1793 } 1794 1795 mBatteryAudio.refCount --; 1796 return; 1797 } 1798 1799 int uid = IPCThreadState::self()->getCallingUid(); 1800 if (uid == AID_MEDIA) { 1801 return; 1802 } 1803 int index = mBatteryData.indexOfKey(uid); 1804 1805 if (index < 0) { // create a new entry for this UID 1806 BatteryUsageInfo info; 1807 info.audioTotalTime = 0; 1808 info.videoTotalTime = 0; 1809 info.audioLastTime = 0; 1810 info.videoLastTime = 0; 1811 info.refCount = 0; 1812 1813 if (mBatteryData.add(uid, info) == NO_MEMORY) { 1814 LOGE("Battery track error: no memory for new app"); 1815 return; 1816 } 1817 } 1818 1819 BatteryUsageInfo &info = mBatteryData.editValueFor(uid); 1820 1821 if (params & kBatteryDataCodecStarted) { 1822 if (params & kBatteryDataTrackAudio) { 1823 info.audioLastTime -= time; 1824 info.refCount ++; 1825 } 1826 if (params & kBatteryDataTrackVideo) { 1827 info.videoLastTime -= time; 1828 info.refCount ++; 1829 } 1830 } else { 1831 if (info.refCount == 0) { 1832 LOGW("Battery track warning: refCount is already 0"); 1833 return; 1834 } else if (info.refCount < 0) { 1835 LOGE("Battery track error: refCount < 0"); 1836 mBatteryData.removeItem(uid); 1837 return; 1838 } 1839 1840 if (params & kBatteryDataTrackAudio) { 1841 info.audioLastTime += time; 1842 info.refCount --; 1843 } 1844 if (params & kBatteryDataTrackVideo) { 1845 info.videoLastTime += time; 1846 info.refCount --; 1847 } 1848 1849 // no stream is being played by this UID 1850 if (info.refCount == 0) { 1851 info.audioTotalTime += info.audioLastTime; 1852 info.audioLastTime = 0; 1853 info.videoTotalTime += info.videoLastTime; 1854 info.videoLastTime = 0; 1855 } 1856 } 1857 } 1858 1859 status_t MediaPlayerService::pullBatteryData(Parcel* reply) { 1860 Mutex::Autolock lock(mLock); 1861 1862 // audio output devices usage 1863 int32_t time = systemTime() / 1000000L; //in ms 1864 int32_t totalTime; 1865 1866 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 1867 totalTime = mBatteryAudio.totalTime[i]; 1868 1869 if (mBatteryAudio.deviceOn[i] 1870 && (mBatteryAudio.lastTime[i] != 0)) { 1871 int32_t tmpTime = mBatteryAudio.lastTime[i] + time; 1872 totalTime += tmpTime; 1873 } 1874 1875 reply->writeInt32(totalTime); 1876 // reset the total time 1877 mBatteryAudio.totalTime[i] = 0; 1878 } 1879 1880 // codec usage 1881 BatteryUsageInfo info; 1882 int size = mBatteryData.size(); 1883 1884 reply->writeInt32(size); 1885 int i = 0; 1886 1887 while (i < size) { 1888 info = mBatteryData.valueAt(i); 1889 1890 reply->writeInt32(mBatteryData.keyAt(i)); //UID 1891 reply->writeInt32(info.audioTotalTime); 1892 reply->writeInt32(info.videoTotalTime); 1893 1894 info.audioTotalTime = 0; 1895 info.videoTotalTime = 0; 1896 1897 // remove the UID entry where no stream is being played 1898 if (info.refCount <= 0) { 1899 mBatteryData.removeItemsAt(i); 1900 size --; 1901 i --; 1902 } 1903 i++; 1904 } 1905 return NO_ERROR; 1906 } 1907 } // namespace android 1908