Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 35 additions & 20 deletions qubes/tests/integ/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,28 +285,12 @@ def _find_pactl_entry_for_vm(self, pactl_data, vm_name):
if s["properties"].get("application.name") == vm_name
][0]
except IndexError:
self.fail("source-output for VM {} not found".format(vm.name))
# self.fail never returns
assert False
return None

def _configure_audio_recording(self, vm):
def _configure_audio_recording(self, vm, expect_stream=True):
"""Connect VM's source-output to sink monitor instead of mic"""
audiovm = vm.audiovm

source_outputs = json.loads(
self._call_in_audiovm(
audiovm, ["pactl", "-f", "json", "list", "source-outputs"]
)
)

if not source_outputs:
self.fail("no source-output found in {}".format(audiovm.name))
assert False

output_info = self._find_pactl_entry_for_vm(source_outputs, vm.name)
output_index = output_info["index"]
current_source = output_info["source"]

sources = json.loads(
self._call_in_audiovm(
audiovm, ["pactl", "-f", "json", "list", "sources"]
Expand All @@ -326,11 +310,42 @@ def _configure_audio_recording(self, vm):
# self.fail never returns
assert False

assert isinstance(source_index, int)

source_outputs = json.loads(
self._call_in_audiovm(
audiovm, ["pactl", "-f", "json", "list", "source-outputs"]
)
)

output_info = self._find_pactl_entry_for_vm(source_outputs, vm.name)
if expect_stream and not output_info:
self.fail("source-output for VM {} not found".format(vm.name))
# self.fail never returns
assert False
elif not expect_stream and output_info:
self.fail(
"source-output for VM {} unexpecedly present".format(vm.name)
)
# self.fail never returns
assert False

if not expect_stream:
cmd = [
"pactl",
"set-default-source",
str(source_index),
]
self._call_in_audiovm(audiovm, cmd)
return

output_index = output_info["index"]
current_source = output_info["source"]

attempts_left = 5
# pactl seems to fail sometimes, still with exit code 0...
while current_source != source_index and attempts_left:
assert isinstance(output_index, int)
assert isinstance(source_index, int)
cmd = [
"pactl",
"move-source-output",
Expand Down Expand Up @@ -392,7 +407,7 @@ def detach_mic(self):

def common_audio_record_muted(self):
# connect VM's recording source output monitor (instead of mic)
self._configure_audio_recording(self.testvm1)
self._configure_audio_recording(self.testvm1, expect_stream=False)

# generate some "audio" data
audio_in = b"\x20" * 4 * 44100
Expand Down