From 3f4feb6cc8be4459cd60c1455371e50023686c75 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 29 Nov 2022 06:39:20 +0100 Subject: [PATCH] ALSA: fix autostart when using different I/O devices ALSA backend modified the internal state when different devices were used, re-assigning one (usually input-device) to "None" when it's resampled. This lead to EngineHints not matching the EngineState, and autostart was disabled, and a dialog "Engine I/O device has changed since you last opened this session." --- libs/backends/alsa/alsa_audiobackend.cc | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index cbc5739697..5fbfd9204c 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -859,6 +859,8 @@ AlsaAudioBackend::_start (bool for_latency_measurement) AudioSlave::DuplexMode slave_duplex = AudioSlave::FullDuplex; if (_input_audio_device != _output_audio_device) { + std::string input_audio_device (_input_audio_device); + std::string output_audio_device (_output_audio_device); if (_input_audio_device != get_standard_device_name (DeviceNone) && _output_audio_device != get_standard_device_name (DeviceNone)) { /* Different devices for In + Out. * Ideally use input as clock source, and resample output. @@ -867,22 +869,22 @@ AlsaAudioBackend::_start (bool for_latency_measurement) * retains master-out connection. */ if (getenv ("ARDOUR_ALSA_CLK")) { - slave_device = _output_audio_device; - _output_audio_device = get_standard_device_name (DeviceNone); - slave_duplex = AudioSlave::HalfDuplexOut; + slave_device = _output_audio_device; + output_audio_device = get_standard_device_name (DeviceNone); //XXX + slave_duplex = AudioSlave::HalfDuplexOut; } else { - slave_device = _input_audio_device; - _input_audio_device = get_standard_device_name (DeviceNone); - slave_duplex = AudioSlave::HalfDuplexIn; + slave_device = _input_audio_device; + input_audio_device = get_standard_device_name (DeviceNone); //XXX + slave_duplex = AudioSlave::HalfDuplexIn; } } - if (_input_audio_device != get_standard_device_name (DeviceNone)) { + if (input_audio_device != get_standard_device_name (DeviceNone)) { get_alsa_audio_device_names (devices, HalfDuplexIn); - audio_device = _input_audio_device; + audio_device = input_audio_device; duplex = 1; } else { get_alsa_audio_device_names (devices, HalfDuplexOut); - audio_device = _output_audio_device; + audio_device = output_audio_device; duplex = 2; } } else {