diff --git a/darkice/trunk/configure.in b/darkice/trunk/configure.in index 3e76896..fbfa724 100644 --- a/darkice/trunk/configure.in +++ b/darkice/trunk/configure.in @@ -9,9 +9,10 @@ AC_PROG_INSTALL dnl AC_STDC_HEADERS AC_HAVE_HEADERS(errno.h fcntl.h stdio.h stdlib.h string.h unistd.h limits.h) -AC_HAVE_HEADERS(getopt.h signal.h time.h sys/time.h sys/types.h sys/soundcard.h) +AC_HAVE_HEADERS(signal.h time.h sys/time.h sys/types.h) AC_HAVE_HEADERS(netdb.h netinet/in.h sys/ioctl.h sys/socket.h sys/stat.h) AC_HAVE_HEADERS(sched.h) +AC_HAVE_HEADERS(sys/soundcard.h sys/audio.h) AC_HEADER_SYS_WAIT() AC_TYPE_PID_T() @@ -20,7 +21,6 @@ AC_TYPE_SIZE_T() AC_SUBST(LAME_INCFLAGS) AC_SUBST(LAME_LDFLAGS) AC_SUBST(LINK_STATIC) -AC_SUBST(VERSION) dnl checkin for lame library AC_MSG_CHECKING(lame library) @@ -36,7 +36,7 @@ AC_ARG_WITH(lame-prefix, AC_DEFINE(HAVE_LAME_LIB, 1, build with lame library calls) if test "x${LAME_INC_LOC}" != "x/usr/include" ; then LAME_INCFLAGS="-I${LAME_INC_LOC}" - LAME_LDFLAGS="-Wl,--rpath -Wl,${LAME_LIB_LOC} -lmp3lame" + LAME_LDFLAGS="-L${LAME_LIB_LOC} -lmp3lame" else LAME_LDFLAGS="-lmp3lame" fi @@ -49,12 +49,12 @@ AC_ARG_WITH(lame-prefix, AC_ARG_ENABLE( static, [ --enable-static link everything into the executable statically [no]], CONFIG_LINK_STATIC="${enableval}", CONFIG_LINK_STATIC="") - if test "${CONFIG_LINK_STATIC}" == "yes" ; then - LINK_STATIC="--static" - AC_MSG_RESULT( "creating statically linked executable") - else + if test "${CONFIG_LINK_STATIC}" != "yes" ; then LINK_STATIC="" AC_MSG_RESULT( "creating dinamically linked executable") + else + LINK_STATIC="--static" + AC_MSG_RESULT( "creating statically linked executable") fi diff --git a/darkice/trunk/src/AudioSource.h b/darkice/trunk/src/AudioSource.h index 48f5414..665a4c0 100644 --- a/darkice/trunk/src/AudioSource.h +++ b/darkice/trunk/src/AudioSource.h @@ -137,16 +137,6 @@ class AudioSource : public Source init ( as.sampleRate, as.bitsPerSample, as.channel); } - /** - * Destructor. - * - * @exception Exception - */ - virtual inline - ~AudioSource ( void ) throw ( Exception ) - { - } - /** * Assignment operator. * @@ -169,6 +159,16 @@ class AudioSource : public Source public: + /** + * Destructor. + * + * @exception Exception + */ + virtual inline + ~AudioSource ( void ) throw ( Exception ) + { + } + /** * Get the number of channels for this AudioSource. * @@ -207,6 +207,30 @@ class AudioSource : public Source /* ================================================= external data structures */ +/*------------------------------------------------------------------------------ + * Determine the kind of audio device based on the system + *----------------------------------------------------------------------------*/ +#if defined( HAVE_SYS_SOUNDCARD_H ) + +// we have an OSS DSP sound source device available +#define SUPPORT_OSS_DSP +#include "OssDspSource.h" +typedef class OssDspSource DspSource; + +#elif defined( HAVE_SYS_AUDIO_H ) + +// we have a Solaris DSP sound device available +#define SUPPORT_SOLARIS_DSP +#include "SolarisDspSource.h" +typedef class SolarisDspSource DspSource; + +#else + +// there was no DSP audio system found +#error No DSP audio input device found on system + +#endif + /* ====================================================== function prototypes */ @@ -220,6 +244,9 @@ class AudioSource : public Source $Source$ $Log$ + 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 diff --git a/darkice/trunk/src/DarkIce.cpp b/darkice/trunk/src/DarkIce.cpp index 0d02f82..c39425d 100644 --- a/darkice/trunk/src/DarkIce.cpp +++ b/darkice/trunk/src/DarkIce.cpp @@ -142,10 +142,10 @@ DarkIce :: init ( const Config & config ) throw ( Exception ) channel = Util::strToL( str); device = cs->getForSure( "device", " missing in section [input]"); - dsp = new OssDspSource( device, - sampleRate, - bitsPerSample, - channel ); + dsp = new DspSource( device, + sampleRate, + bitsPerSample, + channel ); encConnector = new Connector( dsp.get()); configIceCast( config, bufferSecs); @@ -477,6 +477,9 @@ DarkIce :: run ( void ) throw ( Exception ) $Source$ $Log$ + Revision 1.18 2001/09/11 15:05:21 darkeye + added Solaris support + Revision 1.17 2001/09/09 11:27:31 darkeye added support for ShoutCast servers diff --git a/darkice/trunk/src/DarkIce.h b/darkice/trunk/src/DarkIce.h index e095d89..67fd753 100644 --- a/darkice/trunk/src/DarkIce.h +++ b/darkice/trunk/src/DarkIce.h @@ -52,7 +52,7 @@ #include "Reporter.h" #include "Exception.h" #include "Ref.h" -#include "OssDspSource.h" +#include "AudioSource.h" #include "BufferedSink.h" #include "Connector.h" #include "LameLibEncoder.h" @@ -111,7 +111,7 @@ class DarkIce : public virtual Referable, public virtual Reporter /** * The dsp to record from. */ - Ref dsp; + Ref dsp; /** * The encoding Connector, connecting the dsp to the encoders. @@ -281,6 +281,9 @@ class DarkIce : public virtual Referable, public virtual Reporter $Source$ $Log$ + Revision 1.11 2001/09/11 15:05:21 darkeye + added Solaris support + Revision 1.10 2001/09/09 11:27:31 darkeye added support for ShoutCast servers diff --git a/darkice/trunk/src/FileSink.cpp b/darkice/trunk/src/FileSink.cpp new file mode 100644 index 0000000..638ad28 --- /dev/null +++ b/darkice/trunk/src/FileSink.cpp @@ -0,0 +1,334 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2000 Tyrell Corporation. All rights reserved. + + Tyrell DarkIce + + File : FileSink.cpp + 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. + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + +#ifdef HAVE_STDLIB_H +#include +#else +#error need stdlib.h +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#else +#error need sys/types.h +#endif + +#ifdef HAVE_ERRNO_H +#include +#else +#error need errno.h +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#else +#error need sys/stat.h +#endif + +#ifdef HAVE_FCNTL_H +#include +#else +#error need fcntl.h +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#else +#error need sys/time.h +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + + +#include "Util.h" +#include "Exception.h" +#include "FileSink.h" + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * File identity + *----------------------------------------------------------------------------*/ +static const char fileid[] = "$Id$"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Initialize the object + *----------------------------------------------------------------------------*/ +void +FileSink :: init ( const char * name ) throw ( Exception ) +{ + fileName = Util::strDup( name); + fileDescriptor = 0; +} + + +/*------------------------------------------------------------------------------ + * De-initialize the object + *----------------------------------------------------------------------------*/ +void +FileSink :: strip ( void) throw ( Exception ) +{ + if ( isOpen() ) { + close(); + } + + delete[] fileName; +} + + +/*------------------------------------------------------------------------------ + * Copy Constructor + *----------------------------------------------------------------------------*/ +FileSink :: FileSink ( const FileSink & fs ) throw ( Exception ) + : Sink( fs ) +{ + int fd; + + init( fs.fileName); + + if ( (fd = fs.fileDescriptor ? dup( fs.fileDescriptor) : 0) == -1 ) { + strip(); + throw Exception( __FILE__, __LINE__, "dup failure"); + } + + fileDescriptor = fd; +} + + +/*------------------------------------------------------------------------------ + * Assignment operator + *----------------------------------------------------------------------------*/ +FileSink & +FileSink :: operator= ( const FileSink & fs ) throw ( Exception ) +{ + if ( this != &fs ) { + int fd; + + /* first strip */ + strip(); + + + /* then build up */ + Sink::operator=( fs ); + + init( fs.fileName); + + if ( (fd = fs.fileDescriptor ? dup( fs.fileDescriptor) : 0) == -1 ) { + strip(); + throw Exception( __FILE__, __LINE__, "dup failure"); + } + + fileDescriptor = fd; + } + + return *this; +} + + +/*------------------------------------------------------------------------------ + * Check wether a file exists + *----------------------------------------------------------------------------*/ +bool +FileSink :: exists ( void ) const throw () +{ + struct stat st; + + if ( stat( (const char*)fileName, &st) == -1 ) { + return false; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Create a file, truncate if already exists + *----------------------------------------------------------------------------*/ +bool +FileSink :: create ( void ) throw ( Exception ) +{ + int fd; + + if ( isOpen() ) { + return false; + } + + if ( (fd = ::creat( fileName, S_IRUSR | S_IWUSR)) == -1 ) { + throw Exception( __FILE__, __LINE__, "creat error", errno); + } + + ::close( fd); + return true; +} + + +/*------------------------------------------------------------------------------ + * Open the file + *----------------------------------------------------------------------------*/ +bool +FileSink :: open ( void ) throw ( Exception ) +{ + if ( isOpen() ) { + return false; + } + + if ( (fileDescriptor = ::open( fileName, O_WRONLY | O_TRUNC, 0)) == -1 ) { + fileDescriptor = 0; + return false; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Check wether read() would return anything + *----------------------------------------------------------------------------*/ +bool +FileSink :: canWrite ( unsigned int sec, + unsigned int usec ) throw ( Exception ) +{ + fd_set fdset; + struct timeval tv; + int ret; + + if ( !isOpen() ) { + return false; + } + + FD_ZERO( &fdset); + FD_SET( fileDescriptor, &fdset); + tv.tv_sec = sec; + tv.tv_usec = usec; + + ret = select( fileDescriptor + 1, NULL, &fdset, NULL, &tv); + + if ( ret == -1 ) { + throw Exception( __FILE__, __LINE__, "select error"); + } + + return ret > 0; +} + + +/*------------------------------------------------------------------------------ + * Read from the audio source + *----------------------------------------------------------------------------*/ +unsigned int +FileSink :: write ( const void * buf, + unsigned int len ) throw ( Exception ) +{ + ssize_t ret; + + if ( !isOpen() ) { + return 0; + } + + ret = ::write( fileDescriptor, buf, len); + + if ( ret == -1 ) { + if ( errno == EAGAIN ) { + ret = 0; + } else { + throw Exception( __FILE__, __LINE__, "write error", errno); + } + } + + return ret; +} + + +/*------------------------------------------------------------------------------ + * Close the audio source + *----------------------------------------------------------------------------*/ +void +FileSink :: close ( void ) throw ( Exception ) +{ + if ( !isOpen() ) { + return; + } + + flush(); + ::close( fileDescriptor); + fileDescriptor = 0; +} + + + +/*------------------------------------------------------------------------------ + + $Source$ + + $Log$ + Revision 1.5 2001/09/11 15:05:21 darkeye + added Solaris support + + Revision 1.4 2001/08/26 20:44:30 darkeye + removed external command-line encoder support + replaced it with a shared-object support for lame with the possibility + of static linkage + + Revision 1.3 2000/11/11 12:33:13 darkeye + added kdoc-style documentation + + Revision 1.2 2000/11/05 14:08:27 darkeye + changed builting to an automake / autoconf environment + + Revision 1.1.1.1 2000/11/05 10:05:51 darkeye + initial version + + +------------------------------------------------------------------------------*/ + diff --git a/darkice/trunk/src/FileSource.cpp b/darkice/trunk/src/FileSource.cpp new file mode 100644 index 0000000..18a22c2 --- /dev/null +++ b/darkice/trunk/src/FileSource.cpp @@ -0,0 +1,284 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2000 Tyrell Corporation. All rights reserved. + + Tyrell DarkIce + + File : FileSource.cpp + 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. + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#else +#error need sys/types.h +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#else +#error need sys/stat.h +#endif + +#ifdef HAVE_FCNTL_H +#include +#else +#error need fcntl.h +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#else +#error need sys/time.h +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + + +#include "Exception.h" +#include "Util.h" +#include "FileSource.h" + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * File identity + *----------------------------------------------------------------------------*/ +static const char fileid[] = "$Id$"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Initialize the object + *----------------------------------------------------------------------------*/ +void +FileSource :: init ( const char * name ) throw ( Exception ) +{ + fileName = Util::strDup( name); + fileDescriptor = 0; +} + + +/*------------------------------------------------------------------------------ + * De-initialize the object + *----------------------------------------------------------------------------*/ +void +FileSource :: strip ( void ) throw ( Exception ) +{ + if ( isOpen() ) { + close(); + } + + delete[] fileName; + fileDescriptor = 0; +} + + +/*------------------------------------------------------------------------------ + * Copy Constructor + *----------------------------------------------------------------------------*/ +FileSource :: FileSource ( const FileSource & fs ) throw ( Exception ) +{ + init( fs.fileName); + + fileDescriptor = fs.fileDescriptor ? dup( fs.fileDescriptor) : 0; + + if ( fileDescriptor == -1 ) { + strip(); + throw Exception( __FILE__, __LINE__, "dup failure"); + } +} + + +/*------------------------------------------------------------------------------ + * Assignment operator + *----------------------------------------------------------------------------*/ +FileSource & +FileSource :: operator= ( const FileSource & fs ) throw ( Exception ) +{ + if ( this != &fs ) { + init( fs.fileName); + + fileDescriptor = fs.fileDescriptor ? dup( fs.fileDescriptor) : 0; + + if ( fileDescriptor == -1 ) { + strip(); + throw Exception( __FILE__, __LINE__, "dup failure"); + } + } + + return *this; +} + + +/*------------------------------------------------------------------------------ + * Check wether a file exists + *----------------------------------------------------------------------------*/ +bool +FileSource :: exists ( void ) const throw () +{ + struct stat st; + + if ( stat( (const char*)fileName, &st) == -1 ) { + return false; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Open the source + *----------------------------------------------------------------------------*/ +bool +FileSource :: open ( void ) throw ( Exception ) +{ + if ( isOpen() ) { + return false; + } + + if ( (fileDescriptor = ::open( fileName, O_RDONLY)) == -1 ) { + fileDescriptor = 0; + return false; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Check wether read() would return anything + *----------------------------------------------------------------------------*/ +bool +FileSource :: canRead ( unsigned int sec, + unsigned int usec ) throw ( Exception ) +{ + fd_set fdset; + struct timeval tv; + int ret; + + if ( !isOpen() ) { + return false; + } + + FD_ZERO( &fdset); + FD_SET( fileDescriptor, &fdset); + tv.tv_sec = sec; + tv.tv_usec = usec; + + ret = select( fileDescriptor + 1, &fdset, NULL, NULL, &tv); + + if ( ret == -1 ) { + throw Exception( __FILE__, __LINE__, "select error"); + } + + return ret > 0; +} + + +/*------------------------------------------------------------------------------ + * Read from the audio source + *----------------------------------------------------------------------------*/ +unsigned int +FileSource :: read ( void * buf, + unsigned int len ) throw ( Exception ) +{ + ssize_t ret; + + if ( !isOpen() ) { + return 0; + } + + ret = ::read( fileDescriptor, buf, len); + + if ( ret == -1 ) { + throw Exception( __FILE__, __LINE__, "read error"); + } + + return ret; +} + + +/*------------------------------------------------------------------------------ + * Close the audio source + *----------------------------------------------------------------------------*/ +void +FileSource :: close ( void ) throw ( Exception ) +{ + if ( !isOpen() ) { + return; + } + + ::close( fileDescriptor); + fileDescriptor = 0; +} + + +/*------------------------------------------------------------------------------ + + $Source$ + + $Log$ + Revision 1.5 2001/09/11 15:05:21 darkeye + added Solaris support + + Revision 1.4 2001/08/26 20:44:30 darkeye + removed external command-line encoder support + replaced it with a shared-object support for lame with the possibility + of static linkage + + Revision 1.3 2000/11/12 13:31:40 darkeye + added kdoc-style documentation comments + + Revision 1.2 2000/11/05 14:08:27 darkeye + changed builting to an automake / autoconf environment + + Revision 1.1.1.1 2000/11/05 10:05:51 darkeye + initial version + + +------------------------------------------------------------------------------*/ + diff --git a/darkice/trunk/src/Makefile.am b/darkice/trunk/src/Makefile.am index 453462d..2f9318c 100644 --- a/darkice/trunk/src/Makefile.am +++ b/darkice/trunk/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = darkice INCLUDES = @LAME_INCFLAGS@ CXXFLAGS = -O2 -Wall -DVERSION="@VERSION@" -LDADD = @LAME_LDFLAGS@ @LINK_STATIC@ +LDADD = -lrt -lsocket -lnsl @LAME_LDFLAGS@ @LINK_STATIC@ darkice_SOURCES = AudioEncoder.h\ AudioSource.h\ @@ -23,6 +23,8 @@ darkice_SOURCES = AudioEncoder.h\ LameLibEncoder.h\ OssDspSource.cpp\ OssDspSource.h\ + SolarisDspSource.cpp\ + SolarisDspSource.h\ Ref.h\ Referable.h\ Sink.h\ diff --git a/darkice/trunk/src/OssDspSource.cpp b/darkice/trunk/src/OssDspSource.cpp index c02c7d9..062694c 100644 --- a/darkice/trunk/src/OssDspSource.cpp +++ b/darkice/trunk/src/OssDspSource.cpp @@ -29,6 +29,11 @@ /* ============================================================ include files */ +#include "OssDspSource.h" + +#ifdef SUPPORT_OSS_DSP +// only compile this code if there is support for it + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -265,12 +270,17 @@ OssDspSource :: close ( void ) throw ( Exception ) running = false; } +#endif // SUPPORT_OSS_DSP + /*------------------------------------------------------------------------------ $Source$ $Log$ + Revision 1.9 2001/09/11 15:05:21 darkeye + added Solaris support + Revision 1.8 2001/09/02 14:08:40 darkeye setting the sound card recording sample rate is now more relaxed there is no error reported if the sample rate is not exactly the same diff --git a/darkice/trunk/src/SolarisDspSource.cpp b/darkice/trunk/src/SolarisDspSource.cpp new file mode 100644 index 0000000..3aa12d5 --- /dev/null +++ b/darkice/trunk/src/SolarisDspSource.cpp @@ -0,0 +1,282 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2000 Tyrell Corporation. All rights reserved. + + Tyrell DarkIce + + File : SolarisDspSource.cpp + 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. + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "SolarisDspSource.h" + +#ifdef SUPPORT_SOLARIS_DSP +// only compile this code if there is support for it + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#else +#error need sys/types.h +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#else +#error need sys/stat.h +#endif + +#ifdef HAVE_FCNTL_H +#include +#else +#error need fcntl.h +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#else +#error need sys/time.h +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include +#else +#error need sys/ioctl.h +#endif + +#ifdef HAVE_SYS_AUDIO_H +#include +#else +#error need sys/audio.h +#endif + + +#include "Util.h" +#include "Exception.h" +#include "SolarisDspSource.h" + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * File identity + *----------------------------------------------------------------------------*/ +static const char fileid[] = "$Id$"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Initialize the object + *----------------------------------------------------------------------------*/ +void +SolarisDspSource :: init ( const char * name ) throw ( Exception ) +{ + fileName = Util::strDup( name); + fileDescriptor = 0; + running = false; +} + + +/*------------------------------------------------------------------------------ + * De-initialize the object + *----------------------------------------------------------------------------*/ +void +SolarisDspSource :: strip ( void ) throw ( Exception ) +{ + if ( isOpen() ) { + close(); + } + + delete[] fileName; +} + +#include + +/*------------------------------------------------------------------------------ + * Open the audio source + *----------------------------------------------------------------------------*/ +bool +SolarisDspSource :: open ( void ) throw ( Exception ) +{ + audio_info_t audioInfo; + + if ( isOpen() ) { + return false; + } + + if ( (fileDescriptor = ::open( fileName, O_RDONLY)) == -1 ) { + fileDescriptor = 0; + return false; + } + + AUDIO_INITINFO( &audioInfo); + audioInfo.record.sample_rate = getSampleRate(); + audioInfo.record.channels = getChannel(); + audioInfo.record.precision = getBitsPerSample(); + audioInfo.record.encoding = AUDIO_ENCODING_LINEAR; + + if ( ioctl( fileDescriptor, AUDIO_SETINFO, &audioInfo) == -1 ) { + + close(); + throw Exception( __FILE__, __LINE__, "ioctl error"); + } + + if ( audioInfo.record.channels != getChannel() ) { + close(); + throw Exception( __FILE__, __LINE__, + "can't set channels", audioInfo.record.channels); + } + + if ( audioInfo.record.precision != getBitsPerSample() ) { + close(); + throw Exception( __FILE__, __LINE__, + "can't set bits per sample", + audioInfo.record.precision); + } + + if ( audioInfo.record.sample_rate != getSampleRate() ) { + reportEvent( 2, "sound card recording sample rate set to ", + audioInfo.record.sample_rate, + " while trying to set it to ", getSampleRate()); + reportEvent( 2, "this is probably not a problem, but a slight " + "drift in the sound card driver"); + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Check wether read() would return anything + *----------------------------------------------------------------------------*/ +bool +SolarisDspSource :: canRead ( unsigned int sec, + unsigned int usec ) throw ( Exception ) +{ + fd_set fdset; + struct timeval tv; + int ret; + + if ( !isOpen() ) { + return false; + } + + if ( !running ) { + /* ugly workaround to get the dsp into recording state */ + unsigned char b[getChannel()*getBitsPerSample()/8]; + + read( b, getChannel()*getBitsPerSample()/8); + } + + FD_ZERO( &fdset); + FD_SET( fileDescriptor, &fdset); + tv.tv_sec = sec; + tv.tv_usec = usec; + + ret = select( fileDescriptor + 1, &fdset, NULL, NULL, &tv); + + if ( ret == -1 ) { + throw Exception( __FILE__, __LINE__, "select error"); + } + + return ret > 0; +} + + +/*------------------------------------------------------------------------------ + * Read from the audio source + *----------------------------------------------------------------------------*/ +unsigned int +SolarisDspSource :: read ( void * buf, + unsigned int len ) throw ( Exception ) +{ + ssize_t ret; + + if ( !isOpen() ) { + return 0; + } + + ret = ::read( fileDescriptor, buf, len); + + if ( ret == -1 ) { + throw Exception( __FILE__, __LINE__, "read error"); + } + + running = true; + return ret; +} + + +/*------------------------------------------------------------------------------ + * Close the audio source + *----------------------------------------------------------------------------*/ +void +SolarisDspSource :: close ( void ) throw ( Exception ) +{ + if ( !isOpen() ) { + return; + } + + ::close( fileDescriptor); + fileDescriptor = 0; + running = false; +} + +#endif // SUPPORT_SOLARIS_DSP + + +/*------------------------------------------------------------------------------ + + $Source$ + + $Log$ + Revision 1.1 2001/09/11 15:05:21 darkeye + added Solaris support + + + +------------------------------------------------------------------------------*/ + diff --git a/darkice/trunk/src/SolarisDspSource.h b/darkice/trunk/src/SolarisDspSource.h new file mode 100644 index 0000000..383a5a3 --- /dev/null +++ b/darkice/trunk/src/SolarisDspSource.h @@ -0,0 +1,260 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2000 Tyrell Corporation. All rights reserved. + + Tyrell DarkIce + + File : SolarisDspSource.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 SOLARIS_DSP_SOURCE_H +#define SOLARIS_DSP_SOURCE_H + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include "Reporter.h" +#include "AudioSource.h" + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An audio input based on Solaris /dev/audio devices + * + * @author $Author$ + * @version $Revision$ + */ +class SolarisDspSource : public AudioSource, public virtual Reporter +{ + private: + + /** + * The file name of the OSS DSP device (e.g. /dev/audio) + */ + char * fileName; + + /** + * The low-level file descriptor of the Solaris DSP device. + */ + int fileDescriptor; + + /** + * Indicates wether the low-level Solaris DSP device is in a recording + * state. + */ + bool running; + + + protected: + + /** + * Default constructor. Always throws an Exception. + * + * @exception Exception + */ + inline + SolarisDspSource ( void ) throw ( Exception ) + { + throw Exception( __FILE__, __LINE__); + } + + /** + * Initialize the object + * + * @param name the file name of the Solaris DSP device. + * @exception Exception + */ + void + init ( const char * name ) throw ( Exception ); + + /** + * De-iitialize the object + * + * @exception Exception + */ + void + strip ( void ) throw ( Exception ); + + + public: + + /** + * Constructor. + * + * @param name the file name of the Solaris DSP device + * (e.g. /dev/audio or /dev/sound/0) + * @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 + SolarisDspSource ( const char * name, + int sampleRate = 44100, + int bitsPerSample = 16, + int channel = 2 ) + throw ( Exception ) + + : AudioSource( sampleRate, bitsPerSample, channel) + { + init( name); + } + + /** + * Copy Constructor. + * + * @param source the object to copy. + * @exception Exception + */ + inline + SolarisDspSource ( const SolarisDspSource & ds ) + throw ( Exception ) + : AudioSource( ds ) + { + init( ds.fileName); + } + + /** + * Destructor. + * + * @exception Exception + */ + inline virtual + ~SolarisDspSource ( void ) throw ( Exception ) + { + strip(); + } + + /** + * Assignment operator. + * + * @param ds the object to assign to this one. + * @return a reference to this object. + * @exception Exception + */ + inline virtual SolarisDspSource & + operator= ( const SolarisDspSource & ds ) throw ( Exception ) + { + if ( this != &ds ) { + strip(); + AudioSource::operator=( ds); + init( ds.fileName); + } + return *this; + } + + /** + * Open the SolarisDspSource. + * This does not put the Solaris DSP device into recording mode. + * To start getting samples, call either canRead() or read(). + * + * @return true if opening was successful, false otherwise + * @exception Exception + * + * @see #canRead + * @see #read + */ + virtual bool + open ( void ) throw ( Exception ); + + /** + * Check if the SolarisDspSource is open. + * + * @return true if the SolarisDspSource is open, false otherwise. + */ + inline virtual bool + isOpen ( void ) const throw () + { + return fileDescriptor != 0; + } + + /** + * Check if the SolarisDspSource can be read from. + * Blocks until the specified time for data to be available. + * Puts the Solaris DSP device into recording mode. + * + * @param sec the maximum seconds to block. + * @param usec micro seconds to block after the full seconds. + * @return true if the SolarisDspSource is ready to be read from, + * false otherwise. + * @exception Exception + */ + virtual bool + canRead ( unsigned int sec, + unsigned int usec ) throw ( Exception ); + + /** + * Read from the SolarisDspSource. + * Puts the Solaris DSP device into recording mode. + * + * @param buf the buffer to read into. + * @param len the number of bytes to read into buf + * @return the number of bytes read (may be less than len). + * @exception Exception + */ + virtual unsigned int + read ( void * buf, + unsigned int len ) throw ( Exception ); + + /** + * Close the SolarisDspSource. + * + * @exception Exception + */ + virtual void + close ( void ) throw ( Exception ); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + + +#endif /* SOLARIS_DSP_SOURCE_H */ + + +/*------------------------------------------------------------------------------ + + $Source$ + + $Log$ + Revision 1.1 2001/09/11 15:05:21 darkeye + added Solaris support + + +------------------------------------------------------------------------------*/ + diff --git a/darkice/trunk/src/main.cpp b/darkice/trunk/src/main.cpp index 3721d05..f3f05bf 100644 --- a/darkice/trunk/src/main.cpp +++ b/darkice/trunk/src/main.cpp @@ -37,10 +37,10 @@ #include "config.h" #endif -#ifdef HAVE_GETOPT_H -#include +#ifdef HAVE_STDLIB_H +#include #else -#error need getopt.h +#error needs stdlib.h #endif #include @@ -94,15 +94,8 @@ main ( unsigned int verbosity = 1; int i; const char opts[] = "hc:v:"; - static struct option long_options[] = { - { "config", 1, 0, 'c'}, - { "help", 0, 0, 'h'}, - { "verbosity", 1, 0, 'v'}, - { 0, 0, 0, 0} - }; - - while ( (i = getopt_long( argc, argv, opts, long_options, 0)) != -1 ) { + while ( (i = getopt( argc, argv, opts)) != -1 ) { switch ( i ) { case 'c': configFileName = optarg; @@ -157,11 +150,11 @@ showUsage ( ostream & os ) << endl << "options:" << endl - << " -c, --config=config.file use configuration file config.file" + << " -c config.file use configuration file config.file" << endl - << " -v, --verbosity=number verbosity level (0 = silent, 10 = loud)" + << " -v n verbosity level (0 = silent, 10 = loud)" << endl - << " -h, --help print this message and exit" + << " -h print this message and exit" << endl << endl; } @@ -172,6 +165,9 @@ showUsage ( ostream & os ) $Source$ $Log$ + Revision 1.9 2001/09/11 15:05:21 darkeye + added Solaris support + Revision 1.8 2001/09/02 12:24:29 darkeye now displays usage info when no command line parameters given