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