338 lines
9.4 KiB
C++
338 lines
9.4 KiB
C++
/*------------------------------------------------------------------------------
|
|
|
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
|
|
|
Tyrell DarkIce
|
|
|
|
File : AudioSource.h
|
|
Version : $Revision$
|
|
Author : $Author$
|
|
Location : $Source$
|
|
|
|
Copyright notice:
|
|
|
|
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
------------------------------------------------------------------------------*/
|
|
#ifndef AUDIO_SOURCE_H
|
|
#define AUDIO_SOURCE_H
|
|
|
|
#ifndef __cplusplus
|
|
#error This is a C++ include file
|
|
#endif
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
/* ============================================================ include files */
|
|
|
|
#include "Source.h"
|
|
#include "Reporter.h"
|
|
|
|
|
|
/* ================================================================ constants */
|
|
|
|
|
|
/* =================================================================== macros */
|
|
|
|
/*------------------------------------------------------------------------------
|
|
* Determine the kind of audio device based on the system
|
|
*----------------------------------------------------------------------------*/
|
|
#if defined( HAVE_ALSA_LIB )
|
|
// we have an ALSA sound system available
|
|
#define SUPPORT_ALSA_DSP 1
|
|
#endif
|
|
|
|
#if defined( HAVE_SYS_SOUNDCARD_H )
|
|
// we have an OSS DSP sound source device available
|
|
#define SUPPORT_OSS_DSP 1
|
|
#endif
|
|
|
|
#if defined( HAVE_SYS_AUDIO_H ) || defined( HAVE_SYS_AUDIOIO_H )
|
|
// we have a Solaris DSP sound device available (same for OpenBSD)
|
|
#define SUPPORT_SOLARIS_DSP 1
|
|
#endif
|
|
|
|
#if defined( HAVE_JACK_LIB )
|
|
// we have JACK audio server
|
|
#define SUPPORT_JACK_DSP 1
|
|
#endif
|
|
|
|
#if !defined( SUPPORT_ALSA_DSP ) \
|
|
&& !defined( SUPPORT_OSS_DSP ) \
|
|
&& !defined( SUPPORT_JACK_DSP ) \
|
|
&& !defined( SUPPORT_SOLARIS_DSP )
|
|
// there was no DSP audio system found
|
|
#error No DSP audio input device found on system
|
|
#endif
|
|
|
|
|
|
/* =============================================================== data types */
|
|
|
|
/**
|
|
* Audio data input
|
|
*
|
|
* @author $Author$
|
|
* @version $Revision$
|
|
*/
|
|
class AudioSource : public Source, public virtual Reporter
|
|
{
|
|
private:
|
|
|
|
/**
|
|
* Number of channels of the audio source
|
|
* (e.g. 1 for mono, 2 for stereo, etc.)
|
|
*/
|
|
unsigned int channel;
|
|
|
|
/**
|
|
* Samples per second (e.g. 44100 for 44.1kHz CD quality)
|
|
*/
|
|
unsigned int sampleRate;
|
|
|
|
/**
|
|
* Bits per sample (e.g. 8 bits, 16 bits, etc.)
|
|
*/
|
|
unsigned int bitsPerSample;
|
|
|
|
/**
|
|
* Initialize the object.
|
|
*
|
|
* @param sampleRate samples per second.
|
|
* @param bitsPerSample bits per sample.
|
|
* @param channel number of channels of the audio source.
|
|
* @exception Exception
|
|
*/
|
|
inline void
|
|
init ( unsigned int sampleRate,
|
|
unsigned int bitsPerSample,
|
|
unsigned int channel ) throw ( Exception )
|
|
{
|
|
this->sampleRate = sampleRate;
|
|
this->bitsPerSample = bitsPerSample;
|
|
this->channel = channel;
|
|
}
|
|
|
|
/**
|
|
* De-initialize the object.
|
|
*
|
|
* @exception Exception
|
|
*/
|
|
inline void
|
|
strip ( void ) throw ( Exception )
|
|
{
|
|
}
|
|
|
|
|
|
protected:
|
|
|
|
/**
|
|
* Constructor.
|
|
* Because all values have defaults, this is also the default
|
|
* constructor.
|
|
*
|
|
* @param sampleRate samples per second (e.g. 44100 for 44.1kHz).
|
|
* @param bitsPerSample bits per sample (e.g. 16 bits).
|
|
* @param channel number of channels of the audio source
|
|
* (e.g. 1 for mono, 2 for stereo, etc.).
|
|
* @exception Exception
|
|
*/
|
|
inline
|
|
AudioSource ( unsigned int sampleRate = 44100,
|
|
unsigned int bitsPerSample = 16,
|
|
unsigned int channel = 2 )
|
|
throw ( Exception )
|
|
{
|
|
init ( sampleRate, bitsPerSample, channel);
|
|
}
|
|
|
|
/**
|
|
* Copy Constructor.
|
|
*
|
|
* @param source the object to copy.
|
|
* @exception Exception
|
|
*/
|
|
inline
|
|
AudioSource ( const AudioSource & as ) throw ( Exception )
|
|
: Source( as )
|
|
{
|
|
init ( as.sampleRate, as.bitsPerSample, as.channel);
|
|
}
|
|
|
|
/**
|
|
* Assignment operator.
|
|
*
|
|
* @param as the object to assign to this one.
|
|
* @return a reference to this object.
|
|
* @exception Exception
|
|
*/
|
|
inline virtual AudioSource &
|
|
operator= ( const AudioSource & as ) throw ( Exception )
|
|
{
|
|
if ( this != &as ) {
|
|
strip();
|
|
Source::operator=( as );
|
|
init ( as.sampleRate, as.bitsPerSample, as.channel);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
* Destructor.
|
|
*
|
|
* @exception Exception
|
|
*/
|
|
virtual inline
|
|
~AudioSource ( void ) throw ( Exception )
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Get the number of channels for this AudioSource.
|
|
*
|
|
* @return the number of channels.
|
|
*/
|
|
inline unsigned int
|
|
getChannel ( void ) const throw ()
|
|
{
|
|
return channel;
|
|
}
|
|
|
|
/**
|
|
* Tell if the data from this source comes in big or little endian.
|
|
*
|
|
* @return true if the data is big endian, false if little endian
|
|
*/
|
|
virtual bool
|
|
isBigEndian ( void ) const throw ()
|
|
{
|
|
#ifdef WORDS_BIGENDIAN
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* Get the sample rate per seconds for this AudioSource.
|
|
*
|
|
* @return the sample rate per seconds.
|
|
*/
|
|
inline unsigned int
|
|
getSampleRate ( void ) const throw ()
|
|
{
|
|
return sampleRate;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the number of bits per sample for this AudioSource.
|
|
*
|
|
* @return the number of bits per sample.
|
|
*/
|
|
inline unsigned int
|
|
getBitsPerSample ( void ) const throw ()
|
|
{
|
|
return bitsPerSample;
|
|
}
|
|
|
|
/**
|
|
* Factory method for creating an AudioSource object of the
|
|
* appropriate type, based on the compiled DSP support and
|
|
* the supplied DSP name parameter.
|
|
*
|
|
* @param name the audio device (/dev/dspX, hwplug:0,0, etc)
|
|
* @param sampleRate samples per second (e.g. 44100 for 44.1kHz).
|
|
* @param bitsPerSample bits per sample (e.g. 16 bits).
|
|
* @param channel number of channels of the audio source
|
|
* (e.g. 1 for mono, 2 for stereo, etc.).
|
|
* @exception Exception
|
|
*/
|
|
static AudioSource *
|
|
createDspSource( const char * deviceName,
|
|
int sampleRate = 44100,
|
|
int bitsPerSample = 16,
|
|
int channel = 2) throw ( Exception );
|
|
|
|
};
|
|
|
|
|
|
/* ================================================= external data structures */
|
|
|
|
/*------------------------------------------------------------------------------
|
|
* Determine the kind of audio device based on the system
|
|
*----------------------------------------------------------------------------*/
|
|
#if defined( SUPPORT_ALSA_DSP )
|
|
#include "AlsaDspSource.h"
|
|
#endif
|
|
|
|
#if defined( SUPPORT_OSS_DSP )
|
|
#include "OssDspSource.h"
|
|
#endif
|
|
|
|
#if defined( SUPPORT_SOLARIS_DSP )
|
|
#include "SolarisDspSource.h"
|
|
#endif
|
|
|
|
#if defined( SUPPORT_JACK_DSP )
|
|
#include "JackDspSource.h"
|
|
#endif
|
|
|
|
/* ====================================================== function prototypes */
|
|
|
|
|
|
|
|
#endif /* AUDIO_SOURCE_H */
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
|
|
$Source$
|
|
|
|
$Log$
|
|
Revision 1.8 2005/04/04 08:36:16 darkeye
|
|
commited changes to enable Jack support
|
|
thanks to Nicholas J. Humfrey, njh@ecs.soton.ac.uk
|
|
|
|
Revision 1.7 2004/02/18 21:08:11 darkeye
|
|
ported to OpenBSD (real-time scheduling not yet supported)
|
|
|
|
Revision 1.6 2004/02/15 12:06:29 darkeye
|
|
added ALSA support, thanks to Christian Forster
|
|
|
|
Revision 1.5 2001/09/18 14:57:19 darkeye
|
|
finalized Solaris port
|
|
|
|
Revision 1.4 2001/09/11 15:05:21 darkeye
|
|
added Solaris support
|
|
|
|
Revision 1.3 2000/11/12 13:31:40 darkeye
|
|
added kdoc-style documentation comments
|
|
|
|
Revision 1.2 2000/11/05 17:37:24 darkeye
|
|
removed clone() functions
|
|
|
|
Revision 1.1.1.1 2000/11/05 10:05:47 darkeye
|
|
initial version
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
|