I am trying to experiment with HRTF audio spatialization using PyAL library on the Raspberry Pi https://github.com/NicklasTegner/PyAL/tree/master/examples/HRTF
PyAL depends on OpenAL. I have installed necessary dependencies using sudo apt-get install
to ensure the library works: libopenal-dev libopenal1 libopenal-data libmysofa-dev libmysofa0 libmysofa-utils qt5-default alsa-utils alsa-oss alsaplayer-jack g++ gstreamer1.0-python3-plugin-loader gstreamer1.0-alsa
Additionally, I installed pyglet using: sudo pip3 install pyglet
All examples (3D audio, playback, efx, audiplayer, player) work except the HRTF example. When I try to run the HRTF example, I get the following error:
AL lib: (EE) ALCplaybackAlsa_reset: snd_pcm_hw_params(self->pcmHandle, hp) failed: File descriptor in bad state
I know for a fact that this is being caused by PulseAudio not being present in the system (https://unix.stackexchange.com/questions/467193/error-while-running-the-gstreamer-example-on-development-kit-file-descriptor). So I installed pulseaudio and its corresponding tools (e.g. pavucontrol
using sudo apt-get install pulseaudio
.
After installing pulseaudio and rebooting, when I run that example, the example executes without error. However, I do not hear any audio output in the headphones. In fact, audio output from the entire system stops. I made sure the audio output is headphones from sudo raspi-config
and alsamixer does show pulseaudio as a audio driver (when it is installed).
I am getting conflicting information from the Internet. The above link suggests using pulseaudio to mitigate the error (which is correct), whereas this link: https://www.youtube.com/watch?v=stvc7ehCWUU and https://raspberrypi.stackexchange.com/questions/1621/no-sound-output-in-vlc say to remove pulseaudio (which is also correct in the sense it brings my audio back but I can't run the HRTF example).
Any suggestions?
This is very odd, but I solved the problem by connecting a cheap external USB audio card (https://www.amazon.com/gp/product/B00IRVQ0F8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1). Apparently, ALSA keeps control of 3.5mm jack and doesn't surrender control to Pulseaudio of that jack. Simplest solution is to use an external audio card.