Skip to content

Commit 276f171

Browse files
committed
Check for hidden input/output before creating PipeWire ports
1 parent 0323184 commit 276f171

2 files changed

Lines changed: 46 additions & 45 deletions

File tree

src/soundio/pipewireenumerator.cpp

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,12 @@ void PipewireEnumerator::initialize() {
158158

159159
pw_filter_add_listener(m_pPwFilter, &m_pwFilterListener, &filter_events, this);
160160

161-
const auto registeredOutputs = m_pSoundManager->registeredOutputs();
162-
for (const auto& output : registeredOutputs) {
163-
createOutputPorts(output);
161+
for (auto it = m_inputs.begin(); it != m_inputs.end(); ++it) {
162+
it.value() = createInputPorts(it.key());
164163
}
165164

166-
const auto registeredInputs = m_pSoundManager->registeredInputs();
167-
for (const auto& input : registeredInputs) {
168-
createInputPorts(input);
165+
for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) {
166+
it.value() = createOutputPorts(it.key());
169167
}
170168

171169
int res = pw_filter_connect(m_pPwFilter,
@@ -658,76 +656,79 @@ std::string PipewireEnumerator::createLink(uint32_t outNodeId,
658656
}
659657

660658
void PipewireEnumerator::registerInput(const AudioInput& input, AudioDestination*) {
661-
if (m_inputs.contains(input)) {
659+
if (m_inputs.contains(input) or input.isHidden()) {
662660
// duplicate VinylControl signal
663661
return;
664662
}
665663

666664
if (m_initialized) {
667665
pw_thread_loop_lock(m_pPwThreadLoop);
668-
createInputPorts(input);
666+
m_inputs.insert(input, createInputPorts(input));
669667
pw_thread_loop_unlock(m_pPwThreadLoop);
668+
} else {
669+
m_inputs.insert(input, {});
670670
}
671671
}
672672

673673
void PipewireEnumerator::registerOutput(const AudioOutput& output, AudioSource*) {
674+
if (output.isHidden()) {
675+
return;
676+
}
677+
674678
if (m_initialized) {
675679
pw_thread_loop_lock(m_pPwThreadLoop);
676-
createOutputPorts(output);
680+
m_outputs.insert(output, createOutputPorts(output));
677681
pw_thread_loop_unlock(m_pPwThreadLoop);
682+
} else {
683+
m_outputs.insert(output, {});
678684
}
679685
}
680686

681687
// need to pw_thread_loop_lock before calling this
682-
uint32_t* PipewireEnumerator::createPorts(const AudioPath& path, bool channel) {
683-
spa_direction direction;
684-
switch (path.getType()) {
685-
case AudioPathType::Main:
686-
case AudioPathType::Headphones:
687-
case AudioPathType::Booth:
688-
case AudioPathType::Bus:
689-
case AudioPathType::Deck:
690-
direction = SPA_DIRECTION_OUTPUT;
691-
break;
692-
case AudioPathType::VinylControl:
693-
case AudioPathType::Microphone:
694-
case AudioPathType::Auxiliary:
695-
case AudioPathType::RecordBroadcast:
696-
direction = SPA_DIRECTION_INPUT;
697-
break;
698-
default:
699-
qWarning() << "PipewireEnumerator::createPorts path type AudioPathType::Invalid";
700-
return nullptr;
701-
}
702-
688+
std::pair<uint32_t*, uint32_t*> PipewireEnumerator::createPorts(
689+
std::string_view name, spa_direction direction) {
703690
pw_properties* props = pw_properties_new(
704691
// see pipewire/keys.h header
705692
PW_KEY_FORMAT_DSP,
706693
"32 bit float mono audio",
707694
nullptr);
708-
pw_properties_setf(props,
709-
PW_KEY_PORT_NAME,
710-
channel ? "%s:FR" : "%s:FL",
711-
path.getString().toStdString().c_str());
712-
return static_cast<uint32_t*>(pw_filter_add_port(m_pPwFilter,
695+
pw_properties_setf(props, PW_KEY_PORT_NAME, "%s:FL", name.data());
696+
697+
void* leftPort = pw_filter_add_port(m_pPwFilter,
713698
direction,
714699
PW_FILTER_PORT_FLAG_MAP_BUFFERS,
715700
sizeof(uint32_t),
716701
props,
717702
nullptr,
718-
0));
703+
0);
704+
705+
props = pw_properties_new(
706+
// see pipewire/keys.h header
707+
PW_KEY_FORMAT_DSP,
708+
"32 bit float mono audio",
709+
nullptr);
710+
pw_properties_setf(props, PW_KEY_PORT_NAME, "%s:FR", name.data());
711+
712+
void* rightPort = pw_filter_add_port(m_pPwFilter,
713+
direction,
714+
PW_FILTER_PORT_FLAG_MAP_BUFFERS,
715+
sizeof(uint32_t),
716+
props,
717+
nullptr,
718+
0);
719+
return std::pair{static_cast<uint32_t*>(leftPort), static_cast<uint32_t*>(rightPort)};
719720
}
720721

721722
// need to pw_thread_loop_lock before calling this
722-
void PipewireEnumerator::createInputPorts(const AudioInput& input) {
723-
auto ports = std::pair{createPorts(input, false), createPorts(input, true)};
724-
m_inputs.insert(input, ports);
723+
std::pair<uint32_t*, uint32_t*> PipewireEnumerator::createInputPorts(const AudioInput& input) {
724+
std::string inputName = input.getString().toStdString();
725+
return createPorts(inputName, SPA_DIRECTION_INPUT);
725726
}
726727

727728
// need to pw_thread_loop_lock before calling this
728-
void PipewireEnumerator::createOutputPorts(const AudioOutput& output) {
729-
auto ports = std::pair{createPorts(output, false), createPorts(output, true)};
730-
m_outputs.insert(output, ports);
729+
std::pair<uint32_t*, uint32_t*> PipewireEnumerator::createOutputPorts(const AudioOutput& output) {
730+
std::string outputName = output.getString().toStdString();
731+
return createPorts(outputName, SPA_DIRECTION_OUTPUT);
731732
}
732733

733734
void PipewireEnumerator::setLatency(unsigned int sampleRate, unsigned int framesPerBuffer) {

src/soundio/pipewireenumerator.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ class PipewireEnumerator : public SoundDeviceEnumerator {
115115

116116
void updateAudioLatencyUsage(const SINT framesPerBuffer);
117117
void setLatency(unsigned int sampleRate, unsigned int framesPerBuffer);
118-
void createInputPorts(const AudioInput& path);
119-
void createOutputPorts(const AudioOutput& path);
120-
uint32_t* createPorts(const AudioPath& path, bool channel);
118+
std::pair<uint32_t*, uint32_t*> createInputPorts(const AudioInput& path);
119+
std::pair<uint32_t*, uint32_t*> createOutputPorts(const AudioOutput& path);
120+
std::pair<uint32_t*, uint32_t*> createPorts(std::string_view name, spa_direction direction);
121121

122122
struct Link {
123123
uint32_t input;

0 commit comments

Comments
 (0)