最近把自己電腦的作業系統換成了 Linux, 也因此想尋求 Linux 下提高撥放音質的作法, 第一步就是尋找類似 SSRC 的解決方案。
可惜這方面的文件資源還不是很充實,折騰了半天才發現,原來 ALSA 本身就有這個功能!
作法: 編輯 ~/.asoundrc (本來應該不存在),內容如下:
定義一個名為 mycard 的 pcm 裝置,實體使用第一張音效卡
pcm.mycard {
type hw
card 0
device 0
}
再定義一個名稱為 ssrc (software sample rate converter ) 的 mycard 次裝置,會先轉換取樣率之後再把訊號丟給它
pcm.ssrc {
type rate
slave {
pcm mycard
rate 48000
}
}
之後拿原生支援 ALSA 的程式,選擇 ssrc 這個裝置撥放,訊號就會先轉換成 48KHz 再送到音效卡了。以我現在用的 YMF754 來說,改用這個 ssrc device 撥放的話,可以感受到音質有明顯的差異,而且應該是進步 ^^;
使用上以 XMMS 舉例來說,就是使用 ALSA 0.9 output plugin [libALSA.so] 並且 Audio device 選擇 User defined, 填入 ssrc。
在查過相關 mailing list 跟看過原始碼之後,確認 ALSA 裡頭使用的演算法只是簡單的 linear sample interpolation (線性取樣內插),表現應該沒有 Shibatch SRC 來得好 ... 可惜目前似乎還沒有人把 Shibatch SRC porting 到這邊來?
我用 RMAA 5.2 產生測試 Wave 檔,撥放之後從 Mixer 錄回來的測試結果放在這邊: http://mail.cs.nchu.edu.tw/~s9256043/Comparison.htm
P.S. 關於音量控制
alsamixer 音量控制數值的意義,每張卡都有或大或小的差異,如果用的是一般採用 AC'97 CODEC 的卡,可以試著去找找看 AC'97 CODEC 的 datasheet. 以我的卡上的 STAC9708 來說,Master volume 的範圍是 0-31, 開到 31 是無衰減輸出; PCM 的範圍也是 0-31, 但是這個要開 16 才是無衰減無增益輸出!超過 16 的話就有增益了,如果音量怎麼調都會破音 (clipping) 的話,不妨檢查看看這部份的狀況。
Hope this helps.
Linux 下,類似 SSRC 的軟體轉換取樣頻率設定法
版主: DearHoney
簡單的線性內插法怎麼有辦法跟 Shibatch SRC 的演算法相比?! XD
所以我正在研究如何把 Shibatch SRC porting 到 Linux 上面 ... 看能不能直接改寫成可以取代 ALSA rate plugin 的形式,或者是插在播放環節之內的哪個點.
不過因為最近閒暇時間不多,應該還要一陣子才能看到結果了。
--
其實現在 WINE 可以直接執行 Foobar2000 0.7.1 透過 waveOut 撥放聲音出來 ...
不考慮到 CPU usage 跟穩定性的話其實可以這麼用,在我的機器上,這樣跑起來只要把 Foobar2000 切到背景,聲音就會斷斷續續的 :Q
個人是比較希望能有 native 的解決方案,所以還是嘗試動手改寫先 ...
所以我正在研究如何把 Shibatch SRC porting 到 Linux 上面 ... 看能不能直接改寫成可以取代 ALSA rate plugin 的形式,或者是插在播放環節之內的哪個點.
不過因為最近閒暇時間不多,應該還要一陣子才能看到結果了。
--
其實現在 WINE 可以直接執行 Foobar2000 0.7.1 透過 waveOut 撥放聲音出來 ...
不考慮到 CPU usage 跟穩定性的話其實可以這麼用,在我的機器上,這樣跑起來只要把 Foobar2000 切到背景,聲音就會斷斷續續的 :Q
個人是比較希望能有 native 的解決方案,所以還是嘗試動手改寫先 ...