source code
Tclsndfile:
source code
Tcl/Tk 已經有二個 audio extension 可以使用,一個是 Snack,一個是 SDL_mixer bindings for Tcl。
Snack 其實原作者看起來已經沒有什麼更新,不過 Tcl/Tk 社群仍然有人持續在維護,是一個很普遍的套件。
我寫 tcllibao 和 tclsndfile 只是為了探索 Linux audio library 的使用方式。libsndfile 是讀取檔案以後拿到音訊資料,而 libao 用來將聲音輸出(還有其它的 library 可以用,例如 SDL_mixer)。
要注意的是,libao 使用 GPL 授權,所以我 tcllibao 使用同樣的授權方式。同樣的,libsndfile 使用 LGPL 授權,tclsndfile 我也使用同樣的授權方式。
下面就是我的測試程式:
#!/usr/bin/tclsh
#
# Using libao and libsndfile to play a wav/ogg file
#
package require libao
package require sndfile
if {$argc > 0} {
set name [lindex $argv 0]
} else {
puts "Please input filename."
exit
}
if {[catch {set data [sndfile snd0 $name READ]}]} {
puts "sndfile: read file failed."
exit
}
set encoding [dict get $data encoding]
# only for test seek
snd0 seek 0 SET
libao::ao initialize
set id [libao::ao default_id]
set bits 16
switch $encoding {
{pcm_16} {
set bits 16
}
{pcm_24} {
set bits 24
}
{pcm_32} {
set bits 32
}
{pcm_s8} {
set bits 8
}
{pcm_u8} {
set bits 8
}
default {
set bits 16
}
}
libao::ao open_live $id -bits $bits \
-rate [dict get $data samplerate] \
-channels [dict get $data channels] -byteformat 4
# libao needs use read_short to get data
while {[catch {set buffer [snd0 read_short]}] == 0} {
libao::ao play $buffer
}
snd0 close
libao::ao close
libao::ao shutdown
更新: 我發現 tclsndfile README.md 我有打錯說明,所以刪掉重新建了一個新的上去 github。
2016/12/12
嘗試在 Windows 7 (64bit) 使用 MSYS2/MinGW-W64 編譯與使用測試,我把遇到的問題跟解法記錄在 github README.md。
沒有留言:
張貼留言