def main(): from xpra.platform import program_context with program_context("Xpra-Sound-Source"): import os.path if "-v" in sys.argv: log.enable_debug() sys.argv.remove("-v") if len(sys.argv) not in (2, 3): log.error("usage: %s filename [codec] [--encoder=rencode]", sys.argv[0]) return 1 filename = sys.argv[1] if filename=="-": from xpra.os_util import disable_stdout_buffering disable_stdout_buffering() elif os.path.exists(filename): log.error("file %s already exists", filename) return 1 codec = None codecs = get_codecs() if len(sys.argv)==3: codec = sys.argv[2] if codec not in codecs: log.error("invalid codec: %s, codecs supported: %s", codec, codecs) return 1 else: parts = filename.split(".") if len(parts)>1: extension = parts[-1] if extension.lower() in codecs: codec = extension.lower() log.info("guessed codec %s from file extension %s", codec, extension) if codec is None: codec = MP3 log.info("using default codec: %s", codec) #in case we're running against pulseaudio, #try to setup the env: try: from xpra.platform.paths import get_icon_filename f = get_icon_filename("xpra.png") from xpra.sound.pulseaudio.pulseaudio_util import add_audio_tagging_env add_audio_tagging_env(icon_path=f) except Exception as e: log.warn("failed to setup pulseaudio tagging: %s", e) from threading import Lock if filename=="-": f = sys.stdout else: f = open(filename, "wb") ss = SoundSource(codecs=[codec]) lock = Lock() def new_buffer(ss, data, metadata): log.info("new buffer: %s bytes (%s), metadata=%s", len(data), type(data), metadata) with lock: if f: f.write(data) f.flush() from xpra.gtk_common.gobject_compat import import_glib glib = import_glib() glib_mainloop = glib.MainLoop() ss.connect("new-buffer", new_buffer) ss.start() import signal def deadly_signal(sig, frame): log.warn("got deadly signal %s", SIGNAMES.get(sig, sig)) glib.idle_add(ss.stop) glib.idle_add(glib_mainloop.quit) def force_quit(sig, frame): sys.exit() signal.signal(signal.SIGINT, force_quit) signal.signal(signal.SIGTERM, force_quit) from xpra.gtk_common.gobject_compat import is_gtk3 if not is_gtk3(): signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) try: glib_mainloop.run() except Exception as e: log.error("main loop error: %s", e) ss.stop() f.flush() if f!=sys.stdout: log.info("wrote %s bytes to %s", f.tell(), filename) with lock: f.close() f = None return 0
def main(): from xpra.platform import program_context with program_context("Xpra-Sound-Source"): import os.path if "-v" in sys.argv: log.enable_debug() sys.argv.remove("-v") if len(sys.argv) not in (2, 3): log.error("usage: %s filename [codec] [--encoder=rencode]", sys.argv[0]) return 1 filename = sys.argv[1] if filename == "-": from xpra.os_util import disable_stdout_buffering disable_stdout_buffering() elif os.path.exists(filename): log.error("file %s already exists", filename) return 1 codec = None encoders = get_encoders() if len(sys.argv) == 3: codec = sys.argv[2] if codec not in encoders: log.error("invalid codec: %s, codecs supported: %s", codec, encoders) return 1 else: parts = filename.split(".") if len(parts) > 1: extension = parts[-1] if extension.lower() in encoders: codec = extension.lower() log.info("guessed codec %s from file extension %s", codec, extension) if codec is None: codec = MP3 log.info("using default codec: %s", codec) #in case we're running against pulseaudio, #try to setup the env: try: from xpra.platform.paths import get_icon_filename f = get_icon_filename("xpra.png") from xpra.sound.pulseaudio.pulseaudio_util import add_audio_tagging_env add_audio_tagging_env(icon_path=f) except Exception as e: log.warn("failed to setup pulseaudio tagging: %s", e) from threading import Lock if filename == "-": f = sys.stdout else: f = open(filename, "wb") ss = SoundSource(codecs=[codec]) lock = Lock() def new_buffer(ss, data, metadata, packet_metadata): log.info("new buffer: %s bytes (%s), metadata=%s", len(data), type(data), metadata) with lock: if f: for x in packet_metadata: f.write(x) f.write(data) f.flush() from xpra.gtk_common.gobject_compat import import_glib glib = import_glib() glib_mainloop = glib.MainLoop() ss.connect("new-buffer", new_buffer) ss.start() import signal def deadly_signal(sig, frame): log.warn("got deadly signal %s", SIGNAMES.get(sig, sig)) glib.idle_add(ss.stop) glib.idle_add(glib_mainloop.quit) def force_quit(sig, frame): sys.exit() signal.signal(signal.SIGINT, force_quit) signal.signal(signal.SIGTERM, force_quit) from xpra.gtk_common.gobject_compat import is_gtk3 if not is_gtk3(): signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) try: glib_mainloop.run() except Exception as e: log.error("main loop error: %s", e) ss.stop() f.flush() if f != sys.stdout: log.info("wrote %s bytes to %s", f.tell(), filename) with lock: f.close() f = None return 0