OSDN Git Service

mediaplayer: add looping support to NuPlayer
authorLajos Molnar <lajos@google.com>
Thu, 31 Jul 2014 19:07:58 +0000 (12:07 -0700)
committerLajos Molnar <lajos@google.com>
Thu, 31 Jul 2014 19:35:25 +0000 (12:35 -0700)
Bug: 16641557
Change-Id: I433158e6e585b4714cfd6d89562ecd0587a07ae2

media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
media/libmediaplayerservice/nuplayer/NuPlayerDriver.h

index 280b5af..4748546 100644 (file)
@@ -42,6 +42,7 @@ NuPlayerDriver::NuPlayerDriver()
       mLooper(new ALooper),
       mPlayerFlags(0),
       mAtEOS(false),
+      mLooping(false),
       mStartupSeekTimeUs(-1) {
     mLooper->setName("NuPlayerDriver Looper");
 
@@ -76,6 +77,7 @@ status_t NuPlayerDriver::setDataSource(
         const KeyedVector<String8, String8> *headers) {
     Mutex::Autolock autoLock(mLock);
 
+    ALOGV("setDataSource: url=%s", url);
     if (mState != STATE_IDLE) {
         return INVALID_OPERATION;
     }
@@ -94,6 +96,7 @@ status_t NuPlayerDriver::setDataSource(
 status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
     Mutex::Autolock autoLock(mLock);
 
+    ALOGV("setDataSource: fd=%d", fd);
     if (mState != STATE_IDLE) {
         return INVALID_OPERATION;
     }
@@ -112,6 +115,7 @@ status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
 status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
     Mutex::Autolock autoLock(mLock);
 
+    ALOGV("setDataSource: stream source");
     if (mState != STATE_IDLE) {
         return INVALID_OPERATION;
     }
@@ -367,12 +371,14 @@ status_t NuPlayerDriver::reset() {
     mDurationUs = -1;
     mPositionUs = -1;
     mStartupSeekTimeUs = -1;
+    mLooping = false;
 
     return OK;
 }
 
-status_t NuPlayerDriver::setLooping(int /* loop */) {
-    return INVALID_OPERATION;
+status_t NuPlayerDriver::setLooping(int loop) {
+    mLooping = loop != 0;
+    return OK;
 }
 
 player_type NuPlayerDriver::playerType() {
@@ -523,8 +529,24 @@ status_t NuPlayerDriver::dump(
 
 void NuPlayerDriver::notifyListener(
         int msg, int ext1, int ext2, const Parcel *in) {
-    if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) {
-        mAtEOS = true;
+    switch (msg) {
+        case MEDIA_PLAYBACK_COMPLETE:
+        {
+            if (mLooping) {
+                mPlayer->seekToAsync(0);
+                break;
+            }
+            // fall through
+        }
+
+        case MEDIA_ERROR:
+        {
+            mAtEOS = true;
+            break;
+        }
+
+        default:
+            break;
     }
 
     sendEvent(msg, ext1, ext2, in);
index 0148fb1..9424aae 100644 (file)
@@ -111,6 +111,7 @@ private:
     uint32_t mPlayerFlags;
 
     bool mAtEOS;
+    bool mLooping;
 
     int64_t mStartupSeekTimeUs;