2 from mutagen
.mp3
import MP3
9 raise ImportError('You need gstreamer version >=0.10 and its python bindings')
13 raise ImportError('You need gobject')
15 from player
import Player
, isblank
18 class GstPlayer(Player
):
19 """Implements Player with the python gstreamer bindings."""
22 super(GstPlayer
, self
).__init
__()
24 self
.player
= gst
.element_factory_make('playbin', 'player')
29 if self
.player
and self
.player
.get_state()[1] is gst
.STATE_PLAYING
:
36 if self
.player
and self
.player
.get_state()[1] is not gst
.STATE_PAUSED
:
44 return self
.player
.query_position(gst
.Format(gst
.FORMAT_TIME
), None)[0]
51 # we do everything in nanoseconds like gstreamer does
52 return self
.audio
.info
.length
* 1000000000
57 if isblank(self
.status
.filepath
):
60 if isblank(self
.player
.get_property('uri')):
63 if not gst
.uri_is_valid(self
.player
.get_property('uri')):
67 if self
.player
.set_state(gst
.STATE_PLAYING
) is gst
.STATE_CHANGE_FAILURE
:
69 self
.timer
= self
.new_timer()
73 if self
.player
.set_state(gst
.STATE_PAUSED
) is gst
.STATE_CHANGE_FAILURE
:
75 gobject
.source_remove(self
.timer
)
78 def stop(self
, widget
=None):
79 self
.player
.seek_simple(gst
.Format(gst
.FORMAT_TIME
), gst
.SEEK_FLAG_FLUSH
, self
.status
.begin
)
81 if self
.player
.set_state(gst
.STATE_NULL
) is gst
.STATE_CHANGE_FAILURE
:
85 gobject
.source_remove(self
.timer
)
94 if os
.path
.exists(self
.status
.filepath
):
95 self
.player
.set_property('uri', 'file://' + self
.status
.filepath
)
96 self
.player
.set_state(gst
.STATE_READY
)
98 self
.audio
= MP3(self
.status
.filepath
)
99 self
.status
.end
= self
.duration
104 def check_status(self
):
106 gobject
.source_remove(self
.timer
)
108 wasplaying
= self
.isplaying
110 self
.seek_if_needed()
113 self
.timer
= self
.new_timer()
115 def seek_if_needed(self
):
116 if not self
.status
.begin
<= self
.position
< self
.status
.end
:
117 self
.player
.seek_simple(gst
.Format(gst
.FORMAT_TIME
),
118 gst
.SEEK_FLAG_FLUSH
, long(self
.status
.begin
))
121 return gobject
.timeout_add(int(min(self
.status
.end
- self
.position
, 1000000000) / 1000000), self
.check_status
)