• 首页
  • 文件
  • 下载
  • 状态
  • 常见问题
  • 邮件列表
  • 应用程序
  • 外部链结
  • 版权
  • 志愿者
  • 联络

示范程序:控制音量


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