def queue(self, media): """ Queues the next media to be played """ # Check current state self.readyEvent.wait() got_to_start_playing = False with self.idleCond: if self.stopped: raise Stopped if not self.next_media is None: raise RuntimeError, \ "Another media has been queued already" if self.playing_media is None: got_to_start_playing = True self.next_media = media # Get mediafile and set up file descriptor self.l.debug('queueing %s' % media) try: mf = media.mediaFile except KeyError: self.l.error("%s's mediafile doesn't exist" % media) return stream = mf.open() wrapper = None if hasattr(stream, 'fileno'): uri = 'fd://%s' % stream.fileno() else: wrapper = SocketPairWrappedFile(stream) self.threadPool.execute_named( wrapper.run, '%s wrapper.run %s' % (self.l.name, wrapper.fileno())) uri = 'fd://%s' % wrapper.fileno() self.next_wrapper = wrapper self.next_stream = stream # Queue in the playbin self.bin.set_property('uri', uri) # Inject TRACK_GAIN and TRACK_PEAK tags tl = gst.TagList() tl[gst.TAG_TRACK_GAIN] = media.trackGain tl[gst.TAG_TRACK_PEAK] = media.trackPeak self.rg_event = gst.event_new_tag(tl) # Start playing -- if not already if got_to_start_playing or self.in_a_skip: self.bin.set_state(gst.STATE_PLAYING) self.idle = False
def get_info(self, stream): wrapper = None if hasattr(stream, 'fileno'): uri = 'fd://%s' % stream.fileno() else: wrapper = SocketPairWrappedFile(stream) uri = 'fd://%s' % wrapper.fileno() self.threadPool.execute_named( wrapper.run, '%s wrapper.run %s' % (self.l.name, wrapper.fileno())) j = GstMediaInfo.Job(self, uri) with self.lock: self.jobs.add(j) j.event.wait() with self.lock: self.jobs.remove(j) if not wrapper is None: wrapper.close() if j.inError: raise ValueError return j.result