2.4 音频CD
CD是目前正在被广泛使用的一种高效信息存储系统,它从最初起步到逐步成熟大约经历了十年左右的时间,期间涌现出来的行业标准和技术规范非常多,而影响最大的当数由Philips和Sony公司共同推出的CD音频(CD-Audio)和CD数字音频(CD-DA)规范,这就是人们经常提到的红皮书,它被包含在IEC 908标准中。
音频CD有足够的能力来提供高保真的声音,它的采样频率为44.1kHz,并且每个采样点都使用16 bit的量化级,这样CD播放器在输出音频数据时的速率将高达1.4 Mbps[7]。除了最重要的音频数据之外,为了进行必要的纠错、同步或者调制,还需要在CD上存储其它一些额外数据,因此存储在光盘上的数据通常是原来的3倍左右,也就是说信道比特率(从CD中读出数据的速率)可能会达到4.3128 Mbps。
精密的光学设计和高效的数据编码,是CD具有很高存储密度的原因所在,而要想在Linux应用程序中对音频CD进行控制,关键是要理解音频数据在光盘上的编码方法和存储形式。音频CD采用EFM调制来对要存储的数据进行编码,虽然在调制过程中会产生需要额外存储的信道比特,但总的效果却可以使音频CD的容量提高25%左右。帧(frame)是在音频CD上可以读取的最小单位,它详细规定了音频数据、校验位、同步位、子码等是如何在光盘上存储的,如图1所示:
图1 CD的帧格式
音频CD上的每帧数据中都包含一个8 bit的子码,其中包含的信息有音轨的起止位置、音轨数目、光盘时钟、索引位置等[8],如果能够在程序中充分地利用它们,无疑将会更好地控制音频CD的播放。
2.5 设备控制之ioctl系统调用
Linux内核将所有的硬件设备都表示成设备文件,并且提供与操作磁盘文件类似的方法来操作硬件设备[9],应用程序如果想对CD驱动器进行控制,最直接的办法是用open()、read()、close()等系统调用来操作/dev/cdrom这一设备文件。例如,下面的命令可以读取CD上的原始数据流,并将其在终端上显示出来:
cat /dev/cdrom;
在Linux上进行CD编程的原理其实非常简单,关键是要借助系统调用ioctl()[10-14]来对设备文件/dev/cdrom进行各种控制。对控制CD的ioctl命令的一般参数如下表1所示:
表1 控制CD的ioctl命令
名称 参数 作用
CDROMEJECT 无 退出驱动器中的光盘
CDROMEJECT_SW 0或1 控制是否自动退出光盘
CDROMSTART 无 启动CD驱动器的马达
CDROMPLAYTRKIND Struct cdrom_ti 播放指定的音轨
CDROMPLAYMSF Struct cdrom_msf 播放指定的MSF
CDROMSTOP 无 停止播放
CDROMPAUSE 无 暂停播放
CDROMRESUME 无 继续播放
CDROMVOLCTRL Struct cdrom_volctrl 设置音量
CDROMVOLREAD Struct cdrom_volctrl 获取当前音量
CDROMREADTOCHDR Struct cdrom_tochdr 读取TOC头部
CDROMREADTOCENTRY Struct cdrom_tocentry 读取TOC条目
CDROMSUBCHNL Struct cdrom_subchnl 读取子通道数据
CDROMREADMODAL1 Struct cdrom_read 读取模式1数据
CDROMREADMODAL2 Struct cdrom_read 读取模式2数据
CDROMREADAUDIO Struct cdrom_read_audio 读取数字音频数据 Linux环境下CD播放器的设计与实现(4):http://www.751com.cn/jisuanji/lunwen_7816.html