Ubuntu 20.04使用OpenAL-Soft无法打开音频设备问题求助
问题背景
- 运行环境:Ubuntu 20.04,音频编程入门场景,选用OpenAL-Soft作为音频开发库
- 测试代码核心逻辑为打开默认音频设备,代码如下:
ALCdevice* p_ALCDevice = alcOpenDevice( nullptr ); //nullptr = gets default device if( !p_ALCDevice ) throw( "failed to get sound device" );
- 运行代码直接触发异常,错误输出如下:
[ALSOFT] (WW) Failed to open playback device: Could not open /dev/dsp: No such file or directory [ALSOFT] (WW) Error generated on device (nil), code 0xa004 terminate called after throwing an instance of 'char const*' Aborted (core dumped)
- 初步排查:调用设备枚举接口打印可用设备列表,代码如下:
const ALCchar * devices = alcGetString( NULL, ALC_DEVICE_SPECIFIER ); printf( "%s", devices );
打印结果仅输出OpenAL Soft,无法识别到系统真实音频设备。
- 后续尝试自行通过cmake编译安装OpenAL-Soft,配置阶段日志显示存在大量依赖缺失,编译安装完成后故障依旧,cmake配置日志核心片段如下:
- Checking for module 'dbus-1' -- No package 'dbus-1' found -- Could NOT find DBus1 (missing: DBus1_INCLUDE_DIRS DBus1_LIBRARIES) -- Checking for module 'libpipewire-0.3>=0.3.23' -- No package 'libpipewire-0.3' found -- Could NOT find AudioIO (missing: AUDIOIO_INCLUDE_DIR) -- Could NOT find OpenSL (missing: OPENSL_LIBRARY OPENSL_INCLUDE_DIR OPENSL_ANDROID_INCLUDE_DIR) -- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR) -- Could NOT find MySOFA (missing: MYSOFA_LIBRARY MYSOFA_INCLUDE_DIR) -- Could NOT find Qt5Widgets -- Could NOT find SndFile (missing: SNDFILE_LIBRARY SNDFILE_INCLUDE_DIR) -- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR) -- -- Building OpenAL with support for the following backends: -- ALSA, OSS, SndIO (linked), PortAudio, PulseAudio, JACK, WaveFile, Null -- -- Building with support for CPU extensions: -- Default, SSE, SSE2, SSE3, SSE4.1 -- -- Embedding HRTF datasets -- -- Installing library and headers -- Installing sample configuration -- Installing HRTF data files -- Installing AmbDec presets -- -- Building utility programs -- -- Building example programs -- -- Configuring done -- Generating done -- Build files have been written to: /home/brian/openal-soft/build
故障根因
- 报错里提到的
/dev/dsp是老旧OSS音频框架的设备节点,Ubuntu 20.04默认已不再启用OSS框架,该节点默认不存在。自行编译的OpenAL-Soft默认后端优先级配置把OSS排在靠前位置,探测时尝试打开该节点失败直接抛出错误。 - 编译时大量音频后端依赖缺失,虽然配置日志显示标记了支持ALSA、PulseAudio等适配Ubuntu 20.04的音频后端,但实际运行时无法正常加载对应后端模块,无法识别到系统真实音频设备,枚举设备时仅能返回内置的虚拟后端标识
OpenAL Soft。
可行解决方案
按优先级从高到低尝试:
- 优先使用Ubuntu官方源预编译的OpenAL-Soft包,无需自行编译。执行以下命令安装适配当前系统版本的库文件:
官方源的包已经提前适配Ubuntu 20.04的PulseAudio音频栈,后端优先级配置正确,不会优先探测OSS设备。sudo apt update sudo apt install libopenal1 libopenal-dev - 如果必须保留自行编译的版本,先装全所有音频后端的开发依赖,再重新编译:
装完依赖后重新执行cmake,确认ALSA、PulseAudio后端的依赖探测无缺失,再完成编译安装流程。sudo apt install libasound2-dev libpulse-dev libdbus-1-dev libsndfile1-dev - 临时绕过问题可在运行程序前指定OpenAL加载的音频后端,跳过OSS探测:
该环境变量会强制OpenAL优先加载PulseAudio、ALSA后端,不会尝试访问export ALSOFT_DRIVERS=pulse,alsa ./your_test_program/dev/dsp节点。 - 排查系统音频服务状态,执行
pactl info确认PulseAudio服务正常运行,如果返回错误,执行以下命令重启用户级音频服务:
确保当前用户有权限访问音频设备节点。systemctl --user restart pulseaudio
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

