@@ -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
660658void 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
673673void 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
733734void PipewireEnumerator::setLatency (unsigned int sampleRate, unsigned int framesPerBuffer) {
0 commit comments