在IBM PC流行之前的时代,一般的个人电脑都没有声卡.某些主机,比如NES,Atari之类的注重于游戏应用的,都有专门设计的声音设备.比如NES主机在CPU(定制的6502)中专门设计了一个APU的外设来播放声音.说起来这个APU还是5通道呢:两路方波,一路三角波,一路噪音,一路采样. 注意这个5通道不是现在说的5声道这种概念,而是5通道信号进行叠加实现类声卡的功能.关于NES的音频硬件软件的内容将在今后的连载中介绍,这里还是回到PC音频硬件上来.
说声卡之前先讲一讲PC扬声器(实际上现代嵌入式系统中这个称作蜂鸣器更合适,但是所有文献都称作Speaker,这里也随俗.有这个设备的主板有焊接蜂鸣器的,也有焊接扬声器的,只是起的作用跟嵌入式系统中的无源蜂鸣器类似.).作为音频设备,扬声器早于真正意义上的声卡出现在PC上.因此声卡与扬声器是分开的两个设备,扬声器是直接焊接在主板南桥的定时器(8253/8254兼容定时器)引脚上面. 有一定年龄的读者可能还记得那种老电脑出了故障的时候,滴滴滴滴的报警声. 有经验的老司机们还可以通过扬声器不同响声模式来判断电脑故障的原因.比如: 短短短-内存没有插好, 短长短-硬盘没有插好, 长-风扇散热不够等等.
[因为这个扬声器只能输出高和低的方波,本质上就不是用来播放PCM的.但是本系列**介绍过一种D类放大器,可以通过PWM+滤波器实现一种简单DAC. 事实上确实有人做过这样的实验. 只是考虑到现代电脑上扬声器已经与声卡合并了, 本文就不进行这个方向的阐叙了.]
时过境迁, 大多数电脑上早就没有专门的扬声器了. 现在的操作系统中一般把扬声器的调用转到声卡上执行, 当然用户可以设置是否使能这种转向.
图 扬声器的声音转移到声卡上播放
Windows操作系统API中还遗留着这个扬声器的控制接口. WinXP与Vista中曾经去除这个API,但是Win7又恢复了. 这个调用的函数就是:
BOOL WINAPI Beep(
_In_ DWORDdwFreq,
_In_ DWORDdwDuration
);
我想, 这个函数的命名也是没有出乎任何人的意料吧.