318 lines
13 KiB
Plaintext
318 lines
13 KiB
Plaintext
Alternate Sound-driver for Linux. Version 0.6
|
|
=============================================
|
|
Copyright (C) 1993, 1994 Michael Beck
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
Introduction
|
|
============
|
|
|
|
The PC-Speaker part of this device-driver based on auplay-0.2 by Rick Miller
|
|
and the /dev/audio implementation by Dirk Verworner. The /dev/pcmixer part
|
|
based on the mixer-implementation of the 'real' sounddriver distributed by
|
|
Hannu Savolainen. Special thanks to Mark J. Cox.
|
|
|
|
This version supports the following devices :
|
|
|
|
/dev/pcsp - the raw data device
|
|
/dev/pcaudio - the SUN-audio device
|
|
/dev/pcmixer - the mixer-device
|
|
|
|
You can 'assign' a output-device to /dev/pcsp. That's why I call it
|
|
now the 'Alternate Sound-driver'. Supported output-devices:
|
|
|
|
Stereo-on-One (designed by Mark J. Cox), this is autodetected during
|
|
kernel-startup and selected by default
|
|
PC-Speaker is selected if no Stereo-on-One was found
|
|
Mono DAC on one lp-port
|
|
Stereo DAC on two lp-ports
|
|
|
|
/dev/pcsp supports the /dev/dsp ioctl calls (set speed, stereo, samplesize,
|
|
getblocksize). You can vary the sample speed, the driver converts it
|
|
to its real samplerate and return the right value for the others,
|
|
so you can use the .MOD-player to play AMIGA .MOD files by using the
|
|
-o option (or install a symbolic link).
|
|
For instance if PC-Speaker is your output-device
|
|
|
|
str32 -o /dev/pcsp popcorn.mod
|
|
|
|
will play the file thru PC-Speaker. Because the real speed is now taken
|
|
depending on your cpu-speed, you should set the samplespeed not higher than
|
|
this value (use the pcsel-utility in this package to get this speed).
|
|
DACs support real samplerate from 4000 Hz up to the measured maximal samplerate
|
|
(Someone has a Pentium ?). Please get the str-program from the sound-package
|
|
distributed by Hannu Savolainen, in the snd-driv-?.?.tar.z archive.
|
|
I enclose vplay, a utility to play .VOC, .WAV and raw data files thru /dev/dsp.
|
|
Read the Readme in pcsnd-kit directory for features.
|
|
|
|
If you have a Stereo-on-One or two DACs
|
|
|
|
str32 -o /dev/pcsp -S popcorn.mod
|
|
|
|
will play the file in Stereo thru the printer-port!
|
|
|
|
Volume-Control is given thru /dev/pcmixer (which is compatible to /dev/mixer).
|
|
So use the mixer-utilities enclosed in snd-utils-???.
|
|
|
|
|
|
NEW: Automatical speed detection
|
|
================================
|
|
|
|
This version automaticly measures the time needed for execution of
|
|
the timer-interupt and calculate the highest real samplerate which
|
|
is possible at this speed.
|
|
If this samplerate is too slow (<12500), the driver is disabled!
|
|
You get a message and hear a ugly 2-tone beep.
|
|
This is a new feature, so you can override the detection by using
|
|
a kernel-command parameter like 'pcsp=17500', or switch it off
|
|
during kernel-configuration.
|
|
However, this is NOT RECOMMENDED, because the automatical detection
|
|
configure the driver to use not more than 90% cpu-time, so it
|
|
should crash your computer (I know it's funny to play with the TURBO-key).
|
|
Because this version use a own IRQ-delivery, the driver is speeded up
|
|
and hopefully work at least at 386DX-25.
|
|
|
|
[ Pressing TURBO and disabling both caches on my 486 gives my around 6 ]
|
|
[ Bogomips. This is the speed of a 386DX-33 and the driver works ]
|
|
[ reasonable at this speed. However, MOD-players aren't satisfied. Sigh.]
|
|
|
|
The 'Interval Mode' introduced in 0.5 is gone away, it doesn't solve
|
|
the speed-problem on 386 and reduce the quality on 486.
|
|
However, you may reduce the selected samplerate, but can't set it above
|
|
the measured maximum!
|
|
|
|
Please mail me if speed-detection doesn't work on your machine or
|
|
the driver hang your machine with automatical speed detection!
|
|
|
|
The bad news
|
|
============
|
|
|
|
It's more for fun and may or may not satisfy your opinion of a 'SOUND DRIVER'.
|
|
It plays samples and AMIGA .MOD-files ok on my machine (if no diskaccess
|
|
is done). The quality of playing heavyly depends on your PC-Speaker (and
|
|
maybe on the electronic noise produced by your computer equipment). The aim
|
|
was to produce something of 'standard audio device', don't expect too much.
|
|
Slow machines seems to produce more noise.
|
|
Stereo-on-One and DAC's havn't problems with mices, but during diskaccess
|
|
they "slow down" (sigh).
|
|
There is no communications between this driver and other drivers using lp?.
|
|
Declaring a printer as a DAC should produce nothing, but I'm not sure about
|
|
all parallel devices. So caryfully configure the usage of your lp-ports.
|
|
WARNING: This driver do some really bad things (for *nix - systems, DOS-
|
|
programs do that during the initialisation :-). It reprogram the timer-
|
|
interupt which is the heard of multitasking on every (real) system.
|
|
This version shouldn't crash a slow machine because the speed-detection,
|
|
but there is NO WARRANTY!
|
|
Ok, let's follow the good things.
|
|
|
|
Changes from 0.5
|
|
================
|
|
|
|
- automatic speed detection!
|
|
- speeded up by using a special interrupt delivery (the promised
|
|
"another way"), this include some more patches
|
|
- support for adjtimex(), but not tested
|
|
- can be switched off and configured by commandline (pcsp=off),
|
|
not very useful but now possible
|
|
- driver is switched off if both buffers are empty, this short extremly
|
|
the time of a "gap", not perfect but useful, thanks to Alistar MacDonald
|
|
- removed useless 'INTERVAL MODE'
|
|
- utility enhancement; pcsel -v now updates the mixer values if
|
|
/dev/mixer is installed
|
|
- removed some little bugs and include some panic() calls if something
|
|
goes wrong with the timer-int, hopefully you never see this
|
|
- acts more like /dev/dsp
|
|
|
|
Changes from 0.4
|
|
================
|
|
|
|
- the PC-Speaker samplerate can be changed in 'Fixed Mode' or can be
|
|
selected in the intervall from ??? - 18356, for higher or lower rates
|
|
the old oversampling method is used
|
|
- the driver now stop the output if both buffers are empty, this
|
|
reduce the gaps and speed things up if programs open the driver
|
|
permanently
|
|
- a little bugfix in the SYNC-ioctl and some Warnings removed
|
|
- bugfix for exclude /dev/mixer support
|
|
|
|
Changes from 0.3
|
|
================
|
|
|
|
- the (real) samplerate for PC-Speaker is now 18356; I only eleminate
|
|
the twofold oversampling which was stupid
|
|
- Volume-Control for PC-Speaker: Using another way of playing thru
|
|
PC-Speaker, samples are much louder (like players under DOS), so this
|
|
feature was usefull (for me)
|
|
- dev/pcmixer support: Only the Master-Volume is supported, nevertheless
|
|
it works in the suspected manner for Stereo-devices, Mono-devices use
|
|
the left volume, PC-Speaker use the mean of left and right
|
|
- vplay now have the option -o device, and some bugfix
|
|
- pcsel bugfix, and support for volume-control if /dev/pcmixer is disabled
|
|
(in that case you can only change the volume of PC-Speaker)
|
|
|
|
Changes from 0.2a
|
|
=================
|
|
|
|
- Support Mark J. Cox Stereo-on-One DAC which plays Stereo, use only one
|
|
lp-port, can be autodetect and produce better quality than my SB 1.0
|
|
(really if no heavy diskacces :-(
|
|
- Support simple DACs on one or two lp-ports (this allows Stereo)
|
|
- Support version 2 /dev/dsp ioctl's (use #ifdef SOUND_VERSION to determine
|
|
between the version, this is choosen for compability with version 2 of
|
|
the sounddriver, look in the vplay-code for a (bad) example) or use
|
|
the new format in the hope it will not be changed in the future
|
|
- the pcsp.h file is now sys/pcsp.h like soundcard.h
|
|
- Restoring the timer 2 mode to square-wave generator after device release
|
|
(this is needed for dosemu)
|
|
- interrupt starts after first data was written / stopped after a
|
|
SNDCTL_DSP_RESET
|
|
- Some speed enhancement by optimizing the interrupt-routine (after I
|
|
look on the assembler-output I think it would be hard to get significant
|
|
more).
|
|
|
|
It runs better on bigger machines :-(. Sorry, but it'a a cyclehog.
|
|
|
|
|
|
Installation
|
|
============
|
|
|
|
Install the archive and read linux/drivers/pcsnd/README.
|
|
To install the utilities, run make in the pcsnd-kit subdirectory.
|
|
|
|
|
|
Utilities
|
|
=========
|
|
|
|
This package should work with most utilities written for Hannu Savolainen's
|
|
sounddriver using /dev/dsp or /dev/audio (tested with str, mixer, xmix,
|
|
xvmixer, someone wrote me it works with xboing, a game which support
|
|
-sound option). Simply get them!
|
|
If your output-device is the PC-Speaker, you should set the default values
|
|
to mono, 8 bit and up to 18356 Hz for best performance (the first two
|
|
cannot be changed, but /dev/pcsp supports samplespeed from 4000 to 22222 Hz,
|
|
however this is converted to a value lower than 18356). DACs may be set
|
|
to Stereo and they support real samplerates (more than 22222, but this
|
|
is only usable on a 'really hot' machine, so I don't change the limit).
|
|
|
|
The pcsel program which allows configuring the /dev/pcsp by setting
|
|
output-device, Stereo, samplespeed, real samplerate, volume and lp-port.
|
|
|
|
The vplay-program to play CREATIVE LABS Voice files, Microsoft WAVE files
|
|
and raw data files is included.
|
|
Try:
|
|
cat enterpri.raw >/dev/null (load it in the cache for best performance !!!)
|
|
vplay -s 9321 enterpri.raw
|
|
|
|
to check the driver (output should be different from white noise :-).
|
|
Read the README in the pcsnd-kit directory.
|
|
|
|
Using the driver
|
|
================
|
|
|
|
All programs using this driver should include <sys/pcsp.h>. If you
|
|
don't have the soundcard-driver the file <sys/soundcard.h> is
|
|
created by the pcspinstall script and consists of the line:
|
|
|
|
#include <sys/pcsp.h>
|
|
|
|
Use this include if you want write programs which work with both drivers
|
|
(because using the same ioctl, your program will run on "right" soundcards
|
|
if you use /dev/dsp and install the symbolic links, this method is prefered).
|
|
|
|
The devices are opened exclusively. When another program tries to open the
|
|
driver returns EBUSY. Not more than one of the devices can be open at the
|
|
same time (except /dev/pcmixer, you can only open one mixer, because I
|
|
could not imagine about using more, write me if you need more mixers).
|
|
Note that if your output-device is PC-Speaker :
|
|
|
|
1.) While a program have opened /dev/pc*, your console cannot 'beep'
|
|
(the 'ressource' is busy).
|
|
2.) Some programs running as root may stop the output if they reprogram
|
|
timer 2 (dosemu with speaker = native currently don't and other I don't
|
|
know [auplay of course] :-).
|
|
|
|
|
|
Audio output
|
|
============
|
|
|
|
The /dev/pcsp can be used in digitized voice applications. This device
|
|
can be accessed with programs like cat or dd. The default speed is
|
|
8000 Hz and can be changed by SNDCTL_DSP_SPEED ioctl() -call.
|
|
For example:
|
|
|
|
samplespeed = 11025;
|
|
ioctl(fd, SNDCTL_DSP_SPEED, &samplespeed);
|
|
|
|
setting the sample speed to 11025 Hz
|
|
|
|
The device driver has 2 buffers for audio output. When a program makes
|
|
a write to the device, all bytes will be copied to a buffer and
|
|
played in the timer-interrupt. While the first buffer is being played,
|
|
the process may write to the other buffers. If no buffers are free,
|
|
process has to wait.
|
|
|
|
For optimal performance, you should write full blocks to the device.
|
|
Writing too short blocks can result in a silence gap. Too long writes will
|
|
cause unnecessary process switches.
|
|
The size of a block can be obtained with a SNDCTL_DSP_GETBLKSIZE.
|
|
For example:
|
|
ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &blksize).
|
|
|
|
(if you have the "real" /dev/dsp, it's the same procedure, write me
|
|
if you find incompatibilities)
|
|
|
|
|
|
The HARDWARE
|
|
============
|
|
|
|
Please read Mark J. Cox' file HARDWARE.DOC which is included with his kindly
|
|
permissions if you want to know how simple you can built DACs and the famous
|
|
Stereo-on-One device! (Oh, it's a DOS-file for those who have problems
|
|
looking at it with vi, I simple start DosEmu and use DOS-vi ;-)
|
|
|
|
|
|
TODO
|
|
====
|
|
|
|
Could someone test the adjtimex() now? Currently, using /dev/pcsp
|
|
for a while, your system-time will leave some ticks.
|
|
I need some adjusting code (for instance using the RTC) to solve
|
|
this time leak, write me if you really need this. BTW, this
|
|
is the reason, why it's only 0.6 and not 1.0 :-)
|
|
|
|
Grab a lp-port if it's used by a DAC, so don't have trouble with other
|
|
devices. Is this really needed? Plip doesn't.
|
|
|
|
Is someone interested in playing thru other devices on lp-ports or thru
|
|
Soundcards which doesn't support DMA-transfer (someone wrote me, he has
|
|
a SoundBlaster-Clone which doesn't have DMA-transfer, I have never heard
|
|
about such thing)? Seems not.
|
|
|
|
|
|
If this driver isn't part of the standard kernel (and it seems it would
|
|
never be :-) look at
|
|
|
|
ftp.informatik.hu-berlin.de /pub/os/linux
|
|
|
|
for the newest version. BTW we have a LOT of Linux stuff!
|
|
|
|
If you have any ideas, please contact me.
|
|
|
|
|
|
Contact address
|
|
|
|
Michael Beck beck@informatik.hu-berlin.de
|