BROWSE_MODE = 1
SELECT_MODE = 2
PAUSE_MODE = 3
+ WAIT_MODE = 4
# script origins
FROM_SSTP_CLIENT = 1
FROM_GHOST = 2
self.audio_player = Gst.ElementFactory.make('playbin', 'player')
fakesink = Gst.ElementFactory.make('fakesink', 'fakesink')
self.audio_player.set_property('video-sink', fakesink)
+ bus = self.audio_player.get_bus()
+ bus.add_signal_watch()
+ bus.connect('message', self.on_audio_message)
else:
self.audio_player = None
+ self.audio_loop = False
def set_responsible(self, request_method):
self.request_parent = request_method
def leave_temp_mode(self):
self.__temp_mode = 0
+ def on_audio_message(self, bus, message):
+ if message is None: # XXX: workaround for Gst Version < 0.11
+ if self.script_mode == self.WAIT_MODE:
+ self.script_mode = self.BROWSE_MODE
+ return
+ t = message.type
+ if t == Gst.MessageType.EOS:
+ self.audio_player.set_state(Gst.State.NULL)
+ if self.script_mode == self.WAIT_MODE:
+ assert not self.audio_loop
+ self.script_mode = self.BROWSE_MODE
+ if self.audio_loop:
+ self.audio_player.set_state(Gst.State.PLAYING)
+ elif t == Gst.MessageType.ERROR:
+ self.audio_player.set_state(Gst.State.NULL)
+ err, debug = message.parse_error()
+ logging.error('Error: {0}, {1}'.format(err, debug))
+ self.audio_loop = False
+
def set_surface(self, desc, alias, surface, name, surface_dir, tooltips):
self.surface.new(desc, alias, surface, name, surface_dir, tooltips)
for side in range(2, self.char):
self.balloon.finalize()
if self.audio_player is not None:
self.audio_player.set_state(Gst.State.NULL)
+ self.audio_loop = False
def process_script(self):
now = time.time()
##if idle > self.PAUSE_TIMEOUT:
## self.script_mode = self.BROWSE_MODE
pass
+ elif self.script_mode == self.WAIT_MODE:
+ pass
elif self.processed_script or self.processed_text:
self.interpret_script()
elif self.script_post_proc:
self.audio_player.set_state(Gst.State.NULL)
self.audio_player.set_property(
'uri', 'file://' + urllib.parse.quote(path))
+ self.audio_loop = False
self.audio_player.set_state(Gst.State.PLAYING)
def __yen_8(self, args):
self.audio_player.set_state(Gst.State.NULL)
self.audio_player.set_property(
'uri', 'file://' + urllib.parse.quote(path))
+ self.audio_loop = False
self.audio_player.set_state(Gst.State.PLAYING)
+ def __yen__V(self, args):
+ if self.audio_loop:
+ return # nothing to do
+ if self.audio_player.get_state(timeout=Gst.SECOND)[1] == Gst.State.PLAYING:
+ self.script_mode = self.WAIT_MODE
+
def __yen_exclamation(self, args): ## FIXME
if not args:
return
gsettings.set_string('picture-options', opt)
else:
pass # not implemented yet
+ elif args[0] == 'sound':
+ command = args[1]
+ if self.audio_player is None:
+ return
+ if command == 'stop':
+ self.audio_player.set_state(Gst.State.NULL)
+ self.audio_loop = False
+ elif command == 'play':
+ filename = args[2]
+ filename = get_normalized_path(filename)
+ path = os.path.join(self.get_prefix(),
+ b'ghost/master', filename)
+ if os.path.isfile(path):
+ self.audio_player.set_state(Gst.State.NULL)
+ self.audio_player.set_property(
+ 'uri', 'file://' + urllib.parse.quote(path))
+ self.audio_loop = False
+ self.audio_player.set_state(Gst.State.PLAYING)
+ elif command == 'cdplay':
+ self.audio_player.set_state(Gst.State.NULL)
+ try:
+ track = int(args[2])
+ except:
+ return
+ self.audio_player.set_property(
+ 'uri', 'cdda://{}'.format(track))
+ self.audio_loop = False
+ self.audio_player.set_state(Gst.State.PLAYING)
+ elif command == 'loop':
+ filename = args[2]
+ filename = get_normalized_path(filename)
+ path = os.path.join(self.get_prefix(),
+ b'ghost/master', filename)
+ if os.path.isfile(path):
+ self.audio_player.set_state(Gst.State.NULL)
+ self.audio_player.set_property(
+ 'uri', 'file://' + urllib.parse.quote(path))
+ self.audio_loop = True
+ self.audio_player.set_state(Gst.State.PLAYING)
+ elif command == 'wait':
+ if self.audio_loop:
+ return # nothing to do
+ if self.audio_player.get_state(timeout=Gst.SECOND)[1] == Gst.State.PLAYING:
+ self.script_mode = self.WAIT_MODE
+ elif command == 'pause':
+ if self.audio_player.get_state(timeout=Gst.SECOND)[1] == Gst.State.PLAYING:
+ self.audio_player.set_state(Gst.State.PAUSED)
+ elif command == 'resume':
+ if self.audio_player.get_state(timeout=Gst.SECOND)[1] == Gst.State.PAUSED:
+ self.audio_player.set_state(Gst.State.PLAYING)
+ else:
+ pass ## FIXME
elif args[0] == '*':
self.balloon.append_sstp_marker(self.script_side)
else:
r'\_u': __yen__u,
r'\_v': __yen__v,
r'\8': __yen_8,
+ r'\_V': __yen__V,
r'\!': __yen_exclamation,
r'\__c': __yen___c,
r'\__t': __yen___t,