maplay mpeg audio player for Linux

maplay mpeg audio player for Linux

Post by Louis P. Krug » Tue, 15 Mar 1994 02:51:57



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-----------------------------------

 
 
 

1. Problems with maplay (MPEG audio decoder)

It sounds like you have an 8 bit sound card. (The README file says it
has support for Linux on some 16bit sound cards, but has no mention
of 8 bits.) Right now, the only two hacks I can think of is changing
        int play_precision = 16;
to
        int play_precision = 8;
on line 577 in obuffer.cc (which most probably will not work.), or to
run maplay -s (filename) > temp.raw and running a program that can
play 16bit signed PCM files on your computer. (This will take forever,
not to mention that it will take up a lot of disk space, for large files,
and I haven't been able to get sox to play it.)

If none of the above doesn't work, e-mail me, and I'll see what I can do.

--
Yoo Chul Chung

---
I keep getting bounced e-mail even on valid e-mail addresses. Argh!!!

---
Please do not use Korean MS Windows 95.
It mangles our character coding system.

2. TIN menu

3. MP3Blaster V2.01 -- Mpeg audio player for Linux

4. Security in CGI directories

5. MPEG-II audio player for Linux?

6. A happy 0.98 patch-3 camper.

7. Linux mpeg audio players

8. monitoring telnetsessions

9. uninterruptible mpeg audio player (real time)

10. A New Audio MPEG Player

11. amp - New Audio MPEG Player

12. mpeg player can't see audio device

13. MPEG *audio* players?