import vs import errors import gc from output import WriterOutput class PaOutput(WriterOutput): def __init__(self, stitcher, name, critical=False, preserved=False): super(PaOutput, self).__init__(stitcher, name, critical, preserved) self.writer_name = name # If you need to test the audio HDMI #self.pa_devices = ["HDA NVidia: HDMI 0 (hw:2,3)", "HDA NVidia: HDMI 1 (hw:2,7)", "HDA NVidia: HDMI 2 (hw:2,8)", "HDA NVidia: HDMI 3 (hw:2,9)"] # Line out self.pa_devices = ["HDA Intel PCH"] #override additional preset to avoid overwriting channel layout def setAdditionalPreset(self, additional_preset): if ("channel_layout" in additional_preset): del additional_preset["channel_layout"] super(PaOutput, self).setAdditionalPreset(additional_preset) def _start(self, preset=None, preserve=False): self._load_preset(preset) self._add_writer() def _stop(self): for pa_device in self.pa_devices: self._remove_writer(pa_device) self.t_writer_completed() def _remove_writer(self, writer_name): """Stops the stream """ if self.has_audio: success = self.stitcher.project_manager.controller.removeAudioOutput(writer_name) if not success: raise errors.InternalError("Cannot remove audio writer {}".format(writer_name)) self.shared_writer = None self.shared_video = None self.timer.reset() gc.collect() self.flush_writer_events() def _add_writer(self): for pa_device in self.pa_devices: self.ptv["name"] = pa_device self.config = self.ptv.to_config() writer = self._create_writer(self.stitcher.project_manager.panorama, self.stitcher.project_manager.controller, self.config, pa_device) self.shared_writer = vs.writerSharedPtr(writer.release()) self.connect_writer_events(self.shared_writer) self.shared_video = vs.videoWriterSharedPtr(self.shared_writer) shared_audio = vs.audioWriterSharedPtr(self.shared_writer) self.has_audio = True if self.shared_video is not None and not self.stitcher.stitch_output.addWriter(self.shared_video): raise errors.InternalError("Cannot add video writer to stitcher") if shared_audio is not None and not self.stitcher.project_manager.controller.addAudioOutput(shared_audio): raise errors.InternalError("Cannot add audio writer to stitcher") self.timer.start() gc.collect() def get_latency(self): return self._get_latency()