Skip to content

Add sound multiplexer auto-detection when building #90

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

Cuda-Chen
Copy link
Collaborator

No description provided.

@Cuda-Chen Cuda-Chen requested review from jserv and Mes0903 July 9, 2025 09:17
@Mes0903
Copy link
Collaborator

Mes0903 commented Jul 10, 2025

The full error log I mentioned above:

mes@mes:~/semu$ dpkg -l | grep jack
ii  libjack-jackd2-0:amd64                           1.9.21~dfsg-3ubuntu3                      amd64        JACK Audio Connection Kit (libraries)
ii  libjack-jackd2-dev:amd64                         1.9.21~dfsg-3ubuntu3                      amd64        JACK Audio Connection Kit (development files)
mes@mes:~/semu$ make check
cd portaudio/ && LDFLAGS="" ./configure --without-sndio
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking how to print strings... printf
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for fgrep... /usr/bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands "+="... yes
checking how to convert x86_64-unknown-linux-gnu file names to x86_64-unknown-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... dlltool
checking how to associate runtime and link libraries... printf %s\n
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking for gawk... gawk
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for mt... mt
checking if mt is a manifest tool... no
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln -s works... yes
checking for ar... /usr/bin/ar
checking whether byte ordering is bigendian... no
checking for snd_pcm_open in -lasound... yes
checking for HPI_SubSysCreate in -lhpi... no
checking sys/audioio.h usability... no
checking sys/audioio.h presence... no
checking for sys/audioio.h... no
checking sys/soundcard.h usability... yes
checking sys/soundcard.h presence... yes
checking for sys/soundcard.h... yes
checking linux/soundcard.h usability... yes
checking linux/soundcard.h presence... yes
checking for linux/soundcard.h... yes
checking machine/soundcard.h usability... no
checking machine/soundcard.h presence... no
checking for machine/soundcard.h... no
checking for _oss_ioctl in -lossaudio... no
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for JACK... yes
checking for PULSE... yes
checking size of short... 2
checking size of int... 4
checking size of long... 8
checking for clock_gettime in -lrt... yes
checking for clock_gettime... yes
checking for nanosleep... yes
checking for pthread_create in -lpthread... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating portaudio-2.0.pc
config.status: executing libtool commands

Configuration summary:

  Target ...................... x86_64-unknown-linux-gnu
  C++ bindings ................ no
  Debug output ................ no

  ALSA ........................ yes
  ASIHPI ...................... no

  AudioIO ..................... no
  OSS ......................... yes
  JACK ........................ yes
  PulseAudio .................. yes
  Sndio ....................... no

make -C portaudio/
make[1]: Entering directory '/home/mes/semu/portaudio'
if test -n "" ; then for dir in ""; do make -C $dir all; done ; fi
make[1]: Leaving directory '/home/mes/semu/portaudio'
  LD    semu
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `IsFormatSupported':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:977:(.text+0x10a): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:977:(.text+0x135): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:977:(.text+0x161): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `GetStreamTime':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1835:(.text+0x1c4): undefined reference to `jack_frame_time'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1835:(.text+0x1e5): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `UpdateQueue':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1524:(.text+0x257): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `RealProcess':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1446:(.text+0x416): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1462:(.text+0x44e): undefined reference to `jack_frame_time'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1489:(.text+0x596): undefined reference to `jack_port_get_buffer'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1500:(.text+0x5d6): undefined reference to `jack_port_get_buffer'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `JackCallback':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1659:(.text+0x6b2): undefined reference to `jack_port_get_buffer'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `StartStream':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1706:(.text+0xd78): undefined reference to `jack_port_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1706:(.text+0xd8b): undefined reference to `jack_port_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1706:(.text+0xd9d): undefined reference to `jack_connect'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1716:(.text+0xe08): undefined reference to `jack_port_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1716:(.text+0xe1b): undefined reference to `jack_port_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1716:(.text+0xe2d): undefined reference to `jack_connect'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `CleanUpStream':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1042:(.text+0x1058): undefined reference to `jack_port_unregister'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1047:(.text+0x1098): undefined reference to `jack_port_unregister'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `Terminate':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:879:(.text+0x15c0): undefined reference to `jack_deactivate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:884:(.text+0x15f8): undefined reference to `jack_client_close'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `RealStop':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1785:(.text+0x187c): undefined reference to `jack_port_connected'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1787:(.text+0x1897): undefined reference to `jack_port_disconnect'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1793:(.text+0x1978): undefined reference to `jack_port_connected'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1795:(.text+0x1993): undefined reference to `jack_port_disconnect'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `OpenStream':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1146:(.text+0x1b79): undefined reference to `jack_port_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1149:(.text+0x1b90): undefined reference to `jack_client_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1156:(.text+0x1bc4): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1250:(.text+0x1eec): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1283:(.text+0x20b4): undefined reference to `jack_port_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1284:(.text+0x20f9): undefined reference to `jack_port_register'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1293:(.text+0x21a7): undefined reference to `jack_port_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1294:(.text+0x21ed): undefined reference to `jack_port_register'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1340:(.text+0x22b6): undefined reference to `jack_get_ports'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1344:(.text+0x22e2): undefined reference to `jack_port_by_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1385:(.text+0x23c2): undefined reference to `jack_frame_time'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1313:(.text+0x24d3): undefined reference to `jack_get_ports'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1317:(.text+0x2502): undefined reference to `jack_port_by_name'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `PaJack_Initialize':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:792:(.text+0x2b32): undefined reference to `jack_client_open'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `BuildDeviceList':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:519:(.text+0x2b6b): undefined reference to `jack_client_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:539:(.text+0x2bdf): undefined reference to `jack_client_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:546:(.text+0x2c0d): undefined reference to `jack_get_ports'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:565:(.text+0x2ccf): undefined reference to `jack_client_name_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:606:(.text+0x2d83): undefined reference to `jack_get_sample_rate'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:639:(.text+0x2ebd): undefined reference to `jack_get_ports'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:660:(.text+0x2ef9): undefined reference to `jack_get_ports'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `PaJack_Initialize':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:859:(.text+0x2ffc): undefined reference to `jack_client_close'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `BuildDeviceList':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:646:(.text+0x30e5): undefined reference to `jack_port_by_name'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:667:(.text+0x3163): undefined reference to `jack_port_by_name'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `PaJack_Initialize':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:840:(.text+0x3398): undefined reference to `jack_on_shutdown'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:841:(.text+0x33a4): undefined reference to `jack_set_error_function'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:842:(.text+0x33b0): undefined reference to `jack_get_buffer_size'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:844:(.text+0x33cd): undefined reference to `jack_set_sample_rate_callback'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:845:(.text+0x33e3): undefined reference to `jack_set_xrun_callback'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:846:(.text+0x3449): undefined reference to `jack_set_process_callback'
/usr/bin/ld: /home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:847:(.text+0x3477): undefined reference to `jack_activate'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `PaJack_SetClientName':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1847:(.text+0x3676): undefined reference to `jack_client_name_size'
/usr/bin/ld: portaudio/lib/.libs/libportaudio.a(pa_jack.o): in function `PaJack_GetClientName':
/home/mes/semu/portaudio/src/hostapi/jack/pa_jack.c:1862:(.text+0x36e4): undefined reference to `jack_get_client_name'
collect2: error: ld returned 1 exit status
make: *** [Makefile:157: semu] Error 1

If you need to check any other information for this environment, feel free to let me know.

@Cuda-Chen
Copy link
Collaborator Author

Hi @Mes0903 ,

I would like to get your environment.

Interestingly, the CI build test is passed. So I think there is some mystery in your actual environment as the configuration of your PortAudio detects with both JACK and PulseAudio.
What I know is that JACK can coexist with PulseAudio (JACK can use PulseAudio as backend).

@Mes0903
Copy link
Collaborator

Mes0903 commented Jul 10, 2025

@Cuda-Chen Here are my test results. Alternatively, feel free to let me know what specific information you’d like me to provide (or which commands I should run?).

mes@mes:~/semu$ 
## === ALSA ===
(echo '#include <alsa/asoundlib.h>
int main(){ snd_pcm_t *pcm;
  snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0);
  snd_pcm_close(pcm); return 0; }' \
) | gcc -x c - -lasound -o /dev/null
echo "ALSA exit code: $?"

## === PulseAudio ===
(echo '#include <pulse/mainloop.h>
int main(){ pa_mainloop *m; return 0; }' \
) | gcc -x c - -lpulse -o /dev/null
echo "PulseAudio exit code: $?"

## === JACK 2 ===
(echo '#include <jack/jack.h>
int main(){ return 0; }' \
) | gcc -x c - -ljack -o /dev/null
echo "JACK exit code: $?"
ALSA exit code: 0
PulseAudio exit code: 0
JACK exit code: 0

mes@mes:~/semu$
pkg-config --modversion alsa        || true
pkg-config --modversion libpulse    || true
pkg-config --modversion jack        || true
1.2.11
16.1
1.9.21

@Mes0903
Copy link
Collaborator

Mes0903 commented Jul 10, 2025

I think the problem is that this environment has both PulseAudio and JACK installed at the same time:

mes@mes:~/semu$ dpkg -l | grep -i pulse
ii  libpulse-dev:amd64                               1:16.1+dfsg1-2ubuntu10.1                  amd64        PulseAudio client development headers and libraries
ii  libpulse-mainloop-glib0:amd64                    1:16.1+dfsg1-2ubuntu10.1                  amd64        PulseAudio client libraries (glib support)
ii  libpulse0:amd64                                  1:16.1+dfsg1-2ubuntu10.1                  amd64        PulseAudio client libraries
mes@mes:~/semu$ dpkg -l | grep jack
ii  libjack-jackd2-0:amd64                           1.9.21~dfsg-3ubuntu3                      amd64        JACK Audio Connection Kit (libraries)
ii  libjack-jackd2-dev:amd64                         1.9.21~dfsg-3ubuntu3                      amd64        JACK Audio Connection Kit (development files)

In the Makefile, once the check detects PulseAudio it skips the JACK test, yet the build log says the library is being built with support for both back-ends:

Configuration summary:

  Target ...................... x86_64-unknown-linux-gnu
  C++ bindings ................ no
  Debug output ................ no

  ALSA ........................ yes
  ASIHPI ...................... no

  AudioIO ..................... no
  OSS ......................... yes
  JACK ........................ yes
  PulseAudio .................. yes
  Sndio ....................... no

But due to the skip, we didnt add the ljack flag. That mismatch is what leads to the failure.

I think the CI passes simply because it tests three separate cases for “no audio dev packages,” “PulseAudio only,” and “JACK only”, but it doesn't test the scenario where both PulseAudio and JACK are present simultaneously.

@Cuda-Chen
Copy link
Collaborator Author

Hi @Mes0903 ,

Thanks for pointing me out.
I will add a test of installing JACK as well as PulseAudio.

@Mes0903
Copy link
Collaborator

Mes0903 commented Jul 10, 2025

BTW, in the build log mentioned above, I noticed several other libraries like "ASIHPI", "AudioIO", etc. My environment doesn't have these libraries installed so I cant test it, but could they potentially cause similar issues as well?

@Cuda-Chen
Copy link
Collaborator Author

Hi @Mes0903 ,

I noticed several other libraries like "ASIHPI", "AudioIO", etc. My environment doesn't have these libraries installed so I cant test it, but could they potentially cause similar issues as well?
I admit I have no idea.

@Mes0903
Copy link
Collaborator

Mes0903 commented Jul 10, 2025

@Cuda-Chen I think the current issue is that PortAudio enables every host-API it finds on the system, which forces us to keep adding the corresponding link flags. Manually probing for each library and maintaining a hard-coded list of -lxxx flags is error-prone and carries a long-term maintenance cost. If we miss one today, or a new backend is added in the future, we have to update the list by hand again.

I think a cleaner approach is to:

  • enable only the back-ends we actually need and make sure their dev packages are present(like what we do for now), then link against just those libraries, or
  • run PortAudio’s configure once up front, parse its result, and feed the correct flags back into our Makefile automatically.

I tried a quick implementation of the first option and it now builds and runs successfully on all three of my test machines. Below is the key points of the snippet:

...
$(call set-feature, VIRTIOSND)
ifeq ($(call has, VIRTIOSND), 1)
    PA_LIB := portaudio/lib/.libs/libportaudio.a
    PA_CFLAGS := -Iportaudio/include

    # Completely clean and reconfigure PortAudio with only ALSA
    $(PA_LIB):
	    git submodule update --init portaudio
	    cd portaudio && git clean -fdx && git reset --hard HEAD
	    cd portaudio && ./configure \
	        --enable-static \
	        --disable-shared \
	        --without-samples \
	        --without-tests \
	        --with-alsa \
	        --without-jack \
	        --without-oss \
	        --without-pulseaudio \
	        --without-sndio \
	        --disable-dependency-tracking
	    $(MAKE) -C portaudio

    # Add PortAudio to LDFLAGS directly
    LDFLAGS += $(PA_LIB) -lasound -lrt -lm -lpthread

    # Re-compile pattern: the $$( … ) is expanded when the command runs,
    # i.e. after $(PA_LIB) and its .pc file exist.
    %.o: %.c $(PA_LIB)
	    $(VECHO) "  CC\t$@\n"
	    $(Q)$(CC) -o $@ $(CFLAGS) $(PA_CFLAGS) -c -MMD -MF .$@.d $<

    # Add the virtio-snd object file to the build
    OBJS_EXTRA += virtio-snd.o

    # Make main.o and virtio-snd.o depend on PortAudio being built  
    main.o: $(PA_LIB)
    virtio-snd.o: $(PA_LIB)
endif

With only ALSA enabled, the relevant part of the build log now reads:

Configuration summary:

  Target ...................... x86_64-unknown-linux-gnu
  C++ bindings ................ no
  Debug output ................ no

  ALSA ........................ yes
  ASIHPI ...................... no

  AudioIO ..................... no
  OSS ......................... no
  JACK ........................ no
  PulseAudio .................. no
  Sndio ....................... no

Then we get a lean PortAudio build, link exactly the libraries we need. BTW, Im not familar with the syntax of Makefile, so maybe there is an better approach to do these stuff.

@Cuda-Chen
Copy link
Collaborator Author

Hi @Mes0903 ,

Thanks for the hint.
I will let myself work on this track.

@Cuda-Chen Cuda-Chen changed the title Add JACK sound multiplexer support Add sound multiplexer auto-detection when building Jul 12, 2025
@Cuda-Chen
Copy link
Collaborator Author

Hi @Mes0903 ,

I just update my code as our discussion.
You may continue code review once you are ready.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants