在 Linux 系統中,Open Sound System (OSS) 提供了底層的音訊裝置存取介面。本文將詳細解析如何透過 /dev/mixer 裝置檔案,利用 ioctl 系統呼叫來實作音量控制功能。這對於嵌入式系統開發、音訊驅動程式編寫以及底層多媒體應用開發具有重要參考價值。
程式碼首先定義了音效裝置名稱陣列 SOUND_DEVICE_NAMES,包含如 vol、bass、treble、synth、pcm、speaker、line、mic、cd、mix、pcm2、rec、igain、ogain、line1、line2、line3、dig1、dig2、dig3、phin、phout、video、radio、monitor 等標準混音器通道。
O_RDONLY 模式開啟 /dev/mixer,取得檔案描述符 fd。SOUND_MIXER_READ_DEVMASK 與 SOUND_MIXER_READ_STEREODEVS 兩個 ioctl 指令,分別取得系統支援的混音器裝置位元遮罩 devmask 與立體聲裝置遮罩 stereodevs。devmask 中查找指定裝置是否存在。level = (right << 8) | left,呼叫 MIXER_WRITE(device) ioctl 設定音量。若該裝置非立體聲卻傳入不同左右聲道值,會發出警告。devmask 與 stereodevs 皆為位元遮罩,第 i 位對應 SOUND_DEVICE_NAMES[i],利用 (1 << i) & mask 判斷裝置是否支援。perror 輸出錯誤訊息並結束程式。# 將主音量設為 80%
./mixer vol 80
# 將 PCM 左聲道 70%、右聲道 60%
./mixer pcm 70 60
現代 Linux 發行版多已遷移至 ALSA (Advanced Linux Sound Architecture) 架構,OSS 介面透過 snd-pcm-oss 相容模組提供。開發新專案建議直接使用 ALSA API (libasound) 或 PulseAudio/PipeWire 等上層音訊伺服器介面,以獲得更好的相容性與功能支援。