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."
This commit is contained in:
Robin Gareus
2022-11-29 06:39:20 +01:00
parent 842f4517de
commit 3f4feb6cc8

View File

@@ -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 {