範例程式:控制音量
音量控制其實有不少種層次,系統層次、獨佔層次及應用程式層次,CIOS音訊核心的音量控制基本上是應用程式層次,其他層次 的音量控制是不處理的,請不要使用CIOS音訊核心作為系統的音量控制元件。
並非所有的音訊驅動介面都支援「音訊輸出音量控制」及「音訊輸入音量控制」,某些驅動介面只支援「音訊輸出音量控制」。
判斷是否可以控制音量
由於實際上許多音訊驅動介面是不支援音量控制的,因此必須要有判斷的函式:Stream類別
virtual bool hasVolume (void) = 0 ;Stream類別是音訊驅動介面當中實際實作音量控制的函式,所有的音訊驅動介面都必須繼承並實作這個函式,但是我們並不建 議您直接使用它。
Core類別
virtual bool hasVolume (Stream * stream) ;我們建議您使用這個函式來判斷是否有音量控制功能的存在。
音量控制函式
音量控制一共有四個函式:virtual CaVolume MinVolume (Stream * stream) ;
virtual CaVolume MaxVolume (Stream * stream) ;
virtual CaVolume Volume (Stream * stream,int atChannel = -1) ;
virtual CaVolume setVolume (Stream * stream,CaVolume volume,int atChannel = -1) ;
CIOS Audio Core的音量控制是線性的,某些底層的音訊驅動介面本身是以分貝作為音量單位,例如Core Audio。在CIOS Audio Core當中已經全部都轉換成線性的音量單位。一般而言,音量單位介於0.0~10000.0,雙精度浮點數,但是您不應該假設這一定是完全正確的,原作 者會盡量控制所有的音訊驅動介面的音量都是0.0~10000.0之間,但是並不保證其他人的實作會依照這個範圍來實踐。
範例程式
音量控制必須在音訊串流開始啟動以後才會真的有效,音訊串流啟動之前,所有對音量的控制都是無效的。Core * core ;
Stream * stream ;
...
Initialize core
Inialize stream
Start stream
....
if ( core->hasVolume ( stream ) ) {
double minv = core->MinVolume(stream) ;
double maxv = core->MaxVolume(stream) ;
double volume = core->Volume(stream) ; // 平均音量
double v1 = core->Volume(stream,0) ; // 左聲道音量
double v2 = core->Volume(stream,1) ; // 右聲道音量
...
convert into your own volume measurement
...
core->setVolume(stream,volume) ; // 設定所有聲道的音量
core->setVolume(stream,v1,0) ; // 設定左聲道的音量
core->setVolume(stream,v2,1) ; // 設定右聲道的音量
...
}
....
Stop stream
Close stream
Terminate core