From 112c894c3b2092a44d61dee94ac87098e6443502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20=C5=81ukawski?= Date: Tue, 16 Jan 2024 23:09:22 +0100 Subject: [PATCH] Correctly chain extra raw bytes using a buffer --- programs/speechSynthesis/speechSynthesis.py | 32 +++++++++------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/programs/speechSynthesis/speechSynthesis.py b/programs/speechSynthesis/speechSynthesis.py index 0f5ed44..dce1788 100644 --- a/programs/speechSynthesis/speechSynthesis.py +++ b/programs/speechSynthesis/speechSynthesis.py @@ -161,18 +161,18 @@ def int_or_str(text): class CallbackPlayer: def __init__(self): self._generator = None - self._queued_generator = None self._is_paused = False + self._buffer = bytearray() def set_generator(self, generator): self._generator = generator - self._queued_generator = None self._is_paused = False + self._buffer.clear() def clear_generator(self): self._generator = None - self._queued_generator = None self._is_paused = False + self._buffer.clear() def pause(self): self._is_paused = True @@ -188,25 +188,21 @@ def callback(self, outdata, frames, time, status): if self.is_playing(): try: - raw = next(self._generator) - - if len(outdata) > len(raw): - outdata[:len(raw)] = raw - outdata[len(raw):] = b'\x00' * (len(outdata) - len(raw)) - elif len(outdata) < len(raw): - outdata[:] = raw[:len(outdata)] - self._queued_generator = self._generator - self._generator = iter([raw[len(outdata):]]) + if len(self._buffer) == 0: + self._buffer = bytearray(next(self._generator)) + + if len(outdata) >= len(self._buffer): + outdata[:len(self._buffer)] = self._buffer + outdata[len(self._buffer):] = b'\x00' * (len(outdata) - len(self._buffer)) + self._buffer.clear() else: - outdata[:] = raw + # print('len(outdata) < len(raw)') + outdata[:] = self._buffer[:len(outdata)] + self._buffer = self._buffer[len(outdata):] return except StopIteration: - if self._queued_generator is not None: - self._generator = self._queued_generator - self._queued_generator = None - else: - self.clear_generator() + self.clear_generator() outdata[:] = b'\x00' * len(outdata)