Skip to content

Commit 9c80590

Browse files
committed
Destroy existing links while opening/closing AudioInput/AudioOutput
1 parent be0cee7 commit 9c80590

3 files changed

Lines changed: 25 additions & 30 deletions

File tree

src/soundio/pipewireenumerator.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,10 @@ std::string PipewireEnumerator::openDeviceInput(uint32_t deviceId,
590590
PortPair& ports = m_inputs.at(input);
591591
ports.activeDevice = deviceId;
592592

593+
if (ports.active.load()) {
594+
closePorts(ports);
595+
}
596+
593597
ChannelGroup channelGroup = input.getChannelGroup();
594598
unsigned char channelBase = channelGroup.getChannelBase();
595599
unsigned char channelCount = channelGroup.getChannelCount().value();
@@ -635,6 +639,10 @@ std::string PipewireEnumerator::openDeviceOutput(uint32_t deviceId,
635639
PortPair& ports = m_outputs.at(output);
636640
ports.activeDevice = deviceId;
637641

642+
if (ports.active.load()) {
643+
closePorts(ports);
644+
}
645+
638646
ChannelGroup channelGroup = output.getChannelGroup();
639647
unsigned char channelBase = channelGroup.getChannelBase();
640648
unsigned char channelCount = channelGroup.getChannelCount().value();
@@ -662,40 +670,34 @@ void PipewireEnumerator::closePorts(PortPair& ports) {
662670
const Port& left = m_ports.at(ports.left.id);
663671
const Port& right = m_ports.at(ports.right.id);
664672

673+
qDebug() << "PipewireEnumerator::closePorts" << left.links.size() << right.links.size();
674+
665675
for (uint32_t link : left.links) {
666676
destroyLink(link);
667-
qDebug() << "PipewireEnumerator::closePath left" << link;
677+
qDebug() << "PipewireEnumerator::closePorts" << link;
668678
}
669679

670680
for (uint32_t link : right.links) {
671681
destroyLink(link);
672-
qDebug() << "PipewireEnumerator::closePath right" << link;
682+
qDebug() << "PipewireEnumerator::closePorts" << link;
673683
}
674684
ports.activeDevice = 0;
675685
}
676686

677-
void PipewireEnumerator::closeDeviceInput(uint32_t deviceId, const AudioInput& input) {
678-
qDebug() << "PipewireEnumerator::closeDevice" << deviceId;
679-
VERIFY_OR_DEBUG_ASSERT(m_initialized) {
680-
qDebug() << "PipewireEnumerator::closePath called when "
681-
"uninitialized, this should not happen";
682-
return;
687+
void PipewireEnumerator::closeDevices() {
688+
for (auto& [path, ports] : m_inputs) {
689+
if (ports.active.load()) {
690+
qDebug() << "PipewireEnumerator::closeDevices" << path.getString();
691+
closePorts(ports);
692+
}
683693
}
684694

685-
PortPair& ports = m_inputs.at(input);
686-
closePorts(ports);
687-
}
688-
689-
void PipewireEnumerator::closeDeviceOutput(uint32_t deviceId, const AudioOutput& output) {
690-
qDebug() << "PipewireEnumerator::closeDevice" << deviceId;
691-
VERIFY_OR_DEBUG_ASSERT(m_initialized) {
692-
qDebug() << "PipewireEnumerator::closePath called when "
693-
"uninitialized, this should not happen";
694-
return;
695+
for (auto& [path, ports] : m_outputs) {
696+
if (ports.active.load()) {
697+
qDebug() << "PipewireEnumerator::closeDevices" << path.getString();
698+
closePorts(ports);
699+
}
695700
}
696-
697-
PortPair& ports = m_outputs.at(output);
698-
closePorts(ports);
699701
}
700702

701703
void PipewireEnumerator::callback(const spa_io_position* pos) {

src/soundio/pipewireenumerator.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ class PipewireEnumerator : public SoundDeviceEnumerator {
4343
const AudioOutput& output,
4444
mixxx::audio::SampleRate sampleRate,
4545
SINT framesPerBuffer);
46-
void closeDeviceInput(uint32_t id, const AudioInput& input);
47-
void closeDeviceOutput(uint32_t id, const AudioOutput& output);
46+
void closeDevices();
4847

4948
mixxx::audio::SampleRate getDefaultSampleRate() const {
5049
return m_defaultSampleRate;

src/soundio/sounddevicepipewire.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,7 @@ bool SoundDevicePipewire::isOpen() const {
6464
}
6565

6666
SoundDeviceStatus SoundDevicePipewire::close() {
67-
for (auto& input : m_audioInputs) {
68-
m_pEnumerator->closeDeviceInput(m_deviceId.deviceIndex, input);
69-
}
70-
71-
for (auto& output : m_audioOutputs) {
72-
m_pEnumerator->closeDeviceOutput(m_deviceId.deviceIndex, output);
73-
}
67+
m_pEnumerator->closeDevices();
7468
return SoundDeviceStatus::Ok;
7569
}
7670

0 commit comments

Comments
 (0)