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:
@@ -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
|
||||
Reference in New Issue
Block a user