def check_for_end(*args): qtime = int(ss.queue.get_property("current-level-time") / MS_TO_NS) if qtime <= 0: log.info("underrun (end of stream)") thread.start_new_thread(ss.stop, ()) gobject.timeout_add(500, gobject_mainloop.quit) return False return True
def __init__(self, sink_type=DEFAULT_SINK, options={}, codec=MP3, decoder_options={}): assert sink_type in SINKS, "invalid sink: %s" % sink_type decoder, parser = get_decoder_parser(codec) SoundPipeline.__init__(self, codec) self.sink_type = sink_type decoder_str = plugin_str(decoder, decoder_options) pipeline_els = [] pipeline_els.append("appsrc"+ " name=src"+ " max-bytes=32768"+ " emit-signals=0"+ " block=0"+ " is-live=0"+ " stream-type=stream"+ " format=4") pipeline_els.append(parser) pipeline_els.append(decoder_str) pipeline_els.append("audioconvert") pipeline_els.append("audioresample") queue_el = ["queue", "name=queue", "max-size-buffers=0", "max-size-bytes=0", "max-size-time=%s" % QUEUE_TIME, "leaky=%s" % QUEUE_LEAK] if QUEUE_SILENT: queue_el.append("silent=%s" % QUEUE_SILENT) pipeline_els.append(" ".join(queue_el)) pipeline_els.append(sink_type) self.setup_pipeline_and_bus(pipeline_els) self.src = self.pipeline.get_by_name("src") self.queue = self.pipeline.get_by_name("queue") self.overruns = 0 self.queue_state = "starting" if QUEUE_SILENT==0: self.queue.connect("overrun", self.queue_overrun) self.queue.connect("underrun", self.queue_underrun) self.queue.connect("running", self.queue_running) self.queue.connect("pushing", self.queue_pushing) if FAKE_OVERRUN>0: def fake_overrun(*args): self.emit("overrun", 500) gobject.timeout_add(FAKE_OVERRUN*1000, fake_overrun)
def main(): from xpra.platform import init, clean init("Sound-Record") try: import os.path if len(sys.argv) not in (2, 3): print("usage: %s filename [codec]" % sys.argv[0]) return 1 filename = sys.argv[1] if not os.path.exists(filename): print("file %s does not exist" % filename) return 2 if len(sys.argv) == 3: codec = sys.argv[2] if codec not in CODECS: print("invalid codec: %s" % codec) return 2 else: codec = None parts = filename.split(".") if len(parts) > 1: extension = parts[-1] if extension.lower() in CODECS: codec = extension.lower() print("guessed codec %s from file extension %s" % (codec, extension)) if codec is None: print("assuming this is an mp3 file...") codec = MP3 log.enable_debug() f = open(filename, "rb") data = f.read() f.close() print("loaded %s bytes from %s" % (len(data), filename)) #force no leak since we push all the data at once global QUEUE_LEAK, GST_QUEUE_NO_LEAK, QUEUE_SILENT QUEUE_LEAK = GST_QUEUE_NO_LEAK QUEUE_SILENT = 1 ss = SoundSink(codec=codec) ss.add_data(data) def eos(*args): print("eos") gobject.idle_add(gobject_mainloop.quit) ss.connect("eos", eos) ss.start() gobject_mainloop = gobject.MainLoop() gobject.threads_init() import signal def deadly_signal(*args): gobject.idle_add(gobject_mainloop.quit) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) def check_for_end(*args): qtime = int(ss.queue.get_property("current-level-time") / MS_TO_NS) if qtime <= 0: log.info("underrun (end of stream)") thread.start_new_thread(ss.stop, ()) gobject.timeout_add(500, gobject_mainloop.quit) return False return True gobject.timeout_add(1000, check_for_end) gobject_mainloop.run() return 0 finally: clean()
def main(): from xpra.platform import init, clean init("Sound-Record") try: args = sys.argv log.enable_debug() import os.path if len(args) not in (2, 3): print("usage: %s [-v|--verbose] filename [codec]" % sys.argv[0]) return 1 filename = args[1] if not os.path.exists(filename): print("file %s does not exist" % filename) return 2 if len(args) == 3: codec = args[2] if codec not in CODECS: print("invalid codec: %s" % codec) return 2 else: codec = None parts = filename.split(".") if len(parts) > 1: extension = parts[-1] if extension.lower() in CODECS: codec = extension.lower() print("guessed codec %s from file extension %s" % (codec, extension)) if codec is None: print("assuming this is an mp3 file...") codec = MP3 log.enable_debug() with open(filename, "rb") as f: data = f.read() print("loaded %s bytes from %s" % (len(data), filename)) # force no leak since we push all the data at once global QUEUE_LEAK, GST_QUEUE_NO_LEAK, QUEUE_SILENT QUEUE_LEAK = GST_QUEUE_NO_LEAK QUEUE_SILENT = 1 ss = SoundSink(codec=codec) ss.add_data(data) def eos(*args): print("eos") gobject.idle_add(gobject_mainloop.quit) ss.connect("eos", eos) ss.start() gobject_mainloop = gobject.MainLoop() gobject.threads_init() import signal def deadly_signal(*args): gobject.idle_add(gobject_mainloop.quit) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) def check_for_end(*args): qtime = int(ss.queue.get_property("current-level-time") / MS_TO_NS) if qtime <= 0: log.info("underrun (end of stream)") thread.start_new_thread(ss.stop, ()) gobject.timeout_add(500, gobject_mainloop.quit) return False return True gobject.timeout_add(1000, check_for_end) gobject_mainloop.run() return 0 finally: clean()