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