Files
oldlinux-files/bin/pcsndrv-0.6.readme
2024-02-19 00:21:52 -05:00

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