jamulussoftware / jamulus

Jamulus enables musicians to perform real-time jam sessions over the internet.
https://jamulus.io
Other
988 stars 221 forks source link

Add support for the portaudio library #116

Closed dubnemo closed 2 years ago

dubnemo commented 4 years ago

I understand you have a Jack wrapper implementation, but native alsa may provide even better performance on the raspberry pi for Jamulus clients leveraging HiFiBerry DAC+ ADC boards.

corrados commented 4 years ago

Can you prove that? I run Jamulus on a Raspberry Pi Zero with Jack. I do not think direct ALSA interface can improve the performance. Maybe some Jack Audio developer can comment on that.

mirabilos commented 4 years ago

JACK also uses ALSA in the backend, because ALSA is what the kernel provides (that, or OSS).

So, as long as you have only one application using sound running, ALSA has much less overhead (less processes ⇒ less RAM and less context switches).

I’d prefer ALSA on Linux but have JACK as an option (e.g. for proper musicians who use it anyway), but we need JACK on GNU/kFreeBSD and GNU/Hurd in Debian because these don’t have ALSA because they don’t use the Linux kernel, so ideally both would be available and the user could choose.

trebmuh commented 4 years ago

JACK can use ALSA in the backend, but it can use a bunch of other backends too (think FFADO as an example).

corrados commented 4 years ago

See this commit: cb951c92c2bcf65ef0c42ba1bedda646b33041b6 and also this: https://github.com/corrados/jamulus/blob/master/ChangeLog#L368 We have an audio interface for ASIO, CoreAudio, Jack and Android (under development). I actually do not want to have another one...

dubnemo commented 4 years ago

My HiFiBerry DAC+ ADC has shipped (Switzerland -> Minneapolis US), and it is only accessed via ALSA interface. My guess is the coverage of the implementation of ALSA within Jack.
I too have Jamulus working on RPi4 in listening mode only. Need the ADC for full functionality. I will have proof when I receive and test -- I suspect I will be OK.

mirabilos commented 4 years ago

Scott T Nieman dixit:

My HiFiBerry DAC+ ADC has shipped (Switzerland -> Minneapolis US), and it is only accessed via ALSA interface.

JACK uses ALSA by talking to the ALSA interfaces the same way an application directly using ALSA would.

My guess is the coverage of the implementation of ALSA within Jack.

This makes no sense. If it works without JACK it will work with JACK.

(If jackd starts. I had a case today on a laptop infested with poetteringaudio where we couldn’t get it to. On another, it worked. Both not mine, I ofc know better…)

corrados dixit:

We have an audio interface for ASIO, CoreAudio, Jack and Android (under development). I actually do not want to have another one...

Fair enough.

dubnemo commented 4 years ago

@mirabilos

This makes no sense. If it works without JACK it will work with JACK.

Really.
So are you saying that JACK implements 100% of the ALSA interfaces? https://www.alsa-project.org/alsa-doc/alsa-lib/files.html

An application may choose to implement what it needs for the scope of its functionality; e.g., MIDI (rawmidi.h) may be out of scope. That is what is typically is called 'coverage', at least in my 30+ years of development.

mirabilos commented 4 years ago

Scott T Nieman dixit:

This makes no sense. If it works without JACK it will work with JACK. Really.
So are you saying that JACK implements 100% of the ALSA interfaces?

I’m not.

I’m saying that JACK implements 0% of the ALSA interfaces, because it uses ALSA (not substitutes it).

elliotclee commented 4 years ago

@corrados Could you just switch Jamulus to using portaudio (portaudio.com) as its audio API? It would relieve you of the need to maintain code for multiple audio APIs, and it would add support for additional audio interfaces (e.g. WDM-KS on Windows). It's also the library that Jack itself uses.

corrados commented 4 years ago

Jack on Linux uses portaudio?

elliotclee commented 4 years ago

Not on Linux. Definitely on Windows, maybe on Mac (git has libportaudio.a but I'm not sure it's still used).

Does the portaudio API provide adequate functionality for Jamulus' needs?

corrados commented 4 years ago

Does portaudio support the Google Oboe library for Android? We are currently working on a new audio interface implementation for Jamulus for Android which uses the Oboe library, see https://github.com/corrados/jamulus/issues/83

elliotclee commented 4 years ago

Good question. Looks like the official Portaudio is mainly a Win/Mac/Linux deal. There is a port of portaudio to opensles at https://github.com/Gundersanne/portaudio_opensles/tree/master/src/hostapi/opensles but that's the old Android API. I can't find any port of portaudio to AAudio or Oboe.

It might be just as much work to add Oboe support to portaudio as it would be to update the Jamulus audio code to support all the other platforms it would be nice to have. E.g. using portaudio would allow switching between ASIO and Jack at runtime on Windows, and allow also using WDM-KS devices.

corrados commented 4 years ago

Yes, I see the advantages of portaudio. It is definitely much better to include portaudio than ALSA directly (as is the title of this Issue). But right now I do not see an urgent need of including portaudio. Maybe we should change the title of this Issue and work on a portaudio integration sometime later (maybe when the peak of Corona is over and we have more time for other stuff).

corrados commented 4 years ago

Since portaudio supports ALSA directly, I will change the title of this Issue now to better reflect the ongoing discussion here.

dubnemo commented 4 years ago

I still don't understand why you are not considering dmix plug-in for ALSA to eliminate the extra dependencies. One can provide basic instructions on the asound.conf file. https://www.alsa-project.org/main/index.php/Asoundrc

mirabilos commented 4 years ago

Scott T Nieman dixit:

I still don't understand why you are not considering dmix plug-in for ALSA to eliminate the extra dependencies. One can provide basic instructions on the asound.conf file.

Changing the system-wide state is a big detriment for casual users.

dubnemo commented 4 years ago

@mirabilos I am using an add-on ADC GPIO board to avoid the USB interface and any potential latency that introduces. So in order to make that happen, I currently do have to create asound.conf with dmix slave. As @streaps states it would work fine for USB interface users without any asound.conf once you have Jack routed - not so casual.

The dmix C interface seems pretty straight-forward to pass in the PCM stream. https://www.alsa-project.org/alsa-doc/alsa-lib/pcm__dmix_8c.html#ae31120062bceb47f24d18e672f728b4f the second overload function has slave parameters.

dubnemo commented 3 years ago

@corrados Here is a simple use case on Raspberry Pi that I am willing to test to see if portaudio will work. Roland RCC-10-USXF USB Microphone, monitoring on Pi Headphone Jack.
ALSA recognizes the devices. Jackd is now failing on four RPis with fresh Raspberry Pi OS images (release 2021-03-04). https://github.com/jamulussoftware/jamulus/discussions/1376

jujudusud commented 2 years ago

@npostavs : If portaudio doesn't work, can we have a look at other cross-platform alternatives ? "miniaudio" could be a good alternative : miniaud.io

npostavs commented 2 years ago

Looks interesting, although lack of support for ASIO means it wouldn't be able to replace all use cases on Windows.

EDIT: also seems to lack channel names.

dubnemo commented 2 years ago

Keep in mind this issue was not to replace ASIO interfaces but to provide lower level ALSA interfaces on Linux operating systems and avoid the additional overhead/threads of Jackd, reducing overall latency attributed to client overhead specifically on Raspberry Pi. The topic switched to portaudio and again continues to drift.

On Fri, Feb 25, 2022, 8:36 PM Noam Postavsky @.***> wrote:

Looks interesting, although lack of support for ASIO means it wouldn't be able to replace all use cases on Windows.

— Reply to this email directly, view it on GitHub https://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1051485200, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXOQO2MTVNIPP4XJ5UW423U5A4CBANCNFSM4ML7LMQA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you authored the thread.Message ID: @.***>

jujudusud commented 2 years ago

Keep in mind this issue was not to replace ASIO interfaces but to provide lower level ALSA interfaces on Linux operating systems and avoid the additional overhead/threads of Jackd, reducing overall latency attributed to client overhead specifically on Raspberry Pi. The topic switched to portaudio and again continues to drift.

@dubnemo : You are right. But since Corrados says that it is also replacing ASIO for Windows ( #271 ), I search for a library that supports all the backends.

@npostavs , since ASIO is already implemented separetly, I Can not see that it would not be a problem

@ all : This lib should do the trick :

npostavs commented 2 years ago

Keep in mind this issue was not to replace ASIO interfaces but to provide lower level ALSA interfaces on Linux operating systems

I think portaudio already works for that.

dubnemo commented 2 years ago

I did not read that issue until now, but it feels more along the lines of additional interfaces not replacement. Lower level bindings vs interprocess communication with the jackd daemon.

On Sat, Feb 26, 2022 at 2:09 AM Julien Taverna @.***> wrote:

Keep in mind this issue was not to replace ASIO interfaces but to provide lower level ALSA interfaces on Linux operating systems and avoid the additional overhead/threads of Jackd, reducing overall latency attributed to client overhead specifically on Raspberry Pi. The topic switched to portaudio and again continues to drift.

You are right. But since Corrados says that it is also replacing ASIO for Windows ( #271 https://github.com/jamulussoftware/jamulus/issues/271 ), I search for a library that supports all the backends.

@npostavs https://github.com/npostavs , since ASIO is already implemented separetly, I Can not see that it would not be a problem

This lib should do the trick :

  • add ALSA backend on Linux,
  • add Wasapi backend on Windows. At the same tile with the dame coding effort.

— Reply to this email directly, view it on GitHub https://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1051801590, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXOQO4KESQVLX35UUUDA3TU5CDDBANCNFSM4ML7LMQA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you authored the thread.Message ID: @.***>

dubnemo commented 2 years ago

Keep in mind this issue was not to replace ASIO interfaces but to provide lower level ALSA interfaces on Linux operating systems

I think portaudio already works for that.

Yes @npostavs that has been the discussion, but this issue is still open and on the backlog. I see the pull request and feature branch, and I see most of the issues were on Windows and may be daunting to catch up at this point with the number of commits ahead. Can you comment on how this worked on Linux/ Raspberry PI OS?

npostavs commented 2 years ago

It worked for me on my Linux box; I got no testers for Raspberry PI, so I guess there's not really much interest.

jujudusud commented 2 years ago

@dubnemo : If you want native, abstraction library-free support for ALSA on Linux, I'm afraid you'll have to find someone who codes this implementation. The current vision of the project is rather oriented towards an abstraction library that is cross platform.

dubnemo commented 2 years ago

@npostavs cr There are a TON of people using Raspberry Pi as a client, especially since the Pi 400 came out. I will carve out time this week to do a special build of that branch and test on my end. Thank you.

On Sat, Feb 26, 2022 at 9:23 AM Noam Postavsky @.***> wrote:

It worked for me on my Linux box; I got no testers for Raspberry PI, so I guess there's not really much interest.

— Reply to this email directly, view it on GitHub https://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1052196341, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXOQO2HDDISJRUZTLLCPGDU5DV5LANCNFSM4ML7LMQA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you were mentioned.Message ID: @.***>

jujudusud commented 2 years ago

Just another question:

JACK is in charge of ensuring real-time and low-latency rendering while ALSA, to my knowledge, does not.

elliotclee commented 2 years ago

@jujudusud JACK and ALSA are different levels of abstraction. On Linux, JACK runs on top of ALSA. ALSA and other pieces of the operating system have the low-level stuff needed to manage real-time & low-latency output, but not all the high-level APIs that JACK offers.

By the way, I'm pleased to see all the progress on this issue since I chimed in on it almost two years ago. Thank you everyone for your hard work, and keep it up!

jujudusud commented 2 years ago

@jujudusud JACK and ALSA are different levels of abstraction. On Linux, JACK runs on top of ALSA. ALSA and other pieces of the operating system have the low-level stuff needed to manage real-time & low-latency output, but not all the high-level APIs that JACK offers.

The question is not the higher level APIs or the lower level stuff but the synchronous, sample-accurate and low-latency manner to do those things.

From my perspective, JACK differs from ALSA because it focuses on two key areas: synchronous execution of all clients and low-latency operation, whereas ALSA doesn't worry about synchronization but plays the sound when it arrives.

dubnemo commented 2 years ago

@npostavs when I do an About, what version should I see with this feature branch? There used to be a good page on the build process, but now that changed to apt. Not sure if it was properly compiled. I have a RPi4 with 8G and a HiFi Berry DAC+ADC I am testing for this branch.

jujudusud commented 2 years ago

There used to be a good page on the build process, but now that changed to apt. Not sure if it was properly compiled.

The compiling instructions are now in the COMPILING.md file, in the root directory of the project.

You don't tell us what version of Raspberry Pi OS you are using. I think you should use the 64 bits version of the OS. The announcement is here on the official site.

dubnemo commented 2 years ago

I saw this page, and the old page was much better including the build of dependencies instead of a list. @npostavs Since this feature branch is for portaudio, do I eliminate the dependency on libjack-jackd2-dev? This build still shows Jack, and no other Device in the drop list. 2022-03-05-122830_1920x1080_scrot

I don't think 64bit Raspberry Pi OS matters for testing.

On Thu, Mar 3, 2022 at 1:49 AM Julien Taverna @.***> wrote:

There used to be a good page on the build process, but now that changed to apt. Not sure if it was properly compiled.

The compiling instructions are now in the COMPILING.md https://github.com/jamulussoftware/jamulus/blob/feature/np/portaudio/COMPILING.md file, in the root directory of the project.

You don't tell us what version of Raspberry Pi OS you are using. I think you should use the 64 bits version of the OS. The announcement is here https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/ on the official site.

dubnemo commented 2 years ago

@npostavs On my Raspberry Pi4 8G, Pi OS 64bit - clean install....

sudo apt-get install build-essential 
sudo apt-get install qt5-qmake
sudo apt-get install qtdeclarative5-dev
sudo apt-get install qttools5-dev-tools
# sudo apt-get install qt5-default # not needed qt5-assistant 
# purposely not installing jack to see if you are requiring it
qmake Jamulus.pro  

returns

Project MESSAGE: building version "3.8.0dev-nogit" (intermediate without git repository)
Project MESSAGE: Jack Audio Interface Enabled.
Project ERROR: jack development package not found

It this because the portaudio libraries are not found? i.e., dependency not installed (therefore 'nosound')?
Or are you really requiring libjack-jackd2-dev on this feature branch?

    !CONFIG(portaudio) {
        HEADERS += linux/sound.h
        SOURCES += linux/sound.cpp
    }

    # we assume to have lrintf() one moderately modern linux distributions
    # would be better to have that tested, though
    DEFINES += HAVE_LRINTF

    # we assume that stdint.h is always present in a Linux system
    DEFINES += HAVE_STDINT_H

    # only include jack support if CONFIG nosound is not set
    contains(CONFIG, "nosound") {
        message(Restricting build to server-only due to CONFIG+=nosound.)
        DEFINES += SERVER_ONLY
    } else:!CONFIG(portaudio) {
        message(Jack Audio Interface Enabled.)

        contains(CONFIG, "raspijamulus") {
            message(Using Jack Audio in raspijamulus.sh mode.)
            LIBS += -ljack
        } else {
            CONFIG += link_pkgconfig
            PKGCONFIG += jack
        }

        DEFINES += WITH_JACK
    }
npostavs commented 2 years ago

You need qmake CONFIG+=portaudio to enable it. I'm not entirely sure if it would build without jack dev files though (because portaudio has the option to use jack also). If it fails, you can try instead qmake 'CONFIG+=portaudio portaudio_shared_lib' which uses existing portaudio dev files instead of compiling from the git submodule.

dubnemo commented 2 years ago

Thanks, Noam @npostavs. I will try that later today. I am trying to avoid spinning up the jackd daemon, as you know. Based on the prior screen shots, only Jack showed in the droplist, not direct devices from portaudio. Hence why I started from scratch with the new Pi OS and re-configured the HiFi Berry. Scott

On Thu, Mar 17, 2022 at 9:49 PM Noam Postavsky @.***> wrote:

You need qmake CONFIG+=portaudio to enable it. I'm not entirely sure if it would build without jack dev files though (because portaudio has the option to use jack also). If it fails, you can try instead qmake 'CONFIG+=portaudio portaudio_shared_lib' which uses existing portaudio dev files instead of compiling from the git submodule.

— Reply to this email directly, view it on GitHub https://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1071974480, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXOQO5KG5UBG2XCSCDLBM3VAPVMJANCNFSM4ML7LMQA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you were mentioned.Message ID: @.***>

dubnemo commented 2 years ago

@npostavs First approach didn't work, and second approach is missing the header file.


pi@raspberrypi:~/Downloads/jamulus-feature-np-portaudio $ qmake CONFIG+=portaudio
Project MESSAGE: building version "3.8.0dev-nogit" (intermediate without git repository)
Project MESSAGE: driver portaudio
Project ERROR: non-shared portaudio only implemented for win32
pi@raspberrypi:~/Downloads/jamulus-feature-np-portaudio $ qmake 'CONFIG+=portaudio portaudio_shared_lib'
Project MESSAGE: building version "3.8.0dev-nogit" (intermediate without git repository)
Project MESSAGE: driver portaudio
pi@raspberrypi:~/Downloads/jamulus-feature-np-portaudio $ make
/usr/lib/qt5/bin/uic src/aboutdlgbase.ui -o ui_aboutdlgbase.h
/usr/lib/qt5/bin/uic src/clientdlgbase.ui -o ui_clientdlgbase.h
/usr/lib/qt5/bin/uic src/serverdlgbase.ui -o ui_serverdlgbase.h
/usr/lib/qt5/bin/uic src/clientsettingsdlgbase.ui -o ui_clientsettingsdlgbase.h
/usr/lib/qt5/bin/uic src/chatdlgbase.ui -o ui_chatdlgbase.h
/usr/lib/qt5/bin/uic src/connectdlgbase.ui -o ui_connectdlgbase.h
g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o buffer.o src/buffer.cpp
g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o channel.o src/channel.cpp
g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o client.o src/client.cpp
In file included from src/client.h:46,
                 from src/client.cpp:25:
src/portaudiosound.h:43:10: fatal error: portaudio.h: No such file or directory
   43 | #include <portaudio.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:2287: client.o] Error 1
elliotclee commented 2 years ago

What's the path to portaudio.h on your system?

If you can find the file then it probably needs to be added to the gcc command line as a -I option.

If you can't find the file you may need to install a portaudio-devel package (or another package name) that has the headers in it.

Elliot


From: Scott T Nieman @.> Sent: Monday, March 21, 2022 5:54:15 PM To: jamulussoftware/jamulus @.> Cc: elliotclee @.>; Comment @.> Subject: Re: [jamulussoftware/jamulus] Add support for the portaudio library (#116)

@npostavshttps://github.com/npostavs First approach didn't work, and second approach is missing the header file.

@.:~/Downloads/jamulus-feature-np-portaudio $ qmake CONFIG+=portaudio Project MESSAGE: building version "3.8.0dev-nogit" (intermediate without git repository) Project MESSAGE: driver portaudio Project ERROR: non-shared portaudio only implemented for win32 @.:~/Downloads/jamulus-feature-np-portaudio $ qmake 'CONFIG+=portaudio portaudio_shared_lib' Project MESSAGE: building version "3.8.0dev-nogit" (intermediate without git repository) Project MESSAGE: driver portaudio @.:~/Downloads/jamulus-feature-np-portaudio $ make /usr/lib/qt5/bin/uic src/aboutdlgbase.ui -o ui_aboutdlgbase.h /usr/lib/qt5/bin/uic src/clientdlgbase.ui -o ui_clientdlgbase.h /usr/lib/qt5/bin/uic src/serverdlgbase.ui -o ui_serverdlgbase.h /usr/lib/qt5/bin/uic src/clientsettingsdlgbase.ui -o ui_clientsettingsdlgbase.h /usr/lib/qt5/bin/uic src/chatdlgbase.ui -o ui_chatdlgbase.h /usr/lib/qt5/bin/uic src/connectdlgbase.ui -o ui_connectdlgbase.h g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o buffer.o src/buffer.cpp g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o channel.o src/channel.cpp g++ -c -pipe -O2 -std=gnu++11 -D_REENTRANT -Wall -Wextra -fPIC -DAPP_VERSION=\"3.8.0dev-nogit\" -DCUSTOM_MODES -D_REENTRANT -DQT_NO_DEPRECATED_WARNINGS -DHAVE_LRINTF -DHAVE_STDINT_H -DOPUS_BUILD=1 -DUSE_ALLOCA=1 -DOPUS_HAVE_RTCD=1 -DHAVE_LRINTF=1 -DHAVE_LRINT=1 -DUSE_PORTAUDIO -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -Isrc -Ilibs/opus/include -Ilibs/opus/celt -Ilibs/opus/silk -Ilibs/opus/silk/float -Ilibs/opus/silk/fixed -Ilibs/opus -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtNetwork -I/usr/include/aarch64-linux-gnu/qt5/QtXml -I/usr/include/aarch64-linux-gnu/qt5/QtConcurrent -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o client.o src/client.cpp In file included from src/client.h:46, from src/client.cpp:25: src/portaudiosound.h:43:10: fatal error: portaudio.h: No such file or directory 43 | #include | ^~~~~ compilation terminated. make: [Makefile:2287: client.o] Error 1

— Reply to this email directly, view it on GitHubhttps://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1074458692, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AJNWQFDR2YKDBXYABIJK7YLVBDVYPANCNFSM4ML7LMQA. You are receiving this because you commented.Message ID: @.***>

dubnemo commented 2 years ago

@elliotclee that is exactly what I am looking for now on my Raspberry Pi OS 64. This was a clean install, aiming to bypass libjack-jackd2-dev (if you caught that above).

elliotclee commented 2 years ago

The development package is called portaudio19-dev

At least in Ubuntu. If that's already installed, then list the files in it and grep for portaudio.h

Elliot


From: Scott T Nieman @.> Sent: Monday, March 21, 2022 6:55:14 PM To: jamulussoftware/jamulus @.> Cc: elliotclee @.>; Mention @.> Subject: Re: [jamulussoftware/jamulus] Add support for the portaudio library (#116)

@elliotcleehttps://github.com/elliotclee that is exactly what I am looking for now on my Raspberry Pi OS 64. This was a clean install, bypassing libjack-jackd2-dev (if you caught that above).

— Reply to this email directly, view it on GitHubhttps://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1074500563, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AJNWQFGXNZUBKBXAJ4H5H6DVBD45FANCNFSM4ML7LMQA. You are receiving this because you were mentioned.Message ID: @.***>

dubnemo commented 2 years ago

Am I reading this correctly, that portaudio depends on Jack?

pi@raspberrypi:~ $ sudo apt install portaudio19-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libasound2-dev libjack-dev libjack0 libportaudio2 libportaudiocpp0 uuid-dev
Suggested packages:
  libasound2-doc jackd1 portaudio19-doc
The following packages will be REMOVED:
  libjack-jackd2-0
The following NEW packages will be installed:
  libasound2-dev libjack-dev libjack0 libportaudio2 libportaudiocpp0
  portaudio19-dev uuid-dev
0 upgraded, 7 newly installed, 1 to remove and 0 not upgraded.
Need to get 734 kB of archives.
After this operation, 3,142 kB of additional disk space will be used.
Do you want to continue? [Y/n] n
elliotclee commented 2 years ago

Yes, because portaudio can act as an abstraction layer on top of Jack. If you don't want Jack installed then you'd need to build your own custom portaudio19 packages.

Elliot


From: Scott T Nieman @.> Sent: Monday, March 21, 2022 7:47:33 PM To: jamulussoftware/jamulus @.> Cc: elliotclee @.>; Mention @.> Subject: Re: [jamulussoftware/jamulus] Add support for the portaudio library (#116)

Am I reading this correctly, that portaudio depends on Jack?

@.*:~ $ sudo apt install portaudio19-dev Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libasound2-dev libjack-dev libjack0** libportaudio2 libportaudiocpp0 uuid-dev Suggested packages: libasound2-doc jackd1 portaudio19-doc The following packages will be REMOVED: libjack-jackd2-0 The following NEW packages will be installed: libasound2-dev libjack-dev libjack0 libportaudio2 libportaudiocpp0 portaudio19-dev uuid-dev 0 upgraded, 7 newly installed, 1 to remove and 0 not upgraded. Need to get 734 kB of archives. After this operation, 3,142 kB of additional disk space will be used. Do you want to continue? [Y/n] n

— Reply to this email directly, view it on GitHubhttps://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1074531784, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AJNWQFHVGZT6OXY77V7LUADVBEDBLANCNFSM4ML7LMQA. You are receiving this because you were mentioned.Message ID: @.***>

npostavs commented 2 years ago

I'll try to add an option to the Jamulus project file to compile portaudio without jack.

elliotclee commented 2 years ago

Noam, it might be a bit more involved than that. I remember seeing somewhere that Jamulus only compiles portaudio on win32, and Scott is running Raspberry Pi (aka Debian/Ubuntu-ish Linux).

Elliot


From: Noam Postavsky @.> Sent: Monday, March 21, 2022, 9:15 PM To: jamulussoftware/jamulus @.> Cc: elliotclee @.>; Mention @.> Subject: Re: [jamulussoftware/jamulus] Add support for the portaudio library (#116)

I'll try to add an option to the Jamulus project file to compile portaudio without jack.

— Reply to this email directly, view it on GitHubhttps://github.com/jamulussoftware/jamulus/issues/116#issuecomment-1074583113, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AJNWQFHTUZPXQE7S4PDWU63VBENKVANCNFSM4ML7LMQA. You are receiving this because you were mentioned.Message ID: @.***>

npostavs commented 2 years ago

I wrote Jamulus' portaudio code so I have an idea about how involved it is ;)

I remember seeing somewhere that Jamulus only compiles portaudio on win32,

Initially I only did it for win32, but later extended it to unix & macOS platforms (although I don't recall if anyone ever tested on macOS so it may not actually work).

dubnemo commented 2 years ago

@elliotclee @npostavs I noticed the latest PortAudio will not compile on Raspberry Pi4 without edits, hopefully resolved on the next V19.8 milestone. https://github.com/PortAudio/portaudio/issues/683

Yes, because portaudio can act as an abstraction layer on top of Jack. If you don't want Jack installed then you'd need to build your own custom portaudio19 packages. Elliot

jujudusud commented 2 years ago

On portaudio's website, they say :

That will build PortAudio using Jack, ALSA and OSS in whatever combination they are found on your system. For example, if you have Jack and OSS but not ALSA, it will build using Jack and OSS but not ALSA.

If you compile portaudio yourself without JACK installed, then it doesn't use JACK? Take a look at this page : Compilation guide for Linux

dubnemo commented 2 years ago

Is it fair to state the minimal viable product for a PortAudio build for RPi4 would only need these files? portaudio.h pa_devs.c pa_linux_alsa.h

Ref: http://files.portaudio.com/docs/v19-doxydocs/files.html