Hi everybody! I've added support for the Linux sound driver to
Tobias Bading's very fine program maplay. The original program
can be found on sunsite.unc.edu in /pub/electronic-publications/IUMA
This version only supports mono output, there wouldn't be too much
point in implementing stereo, because the playback is already a little
choppy as it is on my 486/66. Pentium owners, enjoy!
Since the patches aren't too long, I'm including them in this message.
Louis
----------------------------CUT HERE---------------------------------------
--- ./configuration.sh~ Mon Feb 21 12:29:48 1994
INCLUDEDIRS='-I/usr/gnu/lib/g++-include -I/usr/gnu/lib/gcc-lib/decstation/2.5.8/include'
LIBRARIES=
AUDIO_INCLUDES= ;;
+ "Linux*")
+ COMPILER=g++
+ COMPILERFLAGS='-O2 -m486 -funroll-loops -Wall -DLINUX -DDAMN_INTEL_BYTE_ORDER'
+ INCLUDEDIRS='-I/usr/g++-include/ -I/usr/lib/gcc-lib/i486-linux/2.5.8/include/'
+ LIBRARIES=
+ AUDIO_INCLUDES='#include <sys/soundcard.h>' ;;
*) echo "This programm has not been tested on your type of machine yet!"
echo "Please modify the file configuration.sh according to your needs!"
exit
esac
export COMPILER COMPILERFLAGS INCLUDEDIRS LIBRARIES
--- ./maplay.c~ Mon Feb 21 12:28:18 1994
Exit (1);
}
#else
-// #ifdef your_machine
-// if (mode == single_channel || which_channels != both)
-// buffer = new your_Obuffer (your_parameters); // mono
-// else
-// buffer = new your_Obuffer (your_parameters); // stereo
-// #else
+#ifdef LINUX
+ if (LinuxObuffer::class_suitable(
+ (mode == single_channel || which_channels != both) ? 1 : 2 ))
+ {
+ if(mode == single_channel || which_channels != both)
+ buffer = new LinuxObuffer (1, header);
+ else
+ buffer = new LinuxObuffer (2, header);
+ }
+ else
+ {
+ cerr << "Sorry, no suitable audio device detected, please use stdout mode.\n";
+ Exit(1);
+ }
+#else
{
cerr << "Sorry, no suitable audio device detected, please use stdout mode.\n";
Exit (1);
}
-// #endif // !your_machine
+#endif // !LINUX
#endif // !SPARC
#endif // !Indigo
--- ./obuffer.c~ Mon Feb 21 12:28:21 1994
bufferp[i] = buffer + i;
}
+#ifdef LINUX
+int LinuxObuffer::audio_fd = -1;
+
+int LinuxObuffer::open_audio_device (void)
+{
+ int fd;
+
+ if ((fd = open ("/dev/dsp", O_WRONLY | O_NDELAY, 0)) < 0)
+ if (errno == EBUSY)
+ {
+ cerr << "Sorry, the audio device is busy!\n";
+ exit (1);
+ }
+ else
+ {
+ perror ("can't open /dev/dsp for writing");
+ exit (1);
+ }
+ return fd;
+}
+
+LinuxObuffer::LinuxObuffer (uint32 number_of_channels, Header *header)
+{
+#ifdef DEBUG
+ if (!number_of_channels || number_of_channels > MAXCHANNELS)
+ {
+ cerr << "LinuxObuffer: 0 < number of channels < " << MAXCHANNELS << "!\n";
+ exit (1);
+ }
+#endif
+ channels = number_of_channels;
+ for (int i = 0; i < number_of_channels; ++i)
+ bufferp[i] = buffer + i;
+
+ if (audio_fd < 0)
+ {
+ cerr << "Internal error, LinuxObuffer::audio_fd has to be initialized\n"
+ "by LinuxObuffer::class_suitable()!\n";
+ exit (1);
+ }
+
+ // configure the device:
+ int play_precision = 16;
+ int play_stereo = channels-1;
+ int play_sample_rate = header->frequency ();
+
+ if(
+ ioctl(audio_fd, SNDCTL_DSP_SAMPLESIZE, &play_precision) == -1 ||
+ ioctl(audio_fd, SNDCTL_DSP_STEREO, &play_stereo) == -1 ||
+ ioctl(audio_fd, SNDCTL_DSP_SPEED, &play_sample_rate) == -1
+ )
+ {
+ perror ("configuration of /dev/dsp failed");
+ exit (1);
+ }
+}
+
+LinuxObuffer::~LinuxObuffer (void)
+{
+ sleep (1);
+ close (audio_fd);
+}
+
+
+void LinuxObuffer::append (uint32 channel, int16 value)
+{
+#ifdef DEBUG
+ if (channel >= channels)
+ {
+ cerr << "illegal channelnumber in LinuxObuffer::append()!\n";
+ exit (1);
+ }
+ if (bufferp[channel] - buffer >= OBUFFERSIZE)
+ {
+ cerr << "buffer overflow!\n";
+ exit (1);
+ }
+#endif
+ *bufferp[channel] = value;
+ bufferp[channel] += channels;
+}
+
+
+void LinuxObuffer::write_buffer (int)
+{
+ int length = (int)((char *)bufferp[0] - (char *)buffer);
+ if (write (audio_fd, buffer, length) != length)
+ cerr << "Warning: couldn't write all samples to /dev/dsp\n";
+ for (int i = 0; i < channels; ++i)
+ bufferp[i] = buffer + i;
+}
+
+bool LinuxObuffer::class_suitable (int channels)
+{
+ if(channels != 1)
+ {
+ cerr << "Stereo output not supported--use mono or stdout\n";
+ return False;
+ }
+ // check for the dsp audio device:
+ audio_fd = open_audio_device ();
+#ifdef DEBUG
+ if (audio_fd != -1)
+ cerr << "Opened Okay!\n";
+ else
+ cerr << "Error: " << errno << "\n";
+#endif
+
+ if (audio_fd != -1)
+ return True;
+ else
+ return False;
+}
+
+#endif /* LINUX */
#ifdef Indigo
IndigoObuffer::IndigoObuffer (uint32 number_of_channels, Header *header)
--- ./obuffer.h~ Mon Feb 21 12:28:21 1994
void write_buffer (int fd);
};
+#ifdef LINUX
+class LinuxObuffer : public Obuffer
+{
+ int16 buffer[OBUFFERSIZE];
+ int16 *bufferp[MAXCHANNELS];
+ uint32 channels;
+ static int audio_fd;
+
+ static int open_audio_device(void);
+
+ public:
+ LinuxObuffer (uint32 number_of_channels, Header *);
+ ~LinuxObuffer (void);
+ void append (uint32 channel, int16 value);
+ void write_buffer (int dummy);
+ static bool class_suitable(int);
+
+};
+#endif
#ifdef Indigo
// a class for direct sound output on SGI machines:
----------------------------------END-----------------------------------