Open Sound System
Open Sound System (OSS) 是 Linux 的原始 声音系统。
它已被 Advanced Linux Sound Architecture (ALSA) 所取代,ALSA 在许多方面优于 OSS。
- 对 USB 音频设备的更好支持。
- OSS 对 USB 音频设备有实验性的输出支持,但没有输入。
- 对蓝牙音频设备的支持。
- 对 AC'97 和 HD Audio 拨号 软调制解调器 的支持。
- 对 MIDI 设备的更好支持。
- OSS 在软件合成器(如 Timidity 或 FluidSynth)的帮助下支持 MIDI 设备。
- 对挂起模式的支持。
- 对插孔检测的更好支持。
安装
安装 ossAUR 包,或带有非免费驱动程序的包 oss-nonfreeAUR。
这将安装 OSS,运行 OSS 安装脚本(暂时禁用 ALSA 模块)并安装 OSS 内核模块。由于 ALSA 默认启用,您需要禁用它,以免与 OSS 冲突。您可以通过 黑名单 soundcore 模块来实现。
在黑名单化模块后,您可以 启用 oss.service 以在启动时启动。
要开始使用 OSS 而无需重启,请检查是否仍有 ALSA 模块加载(ALSA 模块以“snd”开头)。
# lsmod | grep snd
如下卸载 ALSA 模块:
# lsmod | awk ' { print $1 } ' | grep snd | xargs rmmod
然后重启 OSS。
# soundoff && soundon
要完全从您的系统中删除 ALSA,您可以编译一个 自定义内核 并在其配置中禁用 ALSA。有关详细信息,请参阅 Gentoo:ALSA#Kernel。
如果您不属于 audio 组,请添加您自己并重新登录以使更改生效。
# gpasswd -a $USER audio
如果 OSS 在启动时无法检测到您的声卡,请运行:
# ossdetect -v # soundoff && soundon
测试
通过运行以下命令来测试 OSS:
$ osstest
在测试过程中您应该能听到音乐。如果没有音频,请尝试调整音量或参考 #故障排除 部分。
如果您想同时听到多个应用程序的声音,则需要 OSS 的软件混音器 vmix。
通过运行以下命令检查 vmix 是否已启用:
$ ossmix -a | grep -i vmix
您应该会看到类似 vmix0-enable ON|OFF (currently ON) 的行。如果您没有看到任何以 vmix 开头的行,则可能意味着 vmix 未附加到您的声卡。要附加 vmix,请发出命令:
$ vmixctl attach device
其中 device 是您的声卡设备,例如 /dev/oss/oss_envy240/pcm0。
为了避免将来手动发出此命令,您可以将其添加到 /usr/lib/oss/soundon.user,如 官方文档 所建议。
如果您收到 "Device or resource busy" 错误,您需要在 /usr/lib/oss/conf/osscore.conf 中添加 vmix_no_autoattach=1,然后重新启动。
通过运行以下命令查看检测到的设备:
$ ossinfo
您应该能在 Device Objects 或 Audio Devices 下看到您的设备列表。如果想要使用的设备不在这些部分的顶部,您必须编辑 /usr/lib/oss/etc/installed_drivers 并将您设备的驱动程序放在最前面。可能需要重启 OSS。
# soundoff && soundon
如果这不起作用,请注释掉除您设备驱动程序以外的所有驱动程序。
音量控制混音器
要控制各种设备的音量,需要设置混音器级别。有两个混音器:
- ossmix
- 一个命令行混音器,类似于 BSD 的音频混音器
mixerctl。 - ossxmix
- 一个基于 GTK 的图形混音器。
颜色定义
对于高清 (HD) 音频,ossxmix 将根据其预定义的插孔颜色对插孔配置进行着色:
| 颜色 | 类型 | 连接器 |
|---|---|---|
| 绿色 | 前面板通道(立体声输出) | 3.5mm TRS |
| 黑色 | 后面板通道(立体声输出) | 3.5mm TRS |
| 灰色 | 侧面通道(立体声输出) | 3.5mm TRS |
| 金色 | 中心和低音炮(双输出) | 3.5mm TRS |
| 蓝色 | 线路电平(立体声输入) | 3.5mm TRS |
| 粉色 | 麦克风(单声道输入) | 3.5mm TS |
保存混音器级别
关闭计算机时会保存混音器级别。如果您想立即保存混音器级别,请以 root 身份执行:
# savemixer
savemixer 可用于使用 -f 开关将混音器级别写入文件,并使用 -L 开关进行恢复。
其他混音器
支持 OSS 的其他混音器:
- Gnome Volume Control — 用于 GNOME。
- Kmix — 用于 KDE。
配置应用程序以使用 OSS
基于 GStreamer
如果您在使用 GStreamer 进行音频处理的应用程序时遇到问题,可以尝试卸载 pulseaudio 并安装 oss4sink 和 oss4src 所需的 gst-plugins-good 包。
基于 OpenAL
默认情况下,OpenAL 使用 ALSA。要更改此设置,只需在 /etc/openal/alsound.conf 中定义 OSS 的使用即可。
/etc/openal/alsound.conf
drivers=oss
Audacity
如果 Audacity 启动但抱怨无法打开设备或根本不播放任何内容,则您可能正在使用 vmix,这会阻止 Audacity 独占访问您的声卡。要解决此问题,在运行 Audacity 之前,请运行:
$ ossmix vmix0-enable OFF
关闭 Audacity 后,可以使用以下命令恢复 vmix:
$ ossmix vmix0-enable ON
Gajim
默认情况下,Gajim 使用 aplay -q 来播放声音。对于 OSS,您可以通过转到 Edit > Preferences > Advanced,打开 Advanced Configuration Editor 并相应地修改 soundplayer 变量,将其更改为等效的 ossplay -qq。
MOC
要将 MOC 与 OSS v4.1 一起使用,您必须在配置文件(位于 ~/.moc)中将 OSSMixerDevice 更改为 /dev/ossmix。对于界面问题,尝试在 mocp 中按 w (切换到软件混音器)来更改 OSSMixerChannel。
MPD
MPD 通过 /etc/mpd.conf 或 ~/.mpdconf 进行配置。检查这两个文件,查找类似以下内容的配置:
/etc/mpd.conf
...
audio_output {
type "alsa"
name "Some Device Name"
}
...
如果您发现类似上面注释掉(行不以 # 开头)的 ALSA 配置,请将其全部注释掉或删除,然后添加以下内容:
/etc/mpd.conf
...
audio_output {
type "oss"
name "My OSS Device"
}
...
可能并非所有用户都需要进一步配置。但是,如果您遇到问题(例如 MPD 重启后无法正常工作),或者您喜欢拥有特定的(即更多用户配置、更少自动配置的)配置文件,则可以通过查找声卡标识符来更具体地配置 OSS 的音频输出:
$ ossinfo | grep /dev/dsp
查找类似 /dev/dsp -> /dev/oss/CARD_IDENTIFIER/pcm0 的行。记下您的 CARD_IDENTIFIER,并将以下行添加到您的 MPD 配置文件的 OSS audio_output 中:
/etc/mpd.conf
...
audio_output {
type "oss"
name "My OSS Device"
device "/dev/oss/<SOME_CARD_IDENTIFIER>/pcm0"
mixer_device "/dev/oss/<SOME_CARD_IDENTIFIER>/mix0"
}
...
另请参阅:Music Player Daemon#System-wide configuration。
MPlayer
如果您使用的是 GUI(SMplayer、GNOME MPlayer 等),您可以在设置对话框中选择 OSS 作为默认输出。如果您从命令行使用 MPlayer,您应该指定音频输出:
$ mplayer -ao oss /some/file/to/play.mkv
如果您不想每次都输入它,请在配置文件(位于 ~/.mplayer/config)中添加 ao=oss。
另请参阅:MPlayer#Configuration。
VLC 媒体播放器
您可以在音频设置中选择 OSS 作为默认输出。
Wine
要设置 Wine 中的 OSS 支持,请启动:
$ winecfg
然后转到 Audio 选项卡并选择 OSS Driver。
另请参阅:Wine#Sound。
其他应用程序
- 如果您无法从此处未列出的应用程序获得声音,请尝试查看 Configuring Applications for OSSv4 页面。
- 使用 pacman 或在 AUR 中搜索 OSS 特定的包。
另请参阅:ossapps。
技巧与提示
更方便、更精确的音量控制
ossxmix 的音量滑块非常小,使得精细控制音量变得困难。
运行 ossmix 以找到您想要控制的控件(参考 ossxmix),例如 codec1.jack.green.front。
将以下命令绑定到桌面环境的 键盘快捷键。
将音量增加 1(音量可在 0 到 100 之间)
$ ossmix codec1.jack.green.front +1
将音量减少 1(某些系统需要 --,以避免将 -1 误认为是参数。)
$ ossmix -- codec1.jack.green.front -1
然后您就可以轻松控制音量了。
键盘音量控制
静音/取消静音和增加/减少音量的便捷方法是使用 ossvol 脚本。
下载脚本并将其放置在 /usr/bin/ossvol。
安装后,键入:
$ ossvol -t
切换静音,或
$ ossvol -h
查看可用命令。
ossvol 出现类似 Bad mixer control name(987) 'vol' 的错误,您需要编辑脚本并将 CHANNEL 变量更改为您默认的通道(通常是 vmix0-outvol)。如果您想使用带 ossvol 的多媒体键,请将以下命令 映射 到您的音量键:XF86AudioRaiseVolume、XF86AudioLowerVolume 和 XF86AudioMute。
静音/取消静音音量
$ ossvol -t
减小音量
$ ossvol -d 2
增大音量
$ ossvol -i 2
更改采样率
更改输出采样率起初并不明显。采样率只能由 root 更改,并且在请求更改时 vmix 不能被任何程序使用。在执行任何这些步骤之前,请确保您是通过接收器/放大器连接并使用高质量扬声器,而不是简单的电脑扬声器。如果您只使用电脑扬声器,则无需更改此处的内容,因为您不会注意到任何区别。
默认采样率为 48000Hz。在某些情况下,您可能希望更改此设置。这完全取决于您的使用模式。您希望使用的采样率匹配您使用最多的媒体。如果您的计算机必须更改媒体的采样率以适应硬件,音频质量可能会(但不保证)有所下降。这在降采样(例如 96000Hz → 48000Hz)时最为明显。有一篇关于此问题的 Stereophile 文章,该文章已在 Apple 的 CoreAudio API 邮件列表中 讨论 过,如果您想了解更多关于此问题的信息。
一些示例采样率:
- 44100Hz
- 标准 Red Book 音频 CD 的采样率。
- 88000Hz
- SACD 高清音频光盘/下载的采样率。您的主板很少支持此采样率。
- 96000Hz
- 大多数高清音频下载的采样率。如果您的主板是 AC'97 主板,这可能是您的最高比特率。
- 192000Hz
- 蓝光以及一些(极少数)高清下载的采样率。对外部音频接收设备的支援仅限于高端音频。并非所有主板都支持此功能。支持此功能的主板芯片组示例包括 HD Audio。
要检查您当前的采样率设置,请运行:
$ ossmix | grep rate
您可能会看到 vmix0-rate <十进制值> (currently 48000) (Read-only)。
如果您看不到 vmix0-rate(或 vmix1-rate 等)输出,则可能意味着 vmix 已禁用。在这种情况下,OSS 将使用请求设备的程序的速率,因此本节不适用。Envy24(和 Envy24HT)卡是一个例外,它有一个特殊的设置 envy24.rate,具有类似的功能(请参阅 oss_envy24 手册页)。
更改您的采样率:
- 首先,确保您的声卡能够使用新的速率。运行
ossinfo -v2并查看 Native sample rates 输出中是否包含所需的速率。 - 以 root 身份运行
/usr/lib/oss/scripts/killprocs.sh。请注意,这将关闭任何当前打开了音频通道的程序。 - 终止了所有占用
vmix的程序后,以 root 身份运行:vmixctl rate /dev/dsp 96000,将速率替换为您想要的采样率(如果适用,还运行ossmix envy24.rate 96000)。 - 运行
ossmix | grep rate并检查vmix0-rate <十进制值> (currently 96000) (Read-only)是否显示,以查看您是否成功。 - 要使更改永久生效,请将以下内容添加到
soundon.user文件中:
/usr/lib/oss/soundon.user
#!/bin/sh vmixctl rate /dev/dsp 96000 # ossmix envy24.rate 96000 # uncomment if you have an Envy24(HT) card exit 0
并使其 可执行。
禁用虚拟混音和 COOKEDMODE 以减少失真
vmix 是一个虚拟混音器音频,可以混合多个音频流,但可能降低音质。简单地在 OSS Mixer GUI 中取消勾选 vmix-things 并不总是有用。
关闭 COOKEDMODE 以禁用所有应用程序和设备的格式转换。
编辑以下内容:
/usr/lib/oss/conf/osscore.conf
cooked_enable=0 vmix_disabled=1
如果遇到错误,请重启 oss.service 或您的计算机。
之后,您仍然可以通过 ossmix 或 ossxmix 控制音量。
启动时将 ossxmix 停靠到系统托盘
KDE
在您的本地应用程序启动器目录(~/.local/share/applications/)中创建一个名为 ossxmix.desktop 的应用程序启动器文件,内容如下:
~/.local/share/applications/ossxmix.desktop
[Desktop Entry] Name=Open Sound System Mixer GenericName=Audio Mixer Exec=ossxmix -b Icon=audio-card Categories=Application;GTK;AudioVideo;Player; Terminal=false Type=Application Encoding=UTF-8
要让它与您的系统一起自动启动,请将其添加到 System Settings > System Administration > Startup and Shutdown > Autostart 的列表中。
GNOME
以 root 身份创建一个文件 /usr/local/bin/ossxmix_bg,内容如下:
/usr/local/bin/ossxmix_bg
#!/bin/sh exec /usr/bin/ossxmix -b
然后转到 System > Preferences > Start Up Applications 并:
- 点击 Add,在 Name 字段中输入
OSSMIX,在 Command 字段中输入/usr/local/bin/ossxmix_bg,然后点击 Add Button。 - 登录和注销以查看更改。
录制程序的音频输出
请参阅上游文章 Recording sound output of a program。
挂起和休眠
OSS 不自动支持挂起,必须在挂起或休眠前手动停止,并在之后重新启动。
OSS 提供 soundon 和 soundoff 来启用和禁用 OSS,尽管它们仅在所有使用音频的进程终止后才停止 OSS。
以下脚本是一种相对基础的方法,可以在挂起前自动卸载 OSS,并在之后重新加载。
/usr/lib/systemd/system-sleep/50osssound.sh
#!/bin/sh
suspend_osssound()
{
/usr/lib/oss/scripts/killprocs.sh
/usr/bin/soundoff
}
resume_osssound()
{
/usr/bin/soundon
}
case $1 in
pre)
suspend_osssound
;;
post)
resume_osssound
;;
*) exit $NA
;;
esac
将此脚本的内容(以 root 身份)保存到 /usr/lib/systemd/system-sleep/50osssound.sh 并使其 可执行。
这样,您的所有应用程序都应该没问题。
更改默认音频输出
运行 osstest 时,第一个测试通道通过,但立体声或右通道不通过,声音会失真/嘶嘶作响。如果您的声音就是这样,则表示它设置为错误的输出。
*** Scanning sound adapter #-1 *** /dev/oss/oss_hdaudio0/pcm0 (audio engine 0): HD Audio play front - Performing audio playback test... <left> OK <right> OK <stereo> OK <measured srate 47991.00 Hz (-0.02%)>
左声道听起来不错,右声道和立体声声道则有失真。
让测试继续,直到您获得可用的输出:
/dev/oss/oss_hdaudio0/spdout0 (audio engine 5): HD Audio play spdif-out - Performing audio playback test... <left> OK <right> OK <stereo> OK <measured srate 47991.00 Hz (-0.02%)>
如果所有左、右和立体声通道的测试都通过,则继续下一步。
要更改默认输出的命令,请参阅上游的 Wiki 文章。将其更改为您适用的设置,例如:
# ln -sf /dev/oss/oss_hdaudio0/spdout0 /dev/dsp_multich
对于环绕声(4.0-7.1),请选择 dsp_multich;对于仅 2 声道,dsp 就足够了。有关所有可用设备,请参阅 此处。
ALSA 模拟
您可以指示 alsa-lib 使用 OSS 作为其音频输出系统。这可以作为一种 ALSA 模拟。
但请注意,此方法可能会在您的音频输出中引入额外的延迟,并且模拟不完整,不能与所有应用程序一起使用。例如,它不能与尝试使用 ALSA 检测设备的程序一起使用。
因此,由于大多数应用程序直接支持 OSS,请仅将此方法作为最后的手段。
未来,可能会有更完整的模拟 ALSA 的方法,例如 libsalsa 和 cuckoo。
操作指南
- 安装 alsa-plugins 包。
- 如下编辑
/etc/asound.conf:
pcm.oss {
type oss
device /dev/dsp
}
pcm.!default {
type oss
device /dev/dsp
}
ctl.oss {
type oss
device /dev/mixer
}
ctl.!default {
type oss
device /dev/mixer
}
/etc/asound.conf 中的更改。特定驱动程序的设置
如果某些功能不起作用,则您的某些 OSS 设置可能特定于驱动程序,或者对于您的驱动程序来说是错误的。
要解决此问题:
- 找出使用的驱动程序。
$ lspci -vnnd ::04xx
00:1e.2 Multimedia audio controller [0401]: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller [8086:266e] (rev 03) Subsystem: Hewlett-Packard Company NX6110/NC6120 [103c:099c] Flags: bus master, medium devsel, latency 0, IRQ 21 I/O ports at 2100 [size=256] I/O ports at 2200 [size=64] Memory at d0581000 (32-bit, non-prefetchable) [size=512] Memory at d0582000 (32-bit, non-prefetchable) [size=256] Capabilities: <access denied> Kernel driver in use: *oss_ich* Kernel modules: snd-intel8x0
- 在此处找到设备的配置文件:
# cd /usr/lib/oss/conf/
- 尝试更改默认设置。只有少数设置,而且它们都一目了然。
例如,设置
ich_jacksense = 1
在 oss_ich.conf 中启用 jack-sense(负责识别插入的耳机并静音扬声器)。有关 jack-sense 的其他设置可以在 hdaudio.conf 中找到,您需要更改 hdaudio_jacksense 变量。
- 为使更改生效,请重启
oss.service。
故障排除
故障排除 HD Audio 设备
理解问题
如果您有 HD Audio 声卡,那么在您的音频工作之前,很有可能需要调整一些混音器设置。
HD Audio 设备功能强大,因为它们可能包含许多小型电路(称为 widgets),这些电路可以随时通过软件进行调整。这些控件暴露给混音器,例如,它们可用于将耳机插孔转变为音频输入插孔而不是音频输出插孔。
然而,也存在一些不良副作用,主要原因是 HD Audio 标准比它应该的更灵活,并且供应商通常只关心让他们的官方驱动程序正常工作。
在使用 HD Audio 设备时,您经常会发现混音器控件混乱,默认情况下根本不起作用,并且您被迫尝试所有可能的混音器控件组合,直到它工作为止。
解决方案
打开 ossxmix 并尝试更改中间区域中的每个混音器控件,该区域包含声卡特定的控件,如 #音量控制混音器 部分所述。
您可能希望设置一个程序在后台连续录制/播放(例如,录制使用 ossrecord - | ossplay -,播放使用 osstest -lV),同时在前台更改 ossxmix 中的混音器设置。
- 提高每个音量控制滑块。
- 在每个选项框中,尝试更改选定的选项,尝试所有可能的组合。
- 如果您听到噪音,请尝试降低和/或静音一些音量控件,直到找到噪音源。
- 编辑
/usr/lib/oss/conf/oss_hdaudio.conf,取消注释并将hdaudio_noskip=0更改为 0-7 中的某个值,可以在ossxmix中获得更多插孔选项。
Totem 中的 MMS 音频破裂
如果在播放 MMS 流时在 Totem 中听到各种破裂声或奇怪的声音,您可以尝试使用其他后端,例如 FFmpeg。这不会解决 GStreamer 在播放 MMS 流时出现的某些问题,但它会为您提供以良好音质播放它的选项。在 MPlayer 中播放很简单:
# mplayer mmsh://yourstreamurl
麦克风通过输出通道播放
默认情况下,OSS 会通过扬声器播放麦克风。要在 ossxmix 中禁用此功能,请找到“Misc”部分并取消勾选每个“input-mix-mute”框。
添加额外的 HD Audio 声卡支持
OSS 提供了一个“通用”编解码器驱动程序,该驱动程序应该能够解析 99% 的 HDAudio 编解码器。
如果设备未列在 oss_hdaudio.c 源文件中,请将它们添加到其中,重新编译并启动驱动程序。
要查找“Multimedia controller”设备类别的 设备/供应商 ID,请执行以下操作:
$ lspci -nnd ::04xx
00:1f.3 Audio device [0403]: Intel Corporation Sunrise Point-H HD Audio [8086:a170] (rev 31)
在此示例中,“Vendor ID”是“8086”,“Device ID”是“a170”。
在源文件中更改 5 行代码,以“最新源代码包”(目前是“oss-v4.2-build2020-src-gpl.tar.bz2”)为例:
oss-v4.2-build2020-src-gpl/devlists/Linux
oss_hdaudio pci8086,a170 Intel High Definition Audio (PCH_C)
oss-v4.2-build2020-src-gpl/kernel/drv/oss_hdaudio/.devices
oss_hdaudio pci8086,a170 Intel High Definition Audio (PCH_C)
oss-v4.2-build2020-src-gpl/kernel/drv/oss_hdaudio/oss_hdaudio.c
#define INTEL_DEVICE_PCH_C 0xa170
case INTEL_DEVICE_PCH_C: #Don't add it, it's already there
最好修改现有的“Controller”(在此示例中是 "PCH_C"),追加新的一行代码可能会失败。是否是 PCH_C 并不重要。
最后一行代码有点复杂。此示例是 ALC1150 声卡芯片。“ALC1150”的“Vendor_id”是“0x10ec0900”,您可以通过搜索引擎获取,或者尝试以下方法:
# cat /sys/class/sound/card0/device/hdaudioC0D0/vendor_id
0x10ec0900
# cat /sys/class/sound/card0/device/sound/card0/hwC0D0/vendor_id
0x10ec0900
对于不同制造商的声卡芯片,需要修改不同的段落。在示例中,是 Realtek 制造商的段落:
oss-v4.2-build2020-src-gpl/kernel/drv/oss_hdaudio/hdaudio_codecids.h
{0x10ec0889, "ALC889", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0900, "ALC1150", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0899, "ALC899", VF_ALC88X_HACK, (char **) &alc883remap},
在示例硬件上,修改倒数第二行代码有效,但修改倒数第一行相同的代码则失败,这一点非常重要。您需要尝试在不同行上反复修改相同的代码,才能在您的硬件上成功。
例如,在倒数第四行尝试:
{0x10ec0887, "ALC887", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0900, "ALC1150", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0889, "ALC889", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0892, "ALC892", VF_ALC88X_HACK, (char **) &alc883remap},
{0x10ec0899, "ALC899", VF_ALC88X_HACK, (char **) &alc883remap},
- 编译 OSS 所需的依赖包无需单独安装,base-devel 元包提供了创建包的工具。
- 您还需要安装用于 编译内核模块 的工具包,这些模块在安装阶段构建。