What’s the deal with the Beep() API anyway?
It’s one of the oldest Windows API, dating back to Windows 1.0. It’s also one of the few audio APIs that my team doesn’t own. The Beep API actually has its own dedicated driver (beep.sys). The reason for this is that the Beep() API works totally differently from any other audio API in the system.
Back when IBM built the first IBM PCs, they realized that they needed to have the ability to do SOME level of audio, even if it wasn’t particularly high quality. So they built a speaker into the original PC hardware.
But how do you drive the speaker? It turns out that the original PC hardware used an 8253 programmable interval timer to control the system hardware timer. The 8253 was a pretty cool little chip – it would operate in 5 different modes – one shot timer, interrupt on terminal count, rate generator, square wave generator, software strobe or hardware strobe. It also contained three independent counters – counter 0 was used by the operating system, counter 1 was reserved for the hardware. The third counter, counter 2 was special. The IBM hardware engineers tied the OUT2 line from the 8253 to the speaker line, and they programmed the timer to operate in square wave generation mode.
What that means is that whenever the 2nd counter of the 8253 counted to 0, it would toggle the output of the OUT2 line from the 8253. This gave the PC a primitive way of generating very simple tones.
The original Windows Beep() API simply fiddled the controls on the 8253 to cause it to generate a square wave with the appropriate frequency, and that’s what Beep.sys continues to do. Legacy APIs can be hard to remove sometimes 🙂
Nowadays, the internal PC speaker is often also connected to the PCs audio solution, that allows the PC to have sound even when there are no external speakers connected to the machine.
In addition to the simple beep, some very clever people figured out how they could use the 8253 to generate honest to goodness audio, I’m not sure how they succeeded in doing it but I remember someone had a PC speaker based sound driver for DOS available at one point – it totally killed your PCs performance but it DID play something better than BEEEEEEP.
Edit: s/interrupt conroller/interval timer/
Edit2: fixed description of channel 1 (in case someone comes along later and decides to depend on my error).