I coulda sworn I had those angle brackets in there... anyway, I had the syntax right (cat snd.raw > /dev/dsp). The data's getting to the soundcard alright, but apparently not in the right format, hence the squealing.
Nice catch though.
Anyway, here's the logic:
cdparanoia [options] tracks outfile
If options contains -p, then it outputs raw data to outfile. If it contains -w, it outputs MS RIFF/WAV data. -c means force reading the data as little-endian, and -C means force reading as big-endian. tracks specifies the tracks to play (same way the -c parameter to cut works... 1- means play all tracks, etc). outfile specifies the name of the file to write (- means write to stdout).
Theoretically (and the way it works on Linux) /dev/dsp is a character device which represents the soundcard. Reading from /dev/dsp reads from the recording mixer (mixture of line-in and microphone), writing to /dev/dsp writes to the output mixer (mono, stereo, 5.1, whatever the case may be). There's a buffer-size limit on /dev/dsp so that writing/reading doesn't cause over/underflow.
Now, theoretically, that means that reading raw audio from the CD (even at speeds faster than realtime, as cdparanoia does) should be able to be piped to /dev/dsp, since /dev/dsp will only accept data at the correct rate.
Or does it?
I've seen many Linux tutorials that make reference to catting a sound file to /dev/dsp. Why would *BSD be any different?