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