feat: pause RI

Pause functionality in RI implemented. The audio_sender and video_sender stop sending when paused.

ref: N25B-350
This commit is contained in:
Storm
2025-12-22 13:36:18 +01:00
parent 1e77548622
commit 358c4f6872
7 changed files with 435 additions and 84 deletions

View File

@@ -77,21 +77,60 @@ class AudioSender(SocketBase):
chunk = audio_settings.chunk_size # 320 at 16000 Hz is 20ms, 512 is required for Silero-VAD
# Docs say this only raises an error if neither `input` nor `output` is True
stream = self.audio.open(
format=pyaudio.paFloat32,
channels=audio_settings.channels,
rate=audio_settings.sample_rate,
input=True,
input_device_index=self.microphone["index"],
frames_per_buffer=chunk,
)
def open_stream():
return self.audio.open(
format=pyaudio.paFloat32,
channels=audio_settings.channels,
rate=audio_settings.sample_rate,
input=True,
input_device_index=self.microphone["index"],
frames_per_buffer=chunk,
)
stream = None
try:
state.active_event.wait() # Wait until the system is not paused
# Test in case exit_event was set while waiting
if not state.exit_event.is_set():
stream = open_stream()
while not state.exit_event.is_set():
data = stream.read(chunk)
self.socket.send(data)
if not state.active_event.is_set(): # when paused
# Stop and close the stream if it is open to prevent buffer overflow
if stream:
try:
stream.stop_stream()
stream.close()
except IOError:
pass # Ignore errors on closing
stream = None
state.active_event.wait() # Wait until unpaused
# Check if exit_event was set while waiting
if state.exit_event.is_set():
break
stream = open_stream()
if stream:
try:
data = stream.read(chunk)
self.socket.send(data)
except IOError as e:
logger.warn("Audio read error occurred.", exc_info=e)
if stream:
stream.close()
stream = open_stream()
except IOError as e:
logger.error("Stopped listening: failed to get audio from microphone.", exc_info=e)
finally:
stream.stop_stream()
stream.close()
if stream:
try:
stream.stop_stream()
stream.close()
except IOError:
pass # Ignore errors on closing