This is obuffer.h in view mode; [Download] [Up]
/*
* @(#) obuffer.h 1.8, last edit: 6/15/94 16:51:56
* @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
* @(#) Berlin University of Technology
*
* Idea and first implementation for u-law output with fast downsampling by
* Jim Boucher (jboucher@flash.bu.edu)
*
* LinuxObuffer class written by
* Louis P. Kruger (lpkruger@phoenix.princeton.edu)
*
* 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.
*/
#ifndef OBUFFER_H
#define OBUFFER_H
#include <iostream.h>
#include <unistd.h>
#include <stdlib.h>
#include "all.h"
#include "header.h"
extern "C" {
#include "audio_includes.h"
}
static const uint32 OBUFFERSIZE = 2 * 1152; // max. 2 * 1152 samples per frame
static const uint32 MAXCHANNELS = 2; // max. number of channels
// Abstract base class for audio output classes:
class Obuffer
{
public:
virtual ~Obuffer (void) {} // dummy
virtual void append (uint32 channel, int16 value) = 0;
// this function takes a 16 Bit PCM sample
virtual void write_buffer (int fd) = 0;
// this function should write the samples to the filedescriptor
// or directly to the audio hardware
};
// An audio output class for raw pcm output
// or if ULAW is defined:
// An audio output class for 8-bit ulaw output at 8 kHz:
class FileObuffer : public Obuffer
{
private:
#ifdef ULAW
ulawsample buffer[OBUFFERSIZE];
ulawsample *bufferp[MAXCHANNELS];
#else
int16 buffer[OBUFFERSIZE];
int16 *bufferp[MAXCHANNELS];
#endif
uint32 channels;
public:
FileObuffer (uint32 number_of_channels);
~FileObuffer (void) {}
void append (uint32 channel, int16 value);
void write_buffer (int fd);
};
#ifdef Indigo
// a class for direct sound output on SGI machines:
class IndigoObuffer : public Obuffer
{
private:
int16 buffer[OBUFFERSIZE];
int16 *bufferp[MAXCHANNELS];
uint32 channels;
ALport port;
public:
IndigoObuffer (uint32 number_of_channels, Header *);
~IndigoObuffer (void);
void append (uint32 channel, int16 value);
void write_buffer (int dummy);
};
#endif // Indigo
#ifdef SPARC
// a class for direct sound output on SPARC 10 machines (dbri device)
// or if ULAW is defined:
// a class for direct sound output on SPARCs using a 8 kHz
// 8-bit u-law audio device: (audioamd)
class SparcObuffer : public Obuffer
{
private:
#ifdef ULAW
ulawsample buffer[OBUFFERSIZE >> 1]; // mono only
ulawsample *bufferp;
#else
int16 buffer[OBUFFERSIZE];
int16 *bufferp[MAXCHANNELS];
uint32 channels;
#endif
static int audio_fd;
static int open_audio_device (void);
#ifdef Solaris
static void get_device_type (int fd, audio_device *);
#else
static int get_device_type (int fd);
#endif
public:
#ifdef ULAW
SparcObuffer (Header *, bool use_speaker, bool use_headphone, bool use_line_out);
#else
SparcObuffer (uint32 number_of_channels, Header *,
bool use_speaker, bool use_headphone, bool use_line_out);
#endif
~SparcObuffer (void);
void append (uint32 channel, int16 value);
void write_buffer (int dummy);
#ifdef ULAW
static bool class_suitable (uint32 number_of_channels, bool force_amd);
// returnvalue == False: no u-law output possible (class unsuitable)
#else
static bool class_suitable (void);
// returnvalue == False: no 16-bit output possible (class unsuitable)
#endif
};
#endif // SPARC
#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 (uint32 number_of_channels);
};
#endif // LINUX
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.