feat: send audio
AudioSender runs in a separate thread to send audio from the microphone. ref: N25B-119
This commit is contained in:
0
test/common/__init__.py
Normal file
0
test/common/__init__.py
Normal file
@@ -2,8 +2,6 @@ import random
|
||||
import sys
|
||||
from StringIO import StringIO
|
||||
|
||||
import mock
|
||||
|
||||
from robot_interface.utils.microphone import choose_mic_default, choose_mic_interactive, get_microphones
|
||||
|
||||
|
||||
|
||||
0
test/integration/__init__.py
Normal file
0
test/integration/__init__.py
Normal file
77
test/unit/test_audio_sender.py
Normal file
77
test/unit/test_audio_sender.py
Normal file
@@ -0,0 +1,77 @@
|
||||
# coding=utf-8
|
||||
import os
|
||||
import time
|
||||
|
||||
import mock
|
||||
import pytest
|
||||
import zmq
|
||||
|
||||
from robot_interface.endpoints.audio_sender import AudioSender
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def zmq_context():
|
||||
context = zmq.Context()
|
||||
yield context
|
||||
|
||||
|
||||
def test_no_microphone(zmq_context, mocker):
|
||||
mock_info_logger = mocker.patch("robot_interface.endpoints.audio_sender.logger.info")
|
||||
mock_choose_mic = mocker.patch("robot_interface.endpoints.audio_sender.choose_mic_default")
|
||||
mock_choose_mic.return_value = None
|
||||
|
||||
sender = AudioSender(zmq_context)
|
||||
assert sender.microphone is None
|
||||
|
||||
sender.start()
|
||||
assert sender.thread is None
|
||||
mock_info_logger.assert_called()
|
||||
|
||||
sender.wait_until_done() # Should return early because we didn't start a thread
|
||||
|
||||
|
||||
def test_unicode_mic_name(zmq_context, mocker):
|
||||
mocker.patch("robot_interface.endpoints.audio_sender.threading")
|
||||
mock_choose_mic = mocker.patch("robot_interface.endpoints.audio_sender.choose_mic_default")
|
||||
mock_choose_mic.return_value = {"name": u"• Some Unicode name"}
|
||||
|
||||
sender = AudioSender(zmq_context)
|
||||
assert sender.microphone is not None
|
||||
|
||||
# `.start()` logs the name of the microphone. It should not give an error if it contains Unicode
|
||||
# symbols.
|
||||
sender.start()
|
||||
assert sender.thread is not None
|
||||
|
||||
sender.wait_until_done() # Should return instantly because we didn't start a real thread
|
||||
|
||||
|
||||
def _fake_read(num_frames):
|
||||
return os.urandom(num_frames * 4)
|
||||
|
||||
|
||||
def test_sending_audio(mocker):
|
||||
mock_choose_mic = mocker.patch("robot_interface.endpoints.audio_sender.choose_mic_default")
|
||||
mock_choose_mic.return_value = {"name": u"Some mic", "index": 0L}
|
||||
|
||||
mock_state = mocker.patch("robot_interface.endpoints.audio_sender.state")
|
||||
mock_state.exit_event.is_set.return_value = False
|
||||
|
||||
mock_audio = mocker.patch("robot_interface.endpoints.audio_sender.pyaudio")
|
||||
mock_audio.PyAudio = mock.Mock()
|
||||
stream = mock.Mock()
|
||||
stream.read = _fake_read
|
||||
mock_audio.PyAudio.open.return_value = stream
|
||||
|
||||
mock_zmq_context = mock.Mock()
|
||||
send_socket = mock.Mock()
|
||||
|
||||
sender = AudioSender(mock_zmq_context)
|
||||
sender.socket.send = send_socket
|
||||
|
||||
sender.start()
|
||||
time.sleep(0.01)
|
||||
mock_state.exit_event.is_set.return_value = True
|
||||
sender.wait_until_done()
|
||||
|
||||
send_socket.assert_called()
|
||||
Reference in New Issue
Block a user