Author: remi
Date: 2009-04-10 11:10:28 +0200 (Fri, 10 Apr 2009)
New Revision: 4453

Modified:
   software_suite_v2/tuxware/tuxdroidserver/trunk/util/player/mplayer/Mplayer.py
Log:
* improved buffer underflow treatment

Modified: 
software_suite_v2/tuxware/tuxdroidserver/trunk/util/player/mplayer/Mplayer.py
===================================================================
--- 
software_suite_v2/tuxware/tuxdroidserver/trunk/util/player/mplayer/Mplayer.py   
    2009-04-10 09:06:53 UTC (rev 4452)
+++ 
software_suite_v2/tuxware/tuxdroidserver/trunk/util/player/mplayer/Mplayer.py   
    2009-04-10 09:10:28 UTC (rev 4453)
@@ -33,16 +33,20 @@
         self.__run = False
         self.__process = None
         self.__device = Device.getTuxDroidSoundDevice()
+        self.__media = None
+        self.__isAsync = False
 
     # 
--------------------------------------------------------------------------
     # Start mplayer.
     # 
--------------------------------------------------------------------------
-    def start(self, media, async = False):
+    def start(self, media, useAsync = False):
         """Start mplayer.
         @param media: Media to play.
-        @param async: Run async or not.
+        @param useAsync: Run async or not.
         """
-        if not async:
+        self.__media = media
+        self.__isAsync = useAsync
+        if not useAsync:
             self.__mainLoop(media)
         else:
             t = threading.Thread(target = self.__mainLoop, args = (media,))
@@ -70,6 +74,17 @@
         time.sleep(0.25)
 
     # 
--------------------------------------------------------------------------
+    # Restart mplayer.
+    # 
--------------------------------------------------------------------------
+    def restart(self):
+        """Restart mplayer.
+        """
+        self.stop()
+        if self.__media == None:
+            return
+        self.start(self.__media, self.__isAsync)
+
+    # 
--------------------------------------------------------------------------
     # Get the pid of mplayer.
     # 
--------------------------------------------------------------------------
     def getPid(self):
@@ -141,9 +156,41 @@
             stdin = subprocess.PIPE,
             stdout = subprocess.PIPE,
             stderr = subprocess.PIPE)
+        incompleteLine = ""
         while self.__getRun():
-            if len(self.__process.stdout.read()) == 0:
+            try:
+                buffer = self.__process.stdout.read(100)
+            except:
+                buffer = ""
+            if len(buffer) == 0:
+                # No data from mplayer indicates that the program is closed.
+                # Then stop the module.
                 self.stop()
+            else:
+                buffer = buffer.replace("\r", "\n")
+                buffer = incompleteLine + buffer
+                bufferLines = buffer.split("\n")
+                if len(bufferLines) == 1:
+                    incompleteLine = bufferLines[0]
+                else:
+                    incompleteLine = bufferLines[-1]
+                    for line in bufferLines[:-1]:
+                        line = line[:-1]
+                        if len(line) == 0:
+                            continue
+                        if line[0] == "A":
+                            matchedIdx = line.rfind("%")
+                            if matchedIdx != -1:
+                                bs = line[matchedIdx - 2 : matchedIdx]
+                                try:
+                                    audioBufferState = int(bs)
+                                except:
+                                    continue
+                                if audioBufferState < 5:
+                                    # Audio buffer is underflow.
+                                    # Then restart the module.
+                                    #print "BUFFER UNDERFLOW"
+                                    self.restart()
 
     # 
--------------------------------------------------------------------------
     # Send a command to mplayer.


------------------------------------------------------------------------------
This SF.net email is sponsored by:
High Quality Requirements in a Collaborative Environment.
Download a free trial of Rational Requirements Composer Now!
http://p.sf.net/sfu/www-ibm-com
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn

Reply via email to