changeset 2:c7d8ec7da73b 1.49-meillo

Add mplayer as a backend player Plus: exchange PCM and Master mixer.
author markus schnalke <meillo@marmaro.de>
date Thu, 27 Jul 2017 07:08:00 +0200
parents 7db0dc9d32d3
children 07e746bdb6bb
files cplay
diffstat 1 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/cplay	Wed Sep 27 09:25:24 2017 +0200
+++ b/cplay	Thu Jul 27 07:08:00 2017 +0200
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- python -*-
 
-__version__ = "cplay 1.49"
+__version__ = "cplay 1.49-meillo"
 
 """
 cplay - A curses front-end for various audio players
@@ -1206,6 +1206,7 @@
         self.stopped = 0
         self.paused = 0
         self.step = 0
+        self.setlength()
         self.update_status()
 
     def stop(self, quiet=0):
@@ -1277,6 +1278,9 @@
         else:
             app.set_default_status(_("Playing: %s") % self.entry.vp())
 
+    def setlength(self):
+        return
+
 # ------------------------------------------
 class FrameOffsetPlayer(Player):
     re_progress = re.compile("Time.*\s(\d+):(\d+).*\[(\d+):(\d+)")
@@ -1301,6 +1305,26 @@
             self.set_position(head, head+tail, [head, tail])
 
 # ------------------------------------------
+class TimeOffsetMplayer(Player):
+    re_progress = re.compile("A: *(\d+)")
+
+    def parse_buf(self):
+        match = self.re_progress.search(self.buf)
+        if match:
+            head = string.atoi(match.groups()[0])
+            tail = max(self.length, head) - head
+            self.set_position(head, head+tail, [head, tail])
+
+    def setlength(self):
+        while 1:
+            self.buf = os.read(self.stdout_r, 512)
+            re_length = re.compile("ID_LENGTH=(\d+)")
+            match = re_length.search(self.buf)
+            if match:
+                self.length = string.atoi(match.groups()[0])
+                break
+
+# ------------------------------------------
 class NoOffsetPlayer(Player):
 
     def parse_buf(self):
@@ -1508,15 +1532,15 @@
             mixer = ossaudiodev.openmixer()
             get, set = mixer.get, mixer.set
             self.channels = self.channels or \
-                [['MASTER', ossaudiodev.SOUND_MIXER_VOLUME],
-                 ['PCM', ossaudiodev.SOUND_MIXER_PCM]]
+                [['PCM', ossaudiodev.SOUND_MIXER_PCM],
+                 ['MASTER', ossaudiodev.SOUND_MIXER_VOLUME]]
         except ImportError:
             import oss
             mixer = oss.open_mixer()
             get, set = mixer.read_channel, mixer.write_channel
             self.channels = self.channels or \
-                [['MASTER', oss.SOUND_MIXER_VOLUME],
-                 ['PCM', oss.SOUND_MIXER_PCM]]
+                [['PCM', oss.SOUND_MIXER_PCM],
+                 ['MASTER', oss.SOUND_MIXER_VOLUME]]
         if cmd is "toggle": self.channels.insert(0, self.channels.pop())
         name, channel = self.channels[0]
         if cmd is "cue": arg = min(100, max(0, get(channel)[0] + arg))
@@ -1627,6 +1651,7 @@
 
 # ------------------------------------------
 PLAYERS = [
+    TimeOffsetMplayer("mplayer -vo null -identify -ss %d %s", "(^http://|\.(mp[1-4]|flv|mkv|m4a)$)"),
     FrameOffsetPlayer("ogg123 -q -v -k %d %s", "\.ogg$"),
     FrameOffsetPlayer("splay -f -k %d %s", "(^http://|\.mp[123]$)", 38.28),
     FrameOffsetPlayer("mpg123 -q -v -k %d %s", "(^http://|\.mp[123]$)", 38.28),