示范程序:控制音量
音量控制其实有不少种层次,系统层次、独佔层次及应用程序层次,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