Пример #1
0
 def __init__(self):
     self._started = False
     self._audio_source = None
     self._pa = Async('Kunquat Tracker', 'Editor output', self._pa_callback)
     self._buffer = queue.Queue()
     self._acks = queue.Queue()
     self._workspace = []
     self._pa.init()
Пример #2
0
class Pulseaudio():

    def __init__(self):
        self._started = False
        self._audio_source = None
        self._pa = Async('Kunquat Tracker', 'Editor output', self._pa_callback)
        self._buffer = queue.Queue()
        self._acks = queue.Queue()
        self._workspace = []
        self._pa.init()

    def set_audio_source(self, audio_source):
        self._audio_source = audio_source

    def put_audio(self, audio):
        assert self._started
        self._buffer.put(audio)
        self._acks.get()
        self._audio_source.acknowledge_audio()

    def _add_audio_to_workspace(self, audio):
        self._workspace = join_audio(self._workspace, audio)

    def _flush_queue(self):
        items = self._buffer.qsize()
        for _ in range(items):
            fresh_audio = self._buffer.get()
            self._acks.put('ack')
            self._add_audio_to_workspace(fresh_audio)

    def _update_workspace(self, nframes):
        self._flush_queue()
        missing = nframes - audio_len(self._workspace)
        while missing > 0:
            try:
                fresh_audio = self._buffer.get(True, 1.0)
                self._acks.put('ack')
            except queue.Empty:
                fresh_audio = [0.0] * (missing * 2)
            self._add_audio_to_workspace(fresh_audio)
            missing = nframes - audio_len(self._workspace)

    def _read_workspace(self, nframes):
        frames = audio_len(self._workspace)
        if frames > nframes:
            (audio_data, remainder) = split_audio_at(self._workspace, nframes)
        elif frames == nframes:
            audio_data = self._workspace
            remainder = []
        else:
            assert False
        self._workspace = remainder
        return audio_data

    def _pa_callback(self, nframes):
        self._update_workspace(nframes)
        audio_data = self._read_workspace(nframes)
        return audio_data

    def start(self):
        self._started = True
        self._pa.play()

    def stop(self):
        self._pa.stop()

    def close(self):
        self.stop()
        self._pa.deinit()

    @classmethod
    def get_id(cls):
        return 'pulseaudio'