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