Got it working on Ubuntu 20.04
After trying several things and a lot of frustration... the following worked:
sudo apt install python3-pyo
and the test:
#/usr/bin/env python3
from pyo import *
s = Server()
s.boot()
s.start()
a = Sine(freq=440, mul=0.5)
a.out()
time.sleep(2)
a.stop()
s.stop()
produces a 2 second 440Hz sine sound as desired. Maybe a reboot was needed.
If program is using the audio when you launch the test, e.g. Chromium playing an YouTube video or VLC playing music, then it fails with that exception, so make sure to pausing/close all such applications.
Another thing worth doing is:
sudo apt install python3-wxgtk4.0
otherwise pyo keeps warning about the missing wxWidgets every single time. I don't think it makes the run fail however.
The above sudo apt install python3-pyo
install pyo 1.0.0, and all the binary dependencies it needs to work, the dependency given by:
apt-cache depends python3-pyo
is:
python3-pyo
Depends: libc6
|Depends: libjack-jackd2-0
Depends: <libjack-0.125>
libjack-jackd2-0
libjack0
Depends: liblo7
Depends: libportaudio2
Depends: libportmidi0
Depends: libsndfile1
Depends: python3
Depends: python3
Depends: <python3:any>
python3:i386
python3
Recommends: python3-tk
Recommends: jackd2
Now, I if I try to upgrade pyo with:
python -m pip instal --user pyo==1.0.X
which takes precedence over the distro provided 1.0.0, I get the following results:
1.0.0: works
1.0.1: works
1.0.2: blows up with an error:
ALSA lib conf.c:3558:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/usr/lib/alsa-lib/libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
But then I locate libasound_module_conf_pulse.so
on my system, and work around with:
sudo ln -s /usr/lib/x86_64-linux-gnu/alsa-lib /usr/lib/alsa-lib
and then it works.
I also reported this at: https://github.com/belangeo/pyo/issues/200
1.0.3: same
Another thing worth trying is from Playing sound in pyo and python:
from pyo import *
print("Default input device: %i" % pa_get_default_input())
print("Default output device: %i" % pa_get_default_output())
print("Audio host APIS:")
pa_list_host_apis()
pa_list_devices()
and then try to select a specific device with:
s = Server()
s.setOutputDevice(0)
s.boot()
But I didn't need to do that to get it working after installing python3-pyo
.
https://github.com/belangeo/pyo/issues/200#issuecomment-734958205 explains how to get it all working with Jack.