This commit was manufactured by cvs2svn to create tag 'initial'.
This commit is contained in:
parent
5d9c8058da
commit
e39d40217f
|
@ -0,0 +1,252 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : AudioEncoder.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $AudioEncoder$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
An audio encoder
|
||||||
|
|
||||||
|
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_ENCODER_H
|
||||||
|
#define AUDIO_ENCODER_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Referable.h"
|
||||||
|
#include "AudioSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class AudioEncoder : public virtual Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
unsigned int inSampleRate;
|
||||||
|
unsigned int inBitsPerSample;
|
||||||
|
unsigned int inChannel;
|
||||||
|
|
||||||
|
unsigned int outBitrate;
|
||||||
|
unsigned int outSampleRate;
|
||||||
|
unsigned int outChannel;
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
init ( unsigned int inSampleRate,
|
||||||
|
unsigned int inBitsPerSample,
|
||||||
|
unsigned int inChannel,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate,
|
||||||
|
unsigned int outChannel ) throw ( Exception )
|
||||||
|
{
|
||||||
|
this->inSampleRate = inSampleRate;
|
||||||
|
this->inBitsPerSample = inBitsPerSample;
|
||||||
|
this->inChannel = inChannel;
|
||||||
|
this->outBitrate = outBitrate;
|
||||||
|
this->outSampleRate = outSampleRate;
|
||||||
|
this->outChannel = outChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioEncoder ( unsigned int inSampleRate,
|
||||||
|
unsigned int inBitsPerSample,
|
||||||
|
unsigned int inChannel,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0 )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
init ( inSampleRate,
|
||||||
|
inBitsPerSample,
|
||||||
|
inChannel,
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate ? outSampleRate : inSampleRate,
|
||||||
|
outChannel ? outChannel : inChannel );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioEncoder ( const AudioSource * as,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0 )
|
||||||
|
throw ( Exception)
|
||||||
|
{
|
||||||
|
init( as->getSampleRate(),
|
||||||
|
as->getBitsPerSample(),
|
||||||
|
as->getChannel(),
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate ? outSampleRate : as->getSampleRate(),
|
||||||
|
outChannel ? outChannel : as->getChannel() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioEncoder ( const AudioEncoder & encoder ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init ( encoder.inSampleRate,
|
||||||
|
encoder.inBitsPerSample,
|
||||||
|
encoder.inChannel,
|
||||||
|
encoder.outBitrate,
|
||||||
|
encoder.outSampleRate,
|
||||||
|
encoder.outChannel );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual AudioEncoder &
|
||||||
|
operator= ( const AudioEncoder & encoder ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &encoder ) {
|
||||||
|
strip();
|
||||||
|
|
||||||
|
init ( encoder.inSampleRate,
|
||||||
|
encoder.inBitsPerSample,
|
||||||
|
encoder.inChannel,
|
||||||
|
encoder.outBitrate,
|
||||||
|
encoder.outSampleRate,
|
||||||
|
encoder.outChannel );
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~AudioEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getInChannel ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return inChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getInSampleRate ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return inSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getInBitsPerSample ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return inBitsPerSample;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getOutChannel ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return outChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getOutSampleRate ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return outSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getOutBitrate ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return outBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
isRunning ( void ) const throw () = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
start ( void ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
stop ( void ) throw ( Exception ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENCODER_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:47 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,171 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : AudioSource.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Audio data input
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Source.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class AudioSource : public Source
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
unsigned int channel;
|
||||||
|
unsigned int sampleRate;
|
||||||
|
unsigned int bitsPerSample;
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
init ( unsigned int sampleRate,
|
||||||
|
unsigned int bitsPerSample,
|
||||||
|
unsigned int channel ) throw ( Exception )
|
||||||
|
{
|
||||||
|
this->sampleRate = sampleRate;
|
||||||
|
this->bitsPerSample = bitsPerSample;
|
||||||
|
this->channel = channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioSource ( unsigned int sampleRate = 44100,
|
||||||
|
unsigned int bitsPerSample = 16,
|
||||||
|
unsigned int channel = 2 )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
init ( sampleRate, bitsPerSample, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
AudioSource ( const AudioSource & as ) throw ( Exception )
|
||||||
|
: Source( as )
|
||||||
|
{
|
||||||
|
init ( as.sampleRate, as.bitsPerSample, as.channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual inline
|
||||||
|
~AudioSource ( void ) throw ( 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual AudioSource *
|
||||||
|
clone ( void ) const throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getChannel ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getSampleRate ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return sampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getBitsPerSample ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bitsPerSample;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AUDIO_SOURCE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:47 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,302 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : BufferedSink.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A Sink with a First-In First-Out buffer
|
||||||
|
This buffer can always be written to, it overwrites any
|
||||||
|
data contained if needed
|
||||||
|
The class is not thread-safe
|
||||||
|
|
||||||
|
the buffer is filled like this:
|
||||||
|
|
||||||
|
buffer bufferEnd
|
||||||
|
| |
|
||||||
|
+----------+--------------------------+--------------+
|
||||||
|
|<---- valid data -------->|
|
||||||
|
outp inp
|
||||||
|
|
||||||
|
buffer bufferEnd
|
||||||
|
| |
|
||||||
|
+----------------+--------------+--------------------+
|
||||||
|
-- valid data -->| |--- valid data ----->
|
||||||
|
inp outp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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 <string.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "BufferedSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
BufferedSink :: init ( Sink * sink,
|
||||||
|
unsigned int size ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !sink ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "no sink");
|
||||||
|
}
|
||||||
|
|
||||||
|
this->sink = sink; // create a reference
|
||||||
|
this->bufferSize = size;
|
||||||
|
this->buffer = new unsigned char[bufferSize];
|
||||||
|
this->bufferEnd = buffer + bufferSize;
|
||||||
|
this->inp = buffer;
|
||||||
|
this->outp = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Copy Constructor
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
BufferedSink :: BufferedSink ( const BufferedSink & buffer )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
init( buffer.sink.get(), buffer.bufferSize);
|
||||||
|
|
||||||
|
memcpy( this->buffer, buffer.buffer, this->bufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initalize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
BufferedSink :: strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
sink = 0; // delete the reference
|
||||||
|
delete buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Assignment operator
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
BufferedSink &
|
||||||
|
BufferedSink :: operator= ( const BufferedSink & buffer )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &buffer ) {
|
||||||
|
strip();
|
||||||
|
Sink::operator=( buffer );
|
||||||
|
init( buffer.sink.get(), buffer.bufferSize);
|
||||||
|
|
||||||
|
memcpy( this->buffer, buffer.buffer, this->bufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Store bufferSize bytes into the buffer
|
||||||
|
* All data is consumed. The return value is less then bufferSize only
|
||||||
|
* if the BufferedSink's internal buffer is smaller than bufferSize,
|
||||||
|
* thus can't hold that much
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
BufferedSink :: store ( const void * buffer,
|
||||||
|
unsigned int bufferSize ) throw ( Exception )
|
||||||
|
{
|
||||||
|
const unsigned char * buf;
|
||||||
|
unsigned int size;
|
||||||
|
unsigned int i;
|
||||||
|
unsigned char * oldInp;
|
||||||
|
|
||||||
|
if ( !buffer ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "buffer is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !bufferSize ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
oldInp = inp;
|
||||||
|
buf = (const unsigned char *) buffer;
|
||||||
|
|
||||||
|
/* cut the front of the supplied buffer if it wouldn't fit */
|
||||||
|
if ( bufferSize > this->bufferSize ) {
|
||||||
|
size = this->bufferSize - 1;
|
||||||
|
buf += bufferSize - size;
|
||||||
|
} else {
|
||||||
|
size = bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy the data into the buffer */
|
||||||
|
i = bufferEnd - inp;
|
||||||
|
if ( size <= i ) {
|
||||||
|
/* the place between inp and bufferEnd is
|
||||||
|
* big enough to hold the data */
|
||||||
|
|
||||||
|
memcpy( inp, buf, size);
|
||||||
|
inp = slidePointer( inp, size);
|
||||||
|
|
||||||
|
/* adjust outp, lose the data that was overwritten, if any */
|
||||||
|
if ( outp > oldInp && outp <= inp ) {
|
||||||
|
outp = slidePointer( inp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* the place between inp and bufferEnd is not
|
||||||
|
* big enough to hold the data
|
||||||
|
* writing will take place in two turns, once from
|
||||||
|
* inp -> bufferEnd, then from buffer -> */
|
||||||
|
|
||||||
|
memcpy( inp, buf, i);
|
||||||
|
i = size - i;
|
||||||
|
memcpy( this->buffer, buf, i);
|
||||||
|
inp = slidePointer( this->buffer, i);
|
||||||
|
|
||||||
|
/* adjust outp, lose the data that was overwritten, if any */
|
||||||
|
if ( outp <= oldInp ) {
|
||||||
|
if ( outp < inp ) {
|
||||||
|
outp = slidePointer( inp, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
outp = slidePointer( inp, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Write some data to the sink
|
||||||
|
* if len == 0, try to flush the buffer
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
BufferedSink :: write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int length;
|
||||||
|
|
||||||
|
if ( !buf ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "buf is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to write data from the buffer first, if any */
|
||||||
|
if ( inp != outp ) {
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
if ( outp > inp ) {
|
||||||
|
/* valuable data is between outp -> bufferEnd and buffer -> inp
|
||||||
|
* try to write the outp -> bufferEnd
|
||||||
|
* the rest will be written in the next if */
|
||||||
|
|
||||||
|
size = bufferEnd - outp;
|
||||||
|
length = sink->write( outp, size);
|
||||||
|
outp = slidePointer( outp, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( outp < inp ) {
|
||||||
|
/* valuable data is between outp and inp
|
||||||
|
* if the previous if wrote all data from the end
|
||||||
|
* this part will write the rest */
|
||||||
|
|
||||||
|
size = inp - outp;
|
||||||
|
length = sink->write( outp, size);
|
||||||
|
outp = slidePointer( outp, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the internal buffer is empty, try to write the fresh data */
|
||||||
|
length = inp == outp ? sink->write( buf, len) : 0;
|
||||||
|
|
||||||
|
if ( length < len ) {
|
||||||
|
/* if not all fresh could be written, store the remains */
|
||||||
|
|
||||||
|
unsigned char * b = (unsigned char *) buf;
|
||||||
|
|
||||||
|
store( b + length, len - length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tell them we ate everything */
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Close the sink, lose all pending data
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
BufferedSink :: close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
flush();
|
||||||
|
sink->close();
|
||||||
|
inp = outp = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:48 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : BufferedSink.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A Sink First-In First-Out buffer
|
||||||
|
This buffer can always be written to, it overwrites any
|
||||||
|
data contained if needed
|
||||||
|
The class is not thread-safe
|
||||||
|
|
||||||
|
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 BUFFERED_SINK_H
|
||||||
|
#define BUFFERED_SINK_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class BufferedSink : public Sink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
unsigned char * buffer;
|
||||||
|
unsigned char * bufferEnd;
|
||||||
|
unsigned int bufferSize;
|
||||||
|
|
||||||
|
unsigned char * inp;
|
||||||
|
unsigned char * outp;
|
||||||
|
|
||||||
|
|
||||||
|
Ref<Sink> sink;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( Sink * sink,
|
||||||
|
unsigned int size ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned char *
|
||||||
|
slidePointer (
|
||||||
|
unsigned char * p,
|
||||||
|
unsigned int offset ) throw ()
|
||||||
|
{
|
||||||
|
p += offset;
|
||||||
|
while ( p >= bufferEnd ) {
|
||||||
|
p -= bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
BufferedSink ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getSize ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
store ( const void * buffer,
|
||||||
|
unsigned int bufferSize ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
BufferedSink ( Sink * sink,
|
||||||
|
unsigned int size ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( sink, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BufferedSink ( const BufferedSink & buffer ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~BufferedSink ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual BufferedSink &
|
||||||
|
operator= ( const BufferedSink & bs ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual BufferedSink *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new BufferedSink(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return sink->open();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return sink->isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual void
|
||||||
|
flush ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned char b[0];
|
||||||
|
|
||||||
|
write( b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* BUFFERED_SINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:48 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : CastSink.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Data output to a ShoutCast / IceCast / etc. server
|
||||||
|
|
||||||
|
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 "Util.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "CastSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
CastSink :: init ( TcpSocket * socket,
|
||||||
|
const char * password,
|
||||||
|
const char * mountPoint,
|
||||||
|
const char * name,
|
||||||
|
const char * description,
|
||||||
|
const char * url,
|
||||||
|
const char * genre,
|
||||||
|
unsigned int bitRate,
|
||||||
|
bool isPublic,
|
||||||
|
unsigned int bufferDuration )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
this->socket = socket;
|
||||||
|
this->password = Util::strDup( password);
|
||||||
|
this->mountPoint = Util::strDup( mountPoint);
|
||||||
|
this->name = Util::strDup( name);
|
||||||
|
this->description = Util::strDup( description);
|
||||||
|
this->url = Util::strDup( url);
|
||||||
|
this->genre = Util::strDup( genre);
|
||||||
|
this->bitRate = bitRate;
|
||||||
|
this->isPublic = isPublic;
|
||||||
|
this->bufferDuration = bufferDuration;
|
||||||
|
|
||||||
|
bufferedSink = new BufferedSink( socket,
|
||||||
|
(bitRate * 1024 / 8) * bufferDuration );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
CastSink :: strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] password;
|
||||||
|
delete[] mountPoint;
|
||||||
|
delete[] name;
|
||||||
|
delete[] description;
|
||||||
|
delete[] url;
|
||||||
|
delete[] genre;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the connection
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
CastSink :: open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !bufferedSink->open() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !sendLogin() ) {
|
||||||
|
close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:48 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,326 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : CastSink.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Data output to a ShoutCast / IceCast / etc. server
|
||||||
|
|
||||||
|
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 CAST_SINK_H
|
||||||
|
#define CAST_SINK_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
#include "TcpSocket.h"
|
||||||
|
#include "BufferedSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class CastSink : public Sink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Ref<TcpSocket> socket;
|
||||||
|
Ref<BufferedSink> bufferedSink;
|
||||||
|
char * password;
|
||||||
|
char * mountPoint;
|
||||||
|
|
||||||
|
char * name;
|
||||||
|
char * description;
|
||||||
|
char * url;
|
||||||
|
char * genre;
|
||||||
|
unsigned int bitRate;
|
||||||
|
bool isPublic;
|
||||||
|
unsigned int bufferDuration;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( TcpSocket * socket,
|
||||||
|
const char * password,
|
||||||
|
const char * mountPoint,
|
||||||
|
const char * name,
|
||||||
|
const char * description,
|
||||||
|
const char * url,
|
||||||
|
const char * genre,
|
||||||
|
unsigned int bitRate,
|
||||||
|
bool isPublic,
|
||||||
|
unsigned int bufferDuration )
|
||||||
|
throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
CastSink ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
sendLogin ( void ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
CastSink ( TcpSocket * socket,
|
||||||
|
const char * password,
|
||||||
|
const char * mountPoint,
|
||||||
|
const char * name,
|
||||||
|
const char * description,
|
||||||
|
const char * url,
|
||||||
|
const char * genre,
|
||||||
|
unsigned int bitRate,
|
||||||
|
bool isPublic,
|
||||||
|
unsigned int bufferDuration = 10 )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
init( socket,
|
||||||
|
password,
|
||||||
|
mountPoint,
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
genre,
|
||||||
|
bitRate,
|
||||||
|
isPublic,
|
||||||
|
bufferDuration );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
CastSink( const CastSink & cs ) throw ( Exception )
|
||||||
|
: Sink( cs )
|
||||||
|
{
|
||||||
|
init( cs.socket.get(),
|
||||||
|
cs.password,
|
||||||
|
cs.mountPoint,
|
||||||
|
cs.name,
|
||||||
|
cs.description,
|
||||||
|
cs.url,
|
||||||
|
cs.genre,
|
||||||
|
cs.bitRate,
|
||||||
|
cs.isPublic,
|
||||||
|
cs.bufferDuration );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~CastSink( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual CastSink &
|
||||||
|
operator= ( const CastSink & cs ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &cs ) {
|
||||||
|
strip();
|
||||||
|
Sink::operator=( cs );
|
||||||
|
init( cs.socket.get(),
|
||||||
|
cs.password,
|
||||||
|
cs.mountPoint,
|
||||||
|
cs.name,
|
||||||
|
cs.description,
|
||||||
|
cs.url,
|
||||||
|
cs.genre,
|
||||||
|
cs.bitRate,
|
||||||
|
cs.isPublic,
|
||||||
|
cs.bufferDuration );
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual CastSink *
|
||||||
|
clone ( void ) const throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
inline Sink *
|
||||||
|
getSink ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bufferedSink.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline TcpSocket *
|
||||||
|
getSocket ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return socket.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bufferedSink->isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return bufferedSink->canWrite( sec, usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return bufferedSink->write( buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual void
|
||||||
|
flush ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return bufferedSink->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual void
|
||||||
|
close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return bufferedSink->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getPassword ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getMountPoint ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return mountPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getDescription ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getUrl ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getGenre ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return genre;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getBitRate ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bitRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
getIsPublic ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return isPublic;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getBufferDuration ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return bufferDuration;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CAST_SINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:48 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,341 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Connector.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Connects a source to a sink
|
||||||
|
|
||||||
|
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 "Exception.h"
|
||||||
|
#include "Connector.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Connector :: init ( Source * source ) throw ( Exception )
|
||||||
|
{
|
||||||
|
this->source = source;
|
||||||
|
this->sinks = 0;
|
||||||
|
this->numSinks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Connector :: strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
source = 0;
|
||||||
|
|
||||||
|
if ( sinks ) {
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
sinks[u] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] sinks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Connector :: Connector ( const Connector & connector ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
init( connector.source.get());
|
||||||
|
|
||||||
|
for ( u = 0; u < connector.numSinks; ++u ) {
|
||||||
|
attach( connector.sinks[u].get() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Assignment operator
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Connector &
|
||||||
|
Connector :: operator= ( const Connector & connector ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &connector ) {
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
/* first free everything */
|
||||||
|
strip();
|
||||||
|
|
||||||
|
/* then fill in */
|
||||||
|
init( connector.source.get() );
|
||||||
|
|
||||||
|
for ( u = 0; u < connector.numSinks; ++u ) {
|
||||||
|
attach( connector.sinks[u].get() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Attach a sink to the connector
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Connector :: attach ( Sink * sink ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !sinks ) {
|
||||||
|
|
||||||
|
numSinks = 1;
|
||||||
|
sinks = new Ref<Sink>[1];
|
||||||
|
sinks[0] = sink;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
unsigned int u;
|
||||||
|
Ref<Sink> * s = new Ref<Sink>[numSinks + 1];
|
||||||
|
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
s[u] = sinks[u].get();
|
||||||
|
}
|
||||||
|
|
||||||
|
s[numSinks] = sink;
|
||||||
|
delete[] sinks;
|
||||||
|
sinks = s;
|
||||||
|
++numSinks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Detach a sink to the connector
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
Connector :: detach ( Sink * sink ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( numSinks == 0 ) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} else if ( numSinks == 1 ) {
|
||||||
|
|
||||||
|
sinks[0] = 0;
|
||||||
|
delete[] sinks;
|
||||||
|
sinks = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
unsigned int u;
|
||||||
|
unsigned int v;
|
||||||
|
unsigned int ix;
|
||||||
|
Ref<Sink> * s;
|
||||||
|
|
||||||
|
ix = numSinks;
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
|
||||||
|
if ( sinks[u].get() == sink ) {
|
||||||
|
ix = u;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ix == numSinks ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = new Ref<Sink>[numSinks - 1];
|
||||||
|
for ( u = 0, v = 0; u < numSinks; ++u ) {
|
||||||
|
|
||||||
|
if ( u != ix ) {
|
||||||
|
s[v++] = sinks[u];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sinks[ix] = 0;
|
||||||
|
delete[] sinks;
|
||||||
|
sinks = s;
|
||||||
|
--numSinks;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the source and all the sinks if needed
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
Connector :: open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
if ( !source->isOpen() ) {
|
||||||
|
if ( !source->open() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
if ( !sinks[u]->isOpen() ) {
|
||||||
|
if ( !sinks[u]->open() ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if not all could be opened, close those that were */
|
||||||
|
if ( u < numSinks ) {
|
||||||
|
unsigned int v;
|
||||||
|
|
||||||
|
for ( v = 0; v < u; ++v ) {
|
||||||
|
sinks[v]->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
source->close();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Transfer some data from the source to the sink
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
Connector :: transfer ( unsigned int bytes,
|
||||||
|
unsigned int bufSize,
|
||||||
|
unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
unsigned int b;
|
||||||
|
unsigned char buf[bufSize];
|
||||||
|
|
||||||
|
if ( numSinks == 0 ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( bufSize == 0 ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( b = 0; b < bytes; ) {
|
||||||
|
unsigned int d = 0;
|
||||||
|
unsigned int e = 0;
|
||||||
|
|
||||||
|
if ( source->canRead( sec, usec) ) {
|
||||||
|
d = source->read( buf, bufSize);
|
||||||
|
|
||||||
|
/* check for EOF */
|
||||||
|
if ( d == 0 ) {
|
||||||
|
cout << "Connector :: transfer, EOF" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
|
||||||
|
if ( sinks[u]->canWrite( sec, usec) ) {
|
||||||
|
e = sinks[u]->write( buf, d);
|
||||||
|
} else {
|
||||||
|
sinks[u]->close();
|
||||||
|
detach( sinks[u].get() );
|
||||||
|
/* with the call to detach, numSinks gets 1 lower,
|
||||||
|
* and the next sink comes to sinks[u] */
|
||||||
|
--u;
|
||||||
|
|
||||||
|
if ( numSinks == 0 ) {
|
||||||
|
cout << "Connector :: transfer, no more sinks" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b += d;
|
||||||
|
} else {
|
||||||
|
cout << "Connector :: transfer, can't read" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the source and all the sinks if needed
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Connector :: close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
source->close();
|
||||||
|
for ( u = 0; u < numSinks; ++u ) {
|
||||||
|
sinks[u]->close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:49 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,172 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Connector.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Connects a source to a sink
|
||||||
|
|
||||||
|
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 CONNECTOR_H
|
||||||
|
#define CONNECTOR_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Referable.h"
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Source.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Connector : public virtual Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Ref<Source> source;
|
||||||
|
|
||||||
|
|
||||||
|
Ref<Sink> * sinks;
|
||||||
|
unsigned int numSinks;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( Source * source ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Connector ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Connector ( Source * source ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Connector ( Source * source,
|
||||||
|
Sink * sink ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( source);
|
||||||
|
attach( sink);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Connector ( const Connector & connector ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~Connector( void )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual Connector &
|
||||||
|
operator= ( const Connector & connector ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getNumSinks ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return numSinks;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
attach ( Sink * sink ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
detach ( Sink * sink ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
transfer ( unsigned int bytes,
|
||||||
|
unsigned int bufSize,
|
||||||
|
unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CONNECTOR_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:49 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : darkice.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Program main object
|
||||||
|
|
||||||
|
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 <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <iostream.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "DarkIce.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
DarkIce :: init ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
/* the pipes */
|
||||||
|
encOutPipe = new PipeSource( "enc.out");
|
||||||
|
encInPipe = new PipeSink( "enc.in");
|
||||||
|
|
||||||
|
if ( !encOutPipe->exists() ) {
|
||||||
|
if ( !encOutPipe->create() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't create out pipe");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !encInPipe->exists() ) {
|
||||||
|
if ( !encInPipe->create() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't create in pipe");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* encoder related stuff */
|
||||||
|
dsp = new OssDspSource( "/dev/dsp", 22050, 16, 2);
|
||||||
|
encIn = new BufferedSink( encInPipe.get(), 64 * 1024);
|
||||||
|
encConnector = new Connector( dsp.get(), encInPipe.get());
|
||||||
|
encoder = new LameEncoder( "notlame",
|
||||||
|
encInPipe->getFileName(),
|
||||||
|
dsp.get(),
|
||||||
|
encOutPipe->getFileName(),
|
||||||
|
96 );
|
||||||
|
|
||||||
|
|
||||||
|
/* streaming related stuff */
|
||||||
|
socket = new TcpSocket( "susi", 8000);
|
||||||
|
ice = new IceCast( socket.get(),
|
||||||
|
"hackme",
|
||||||
|
"sample",
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"http://ez.az/",
|
||||||
|
"sajat",
|
||||||
|
128,
|
||||||
|
false );
|
||||||
|
shoutConnector = new Connector( encOutPipe.get(), ice.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Run the encoder
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
DarkIce :: encode ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
|
encoder->start();
|
||||||
|
|
||||||
|
sleep( 1 );
|
||||||
|
|
||||||
|
if ( !encConnector->open() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't open connector");
|
||||||
|
}
|
||||||
|
|
||||||
|
len = encConnector->transfer( 22050 * 2 * 2 * 120, 4096, 1, 0 );
|
||||||
|
|
||||||
|
cout << len << " bytes transfered" << endl;
|
||||||
|
|
||||||
|
encConnector->close();
|
||||||
|
|
||||||
|
encoder->stop();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Run the encoder
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
DarkIce :: shout ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
|
if ( !shoutConnector->open() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't open connector");
|
||||||
|
}
|
||||||
|
|
||||||
|
len = shoutConnector->transfer( 128 * 1024 / 8 * 120, 4096, 1, 0 );
|
||||||
|
|
||||||
|
cout << len << " bytes transfered" << endl;
|
||||||
|
|
||||||
|
shoutConnector->close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Run
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
DarkIce :: run ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
cout << "DarkIce" << endl << endl << flush;
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
cout << "init OK" << endl << flush;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if ( pid == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "fork error", errno);
|
||||||
|
|
||||||
|
} else if ( pid == 0 ) {
|
||||||
|
// this is the child
|
||||||
|
|
||||||
|
sleep ( 2 );
|
||||||
|
|
||||||
|
cout << "shouting" << endl << flush;
|
||||||
|
shout();
|
||||||
|
cout << "shouting ends" << endl << flush;
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
// this is the parent
|
||||||
|
int status;
|
||||||
|
|
||||||
|
cout << "encoding" << endl << flush;
|
||||||
|
encode();
|
||||||
|
cout << "encoding ends" << endl << flush;
|
||||||
|
|
||||||
|
waitpid( pid, &status, 0);
|
||||||
|
if ( !WIFEXITED(status) ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"child exited abnormally", WEXITSTATUS(status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:49 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : DarkIce.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Program main object
|
||||||
|
|
||||||
|
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 DARK_ICE_H
|
||||||
|
#define DARK_ICE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include <iostream.h>
|
||||||
|
|
||||||
|
#include "Referable.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "OssDspSource.h"
|
||||||
|
#include "PipeSink.h"
|
||||||
|
#include "BufferedSink.h"
|
||||||
|
#include "Connector.h"
|
||||||
|
#include "LameEncoder.h"
|
||||||
|
#include "PipeSource.h"
|
||||||
|
#include "TcpSocket.h"
|
||||||
|
#include "IceCast.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class DarkIce : public virtual Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Ref<OssDspSource> dsp;
|
||||||
|
Ref<PipeSink> encInPipe;
|
||||||
|
Ref<BufferedSink> encIn;
|
||||||
|
Ref<Connector> encConnector;
|
||||||
|
Ref<LameEncoder> encoder;
|
||||||
|
|
||||||
|
Ref<PipeSource> encOutPipe;
|
||||||
|
Ref<TcpSocket> socket;
|
||||||
|
Ref<IceCast> ice;
|
||||||
|
Ref<Connector> shoutConnector;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
encode ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
shout ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/*
|
||||||
|
virtual void
|
||||||
|
showUsage ( ostream & os ) throw ( Exception );
|
||||||
|
*/
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
DarkIce ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
DarkIce ( int argc,
|
||||||
|
char * argv[] ) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~DarkIce ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
inline
|
||||||
|
DarkIce ( const DarkIce & di ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline DarkIce &
|
||||||
|
operator= ( const DarkIce * di ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual int
|
||||||
|
run ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* DARK_ICE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:50 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Exception.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
An exception class
|
||||||
|
|
||||||
|
This class should not depend on any other class
|
||||||
|
(note: Cloneable is an interface) and should not throw
|
||||||
|
any exceptions itself
|
||||||
|
|
||||||
|
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 <string.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Exception :: init ( const char * file,
|
||||||
|
unsigned int line,
|
||||||
|
const char * description = 0,
|
||||||
|
int code = 0 ) throw ()
|
||||||
|
{
|
||||||
|
if ( !file ) {
|
||||||
|
this->file = 0;
|
||||||
|
} else {
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = strlen( file ) + 1;
|
||||||
|
this->file = new char[len];
|
||||||
|
if ( this->file ) {
|
||||||
|
memcpy( this->file, file, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !description ) {
|
||||||
|
this->description = 0;
|
||||||
|
} else {
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = strlen( description ) + 1;
|
||||||
|
this->description = new char[len];
|
||||||
|
if ( this->description ) {
|
||||||
|
memcpy( this->description, description, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->line = line;
|
||||||
|
this->code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
Exception :: strip ( void ) throw ()
|
||||||
|
{
|
||||||
|
if ( description ) {
|
||||||
|
delete[] description;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( file ) {
|
||||||
|
delete[] file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:50 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Exception.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
An exception class
|
||||||
|
|
||||||
|
This class should not depend on any other class
|
||||||
|
(note: Cloneable is an interface) and should not throw
|
||||||
|
any exceptions itself
|
||||||
|
|
||||||
|
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 EXCEPTION_H
|
||||||
|
#define EXCEPTION_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include <iostream.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Exception
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * file;
|
||||||
|
unsigned int line;
|
||||||
|
char * description;
|
||||||
|
int code;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * file,
|
||||||
|
unsigned int line,
|
||||||
|
const char * description,
|
||||||
|
int code ) throw ();
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip () throw ();
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Exception ( void ) throw ()
|
||||||
|
{
|
||||||
|
init( 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Exception ( const Exception & e ) throw ()
|
||||||
|
{
|
||||||
|
init( e.file, e.line, e.description, e.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Exception ( const char * description,
|
||||||
|
int code = 0 ) throw ()
|
||||||
|
{
|
||||||
|
init( 0, 0, description, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Exception ( const char * file,
|
||||||
|
unsigned int line,
|
||||||
|
const char * description = 0,
|
||||||
|
int code = 0 ) throw ()
|
||||||
|
{
|
||||||
|
init( file, line, description, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
~Exception ( void ) throw ()
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Exception &
|
||||||
|
operator= ( const Exception & e ) throw ()
|
||||||
|
{
|
||||||
|
if ( this != &e ) {
|
||||||
|
strip();
|
||||||
|
init( e.file, e.line, e.description, e.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getDescription( void ) const throw ()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getLine ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getFile ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
getCode ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Print a Exception to an ostream
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
inline ostream &
|
||||||
|
operator<< ( ostream & os,
|
||||||
|
const Exception & e )
|
||||||
|
{
|
||||||
|
os << e.getDescription() << " [" << e.getCode() << "] ("
|
||||||
|
<< e.getFile() << ":" << e.getLine() << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* EXCEPTION_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:50 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : ExternalEncoder.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A class representing an external audio encoder which is invoked
|
||||||
|
with a frok() and an exec() call
|
||||||
|
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Util.h"
|
||||||
|
#include "ExternalEncoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define ARG_LEN 64
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ExternalEncoder :: init ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
const char * outFileName ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
for ( u = 0; u < numCmdArgs; ++u ) {
|
||||||
|
cmdArgs[u] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->encoderName = Util::strDup( encoderName);
|
||||||
|
this->inFileName = Util::strDup( inFileName);
|
||||||
|
this->outFileName = Util::strDup( outFileName);
|
||||||
|
this->child = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ExternalEncoder :: strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
|
||||||
|
if ( isRunning() ) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( u = 0; u < numCmdArgs; ++u ) {
|
||||||
|
if ( cmdArgs[u] ) {
|
||||||
|
delete[] cmdArgs[u];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] encoderName;
|
||||||
|
delete[] inFileName;
|
||||||
|
delete[] outFileName;
|
||||||
|
child = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set the nth command line argument
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ExternalEncoder :: setArg ( const char * str,
|
||||||
|
unsigned int index ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( index >= numCmdArgs ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "index >= numCmdArgs", index);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdArgs[index] = str ? Util::strDup( str) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Start the encoding
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
ExternalEncoder :: start ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
if ( isRunning() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if ( pid == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "fork error");
|
||||||
|
} else if ( pid == 0 ) {
|
||||||
|
cout << "wow, I'm a voodoo child!" << endl;
|
||||||
|
|
||||||
|
makeArgs();
|
||||||
|
execvp( getEncoderName(), cmdArgs);
|
||||||
|
|
||||||
|
throw Exception( __FILE__, __LINE__, "exec returned");
|
||||||
|
} else {
|
||||||
|
child = pid;
|
||||||
|
cout << "I'm a parent, the child's pid is " << child << endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* End the encoding
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ExternalEncoder :: stop ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isRunning() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( kill( child, SIGHUP) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "kill", errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:50 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : ExternalEncoder.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $ExternalEncoder$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A class representing an external audio encoder which is invoked
|
||||||
|
with a frok() and an exec() call
|
||||||
|
|
||||||
|
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 EXTERNAL_ENCODER_H
|
||||||
|
#define EXTERNAL_ENCODER_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "AudioEncoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class ExternalEncoder : public AudioEncoder
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * encoderName;
|
||||||
|
char * inFileName;
|
||||||
|
char * outFileName;
|
||||||
|
|
||||||
|
static const unsigned int numCmdArgs = 32;
|
||||||
|
|
||||||
|
char * cmdArgs[numCmdArgs];
|
||||||
|
|
||||||
|
pid_t child;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
const char * outFileName ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
ExternalEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setArg ( const char * str,
|
||||||
|
unsigned int index ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
makeArgs ( void ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
ExternalEncoder ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
unsigned int inSampleRate,
|
||||||
|
unsigned int inBitsPerSample,
|
||||||
|
unsigned int inChannel,
|
||||||
|
const char * outFileName,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0 )
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: AudioEncoder ( inSampleRate,
|
||||||
|
inBitsPerSample,
|
||||||
|
inChannel,
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init ( encoderName, inFileName, outFileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
ExternalEncoder ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
const AudioSource * as,
|
||||||
|
const char * outFileName,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0 )
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: AudioEncoder ( as,
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init ( encoderName, inFileName, outFileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
ExternalEncoder ( const ExternalEncoder & encoder )
|
||||||
|
throw ( Exception )
|
||||||
|
: AudioEncoder( encoder )
|
||||||
|
{
|
||||||
|
init( encoder.encoderName,
|
||||||
|
encoder.inFileName,
|
||||||
|
encoder.outFileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~ExternalEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual ExternalEncoder &
|
||||||
|
operator= ( const ExternalEncoder & encoder ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &encoder ) {
|
||||||
|
strip();
|
||||||
|
AudioEncoder::operator=( encoder);
|
||||||
|
init( encoder.encoderName,
|
||||||
|
encoder.inFileName,
|
||||||
|
encoder.outFileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual ExternalEncoder *
|
||||||
|
clone ( void ) const throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
getEncoderName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return encoderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
getInFileName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return inFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
getOutFileName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return outFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isRunning ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return child != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
start ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
stop ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* EXTERNAL_ENCODER_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:50 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,280 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FileSink.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
File data output
|
||||||
|
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#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.1 2000/11/05 10:05:51 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,182 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FileSink.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
File data output
|
||||||
|
|
||||||
|
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 FILE_SINK_H
|
||||||
|
#define FILE_SINK_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Sink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class FileSink : public Sink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * fileName;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * name ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
int fileDescriptor;
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
FileSink ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
FileSink( const char * name ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FileSink( const FileSink & fsink ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~FileSink( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual FileSink &
|
||||||
|
operator= ( const FileSink & fs ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual FileSink *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new FileSink(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getFileName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
exists ( void ) const throw ();
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
create ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return fileDescriptor != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual void
|
||||||
|
flush ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FILE_SINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:51 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,240 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FileSource.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Data input from a file
|
||||||
|
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#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.1 2000/11/05 10:05:51 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FileSource.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Data input from a file
|
||||||
|
|
||||||
|
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 FILE_SOURCE_H
|
||||||
|
#define FILE_SOURCE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Source.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* A data source based on a file
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class FileSource : public Source
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * fileName;
|
||||||
|
int fileDescriptor;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * name ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
FileSource ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
FileSource ( const char * name ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FileSource ( const FileSource & fs ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
~FileSource ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual FileSource &
|
||||||
|
operator= ( const FileSource & fs ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual const char *
|
||||||
|
getFileName ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
exists ( void ) const throw ();
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return fileDescriptor != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canRead ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
read ( void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FILE_SOURCE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:51 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : IceCast.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Class representing output to an IceCast server with
|
||||||
|
x-audiocast login
|
||||||
|
|
||||||
|
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 <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Source.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
#include "IceCast.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Size of string conversion buffer
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define STRBUF_SIZE 32
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
IceCast :: sendLogin ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
Sink * sink = getSink();
|
||||||
|
Source * source = getSocket();
|
||||||
|
const char * str;
|
||||||
|
char resp[STRBUF_SIZE];
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
|
if ( !source->isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !sink->isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send the request, a string like:
|
||||||
|
* "SOURCE <password> /<mountpoint>\n\n" */
|
||||||
|
str = "SOURCE ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getPassword();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = " /";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getMountPoint();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = "\n\n";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
sink->flush();
|
||||||
|
|
||||||
|
/* read the anticipated response: "OK" */
|
||||||
|
len = source->read( resp, STRBUF_SIZE);
|
||||||
|
if ( len < 2 || resp[0] != 'O' || resp[1] != 'K' ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* suck anything that the other side has to say */
|
||||||
|
while ( source->canRead( 0, 0) &&
|
||||||
|
(len = source->read( resp, STRBUF_SIZE)) ) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send the x-audiocast headers */
|
||||||
|
str = "x-audiocast-name: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getName();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
|
||||||
|
str = "\nx-audiocast-description: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getDescription();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
|
||||||
|
str = "\nx-audiocast-url: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getUrl();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
|
||||||
|
str = "\nx-audiocast-genre: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getGenre();
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
|
||||||
|
str = "\nx-audiocast-bitrate: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
if ( snprintf( resp, STRBUF_SIZE, "%d", getBitRate()) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
sink->write( resp, strlen( resp));
|
||||||
|
|
||||||
|
str = "\nx-audiocast-public: ";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
str = getIsPublic() ? "yes" : "no";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
|
||||||
|
str = "\n\n";
|
||||||
|
sink->write( str, strlen( str));
|
||||||
|
sink->flush();
|
||||||
|
|
||||||
|
/* read the anticipated response: "OK" */
|
||||||
|
len = source->read( resp, STRBUF_SIZE);
|
||||||
|
if ( len < 2 || resp[0] != 'O' || resp[1] != 'K' ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* suck anything that the other side has to say */
|
||||||
|
while ( source->canRead( 0, 0) &&
|
||||||
|
(len = source->read( resp, STRBUF_SIZE)) ) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:52 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,158 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : IceCast.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Class representing output to an IceCast server with
|
||||||
|
x-audiocast login
|
||||||
|
|
||||||
|
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 ICE_CAST_H
|
||||||
|
#define ICE_CAST_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Sink.h"
|
||||||
|
#include "TcpSocket.h"
|
||||||
|
#include "CastSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class IceCast : public CastSink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
IceCast ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
sendLogin ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
IceCast ( TcpSocket * socket,
|
||||||
|
const char * password,
|
||||||
|
const char * mountPoint,
|
||||||
|
const char * name,
|
||||||
|
const char * description,
|
||||||
|
const char * url,
|
||||||
|
const char * genre,
|
||||||
|
unsigned int bitRate,
|
||||||
|
bool isPublic,
|
||||||
|
unsigned int bufferDuration = 10 )
|
||||||
|
throw ( Exception )
|
||||||
|
: CastSink( socket,
|
||||||
|
password,
|
||||||
|
mountPoint,
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
genre,
|
||||||
|
bitRate,
|
||||||
|
isPublic,
|
||||||
|
bufferDuration )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
IceCast( const IceCast & cs ) throw ( Exception )
|
||||||
|
: CastSink( cs )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~IceCast( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual IceCast &
|
||||||
|
operator= ( const IceCast & cs ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &cs ) {
|
||||||
|
CastSink::operator=( cs );
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual IceCast *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new IceCast( *this );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ICE_CAST_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:52 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : LameEncoder.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A class representing the lame mp3 encoder
|
||||||
|
|
||||||
|
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 <stdio.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "LameEncoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define ARG_LEN 64
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize command line parameters
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
LameEncoder :: makeArgs ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
char str[ARG_LEN];
|
||||||
|
|
||||||
|
u = 0;
|
||||||
|
|
||||||
|
setArg( getEncoderName(), u++); // name of the command
|
||||||
|
setArg( "-S", u++); // make it silent
|
||||||
|
setArg( "-r", u++); // input is raw PCM
|
||||||
|
setArg( "-x", u++); // input is little endian
|
||||||
|
setArg( "-h", u++); // high quality
|
||||||
|
|
||||||
|
/* set input sample rate */
|
||||||
|
if ( snprintf( str, ARG_LEN, "%.3f",
|
||||||
|
((double)getInSampleRate()) / 1000.0 ) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
setArg( "-s", u++);
|
||||||
|
setArg( str, u++);
|
||||||
|
|
||||||
|
/* set stereo / mono */
|
||||||
|
setArg( "-m", u++);
|
||||||
|
setArg( getOutChannel() == 1 ? "m" : "j", u++);
|
||||||
|
|
||||||
|
/* set output bitrate */
|
||||||
|
if ( snprintf( str, ARG_LEN, "%d", getOutBitrate()) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
setArg( "-b", u++);
|
||||||
|
setArg( str, u++);
|
||||||
|
|
||||||
|
/* set output sample rate */
|
||||||
|
if ( snprintf( str, ARG_LEN, "%.3f",
|
||||||
|
((double)getOutSampleRate()) / 1000.0 ) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
setArg( "--resample", u++);
|
||||||
|
setArg( str, u++);
|
||||||
|
|
||||||
|
/* set lowpass filter if needed */
|
||||||
|
if ( lowpass ) {
|
||||||
|
if ( snprintf( str, ARG_LEN, "%.3f",
|
||||||
|
((double)getLowpass()) / 1000.0 ) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
setArg( "--lowpass", u++);
|
||||||
|
setArg( str, u++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set highpass filter if needed */
|
||||||
|
if ( highpass ) {
|
||||||
|
if ( snprintf( str, ARG_LEN, "%.3f",
|
||||||
|
((double)getHighpass()) / 1000.0 ) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "snprintf overflow");
|
||||||
|
}
|
||||||
|
setArg( "--highpass", u++);
|
||||||
|
setArg( str, u++);
|
||||||
|
}
|
||||||
|
|
||||||
|
setArg( getInFileName(), u++); // input file
|
||||||
|
setArg( getOutFileName(), u++); // output file
|
||||||
|
|
||||||
|
setArg( 0, u++); // terminating zero
|
||||||
|
|
||||||
|
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:52 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,244 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : LameEncoder.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $LameEncoder$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A class representing the lame mp3 encoder
|
||||||
|
|
||||||
|
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 LAME_ENCODER_H
|
||||||
|
#define LAME_ENCODER_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "ExternalEncoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class LameEncoder : public ExternalEncoder
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
unsigned int lowpass;
|
||||||
|
unsigned int highpass;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
makeArgs ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
LameEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
init ( unsigned int lowpass,
|
||||||
|
unsigned int highpass ) throw ( Exception )
|
||||||
|
{
|
||||||
|
this->lowpass = lowpass;
|
||||||
|
this->highpass = highpass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
LameEncoder ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
unsigned int inSampleRate,
|
||||||
|
unsigned int inBitsPerSample,
|
||||||
|
unsigned int inChannel,
|
||||||
|
const char * outFileName,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0,
|
||||||
|
unsigned int lowpass = 0,
|
||||||
|
unsigned int highpass = 0 )
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: ExternalEncoder ( encoderName,
|
||||||
|
inFileName,
|
||||||
|
inSampleRate,
|
||||||
|
inBitsPerSample,
|
||||||
|
inChannel,
|
||||||
|
outFileName,
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init( lowpass, highpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
LameEncoder ( const char * encoderName,
|
||||||
|
const char * inFileName,
|
||||||
|
const AudioSource * as,
|
||||||
|
const char * outFileName,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0,
|
||||||
|
unsigned int lowpass = 0,
|
||||||
|
unsigned int highpass = 0 )
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: ExternalEncoder ( encoderName,
|
||||||
|
inFileName,
|
||||||
|
as,
|
||||||
|
outFileName,
|
||||||
|
outBitrate,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init( lowpass, highpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
LameEncoder ( const LameEncoder & encoder ) throw ( Exception )
|
||||||
|
: ExternalEncoder( encoder )
|
||||||
|
{
|
||||||
|
init( encoder.lowpass, encoder.highpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~LameEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual LameEncoder &
|
||||||
|
operator= ( const LameEncoder & encoder ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &encoder ) {
|
||||||
|
strip();
|
||||||
|
ExternalEncoder::operator=( encoder);
|
||||||
|
init( encoder.lowpass, encoder.highpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual LameEncoder *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new LameEncoder( *this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getLowpass ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return lowpass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
setLowpass ( unsigned int lowpass ) throw ()
|
||||||
|
{
|
||||||
|
if ( isRunning() ) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this->lowpass = lowpass;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getHighpass ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return highpass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
setHighpass ( unsigned int highpass ) throw ()
|
||||||
|
{
|
||||||
|
if ( isRunning() ) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this->highpass = highpass;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* LAME_ENCODER_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:52 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
CPP=g++
|
||||||
|
|
||||||
|
CPPFLAGS=
|
||||||
|
|
||||||
|
all: darkice
|
||||||
|
|
||||||
|
OBJECTS = main.o\
|
||||||
|
Exception.o\
|
||||||
|
DarkIce.o\
|
||||||
|
Util.o\
|
||||||
|
FileSource.o\
|
||||||
|
PipeSource.o\
|
||||||
|
OssDspSource.o\
|
||||||
|
FileSink.o\
|
||||||
|
PipeSink.o\
|
||||||
|
BufferedSink.o\
|
||||||
|
TcpSocket.o\
|
||||||
|
CastSink.o\
|
||||||
|
IceCast.o\
|
||||||
|
Connector.o\
|
||||||
|
ExternalEncoder.o\
|
||||||
|
LameEncoder.o
|
||||||
|
|
||||||
|
darkice: $(OBJECTS)
|
||||||
|
$(CPP) $(OBJECTS) -o darkice
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJECTS) darkice
|
||||||
|
|
||||||
|
env:
|
||||||
|
ls *.h *.cpp > files
|
||||||
|
rm -f tags
|
||||||
|
ctags -L files -o tags
|
||||||
|
|
|
@ -0,0 +1,238 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : OssDspSource.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Audio data input
|
||||||
|
|
||||||
|
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 <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/soundcard.h>
|
||||||
|
|
||||||
|
#include "Util.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "OssDspSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
OssDspSource :: init ( const char * name ) throw ( Exception )
|
||||||
|
{
|
||||||
|
fileName = Util::strDup( name);
|
||||||
|
fileDescriptor = 0;
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
OssDspSource :: strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the audio source
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
OssDspSource :: open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
int format;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( getBitsPerSample() ) {
|
||||||
|
case 8:
|
||||||
|
format = AFMT_U8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
format = AFMT_S16_LE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fileDescriptor = ::open( fileName, O_RDONLY)) == -1 ) {
|
||||||
|
fileDescriptor = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = format;
|
||||||
|
if ( ioctl( fileDescriptor, SNDCTL_DSP_SETFMT, &i) == -1 ||
|
||||||
|
i != format ) {
|
||||||
|
|
||||||
|
close();
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't set format", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = getChannel();
|
||||||
|
if ( ioctl( fileDescriptor, SNDCTL_DSP_CHANNELS, &i) == -1 ||
|
||||||
|
i != getChannel() ) {
|
||||||
|
|
||||||
|
close();
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't set channels", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = getSampleRate();
|
||||||
|
if ( ioctl( fileDescriptor, SNDCTL_DSP_SPEED, &i) == -1 ||
|
||||||
|
i != getSampleRate() ) {
|
||||||
|
|
||||||
|
close();
|
||||||
|
throw Exception( __FILE__, __LINE__, "can't set speed", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Check wether read() would return anything
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
OssDspSource :: 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[getBitsPerSample()/8];
|
||||||
|
|
||||||
|
read( b, 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
|
||||||
|
OssDspSource :: 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
|
||||||
|
OssDspSource :: close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
::close( fileDescriptor);
|
||||||
|
fileDescriptor = 0;
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : OssDspSource.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Audio data input from an OSS /dev/dsp-like device
|
||||||
|
|
||||||
|
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 OSS_DSP_SOURCE_H
|
||||||
|
#define OSS_DSP_SOURCE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "AudioSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* An audio input based on /dev/dsp-like raw devices
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class OssDspSource : public AudioSource
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * fileName;
|
||||||
|
int fileDescriptor;
|
||||||
|
bool running;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
OssDspSource ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * name ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
OssDspSource ( const char * name,
|
||||||
|
int sampleRate = 44100,
|
||||||
|
int bitsPerSample = 16,
|
||||||
|
int channel = 2 )
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: AudioSource( sampleRate, bitsPerSample, channel)
|
||||||
|
{
|
||||||
|
init( name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
OssDspSource ( const OssDspSource & ds ) throw ( Exception )
|
||||||
|
: AudioSource( ds )
|
||||||
|
{
|
||||||
|
init( ds.fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~OssDspSource ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual OssDspSource &
|
||||||
|
operator= ( const OssDspSource & ds ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &ds ) {
|
||||||
|
strip();
|
||||||
|
AudioSource::operator=( ds);
|
||||||
|
init( ds.fileName);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual OssDspSource *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new OssDspSource( *this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return fileDescriptor != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canRead ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
read ( void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OSS_DSP_SOURCE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : PipeSink.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Audio data input
|
||||||
|
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "PipeSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Create a pipe
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
PipeSink :: create ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( mkfifo( getFileName(), S_IRUSR | S_IWUSR) == -1 ) {
|
||||||
|
if ( errno = EEXIST ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw Exception( __FILE__, __LINE__, "mkfifo error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the file
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
PipeSink :: open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fileDescriptor = ::open( getFileName(),
|
||||||
|
O_WRONLY | O_NONBLOCK)) == -1 ) {
|
||||||
|
fileDescriptor = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : PipeSink.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
FIFO pipe data output
|
||||||
|
|
||||||
|
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 PIPE_SINK_H
|
||||||
|
#define PIPE_SINK_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "FileSink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class PipeSink : public FileSink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSink ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSink ( const char * name ) throw ( Exception )
|
||||||
|
: FileSink( name )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSink ( const PipeSink & ps ) throw ( Exception )
|
||||||
|
: FileSink( ps )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual PipeSink &
|
||||||
|
operator= ( const PipeSink & fs ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &fs ) {
|
||||||
|
FileSink::operator=( fs );
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual PipeSink *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new PipeSink(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual inline
|
||||||
|
~PipeSink( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
create ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PIPE_SINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : PipeSource.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Audio data input
|
||||||
|
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "PipeSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Create a pipe
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
PipeSource :: create ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( mkfifo( getFileName(), S_IRUSR | S_IWUSR) == -1 ) {
|
||||||
|
if ( errno = EEXIST ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw Exception( __FILE__, __LINE__, "mkfifo error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : PipeSource.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
FIFO pipe data input
|
||||||
|
|
||||||
|
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 PIPE_SOURCE_H
|
||||||
|
#define PIPE_SOURCE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "FileSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class PipeSource : public FileSource
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSource ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSource ( const char * name ) throw ( Exception )
|
||||||
|
: FileSource( name )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
PipeSource ( const PipeSource & ps ) throw ( Exception )
|
||||||
|
: FileSource( ps )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual PipeSource &
|
||||||
|
operator= ( const PipeSource & fs ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &fs ) {
|
||||||
|
FileSource::operator=( fs );
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual PipeSource *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
return new PipeSource(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual inline
|
||||||
|
~PipeSource( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
create ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PIPE_SOURCE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:53 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,226 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Ref.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Java-like object reference class
|
||||||
|
Objects used with this reference class have to be descandents
|
||||||
|
of class Referable
|
||||||
|
|
||||||
|
sample usage:
|
||||||
|
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Referable.h"
|
||||||
|
|
||||||
|
class A : public virtual Referable;
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
A * a = new A();
|
||||||
|
Ref<A> ref1 = a; // 1 reference to a
|
||||||
|
Ref<A> ref2 = ref1; // 2 references to a
|
||||||
|
|
||||||
|
ref1 = 0; // 1 reference to a
|
||||||
|
ref2 = 0; // at this point object a is destroyed
|
||||||
|
|
||||||
|
|
||||||
|
Based on Tima Saarinen's work,
|
||||||
|
http://gamma.nic.fi/~timosa/comp/refcount.html
|
||||||
|
|
||||||
|
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 REF_H
|
||||||
|
#define REF_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
template <class T>
|
||||||
|
class Ref
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
T* object;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Ref ( void ) throw ()
|
||||||
|
{
|
||||||
|
object = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Ref ( const Ref<T> & other ) throw ( Exception )
|
||||||
|
{
|
||||||
|
object = NULL;
|
||||||
|
set( other.object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Ref ( T * obj ) throw ( Exception )
|
||||||
|
{
|
||||||
|
object = obj;
|
||||||
|
obj->increaseReferenceCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~Ref ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
set( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline T*
|
||||||
|
operator->() const throw ()
|
||||||
|
{
|
||||||
|
if ( !object ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"reference to NULL object");
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Ref<T> &
|
||||||
|
operator= ( Ref<T> other ) throw ( Exception )
|
||||||
|
{
|
||||||
|
set( other.object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Ref<T> &
|
||||||
|
operator= ( T* obj ) throw ( Exception )
|
||||||
|
{
|
||||||
|
set( obj);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void
|
||||||
|
set ( T* newobj ) throw ( Exception )
|
||||||
|
{
|
||||||
|
// If equal do nothing
|
||||||
|
if ( newobj == object ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increase reference count
|
||||||
|
if ( newobj ) {
|
||||||
|
newobj->increaseReferenceCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrease the reference count of the old referable
|
||||||
|
if ( object ) {
|
||||||
|
if ( object->decreaseReferenceCount() == 0 ) {
|
||||||
|
delete object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign
|
||||||
|
object = newobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return object pointer. This method should be used with
|
||||||
|
* care because it breaks the encapsulation.
|
||||||
|
* Typically this method is needed for the method calls
|
||||||
|
* which require literal object pointer.
|
||||||
|
*
|
||||||
|
* <P>It may not be bad idea to pass the <CODE>Ref</CODE>
|
||||||
|
* objects as method arguments.</P>
|
||||||
|
*
|
||||||
|
* @return Object pointer or <CODE>NULL</CODE>.
|
||||||
|
*/
|
||||||
|
inline T*
|
||||||
|
get ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
operator== ( const Ref<T> & other ) const throw ()
|
||||||
|
{
|
||||||
|
return object == other.object;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
operator!= ( const Ref<T> & other ) const throw ()
|
||||||
|
{
|
||||||
|
return object != other.object;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* REF_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:54 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,151 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Referable.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Base class for an object for which references can be made
|
||||||
|
with the reference class Ref (see Ref.h)
|
||||||
|
|
||||||
|
usage:
|
||||||
|
|
||||||
|
class A : public virtual Referable
|
||||||
|
{
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
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 REFERABLE_H
|
||||||
|
#define REFERABLE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
unsigned int referenceCount;
|
||||||
|
|
||||||
|
static const
|
||||||
|
unsigned int maxCount = ~((unsigned int)0);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Referable ( void ) throw ()
|
||||||
|
{
|
||||||
|
referenceCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~Referable ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( referenceCount > 0 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"reference count positive in destructor",
|
||||||
|
referenceCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
increaseReferenceCount ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( referenceCount >= maxCount ) {
|
||||||
|
throw Exception( __FILE__,
|
||||||
|
__LINE__,
|
||||||
|
"reference count overflow",
|
||||||
|
referenceCount );
|
||||||
|
}
|
||||||
|
return ++referenceCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
decreaseReferenceCount ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( referenceCount == 0 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"reference count underflow",
|
||||||
|
referenceCount );
|
||||||
|
}
|
||||||
|
return --referenceCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getReferenceCount ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return referenceCount;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* REFERABLE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:54 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Sink.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A general data sink
|
||||||
|
|
||||||
|
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 SINK_H
|
||||||
|
#define SINK_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Referable.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Sink : public virtual Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Sink ( void )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Sink ( const Sink & sink )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual Sink &
|
||||||
|
operator= ( const Sink & sink )
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~Sink ( void )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
isOpen ( void ) const = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
flush ( void ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:54 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Source.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A general data 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 SOURCE_H
|
||||||
|
#define SOURCE_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Referable.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Source : public virtual Referable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Source ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Source ( const Source & source ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual Source &
|
||||||
|
operator= ( const Source & source ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~Source ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
isOpen ( void ) const throw () = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canRead ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
read ( void * buf,
|
||||||
|
unsigned int len ) throw ( Exception ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SOURCE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:54 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,317 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : TcpSocket.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A TCP network socket
|
||||||
|
|
||||||
|
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 <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "Util.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "TcpSocket.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
TcpSocket :: init ( const char * host,
|
||||||
|
unsigned short port ) throw ( Exception )
|
||||||
|
{
|
||||||
|
this->host = Util::strDup( host);
|
||||||
|
this->port = port;
|
||||||
|
this->sockfd = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* De-initialize the object
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
TcpSocket :: strip ( void) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] host;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Copy Constructor
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
TcpSocket :: TcpSocket ( const TcpSocket & ss ) throw ( Exception )
|
||||||
|
: Sink( ss ), Source( ss )
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
init( ss.host, ss.port);
|
||||||
|
|
||||||
|
if ( (fd = ss.sockfd ? dup( ss.sockfd) : 0) == -1 ) {
|
||||||
|
strip();
|
||||||
|
throw Exception( __FILE__, __LINE__, "dup failure");
|
||||||
|
}
|
||||||
|
|
||||||
|
sockfd = fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Assignment operator
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
TcpSocket &
|
||||||
|
TcpSocket :: operator= ( const TcpSocket & ss ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &ss ) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/* first strip */
|
||||||
|
strip();
|
||||||
|
|
||||||
|
|
||||||
|
/* then build up */
|
||||||
|
Sink::operator=( ss );
|
||||||
|
Source::operator=( ss );
|
||||||
|
|
||||||
|
init( ss.host, ss.port);
|
||||||
|
|
||||||
|
if ( (fd = ss.sockfd ? dup( ss.sockfd) : 0) == -1 ) {
|
||||||
|
strip();
|
||||||
|
throw Exception( __FILE__, __LINE__, "dup failure");
|
||||||
|
}
|
||||||
|
|
||||||
|
sockfd = fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open the file
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
TcpSocket :: open ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
struct hostent * pHostEntry;
|
||||||
|
|
||||||
|
if ( isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !(pHostEntry = gethostbyname( host)) ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "gethostbyname error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (sockfd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "socket error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset( &addr, 0, sizeof(addr));
|
||||||
|
addr.sin_family = AF_INET;
|
||||||
|
addr.sin_port = htons(port);
|
||||||
|
addr.sin_addr.s_addr = *((long*) pHostEntry->h_addr_list[0]);
|
||||||
|
|
||||||
|
if ( connect( sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1 ) {
|
||||||
|
::close( sockfd);
|
||||||
|
throw Exception( __FILE__, __LINE__, "connect error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Check wether read() would return anything
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
TcpSocket :: 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( sockfd, &fdset);
|
||||||
|
tv.tv_sec = sec;
|
||||||
|
tv.tv_usec = usec;
|
||||||
|
|
||||||
|
ret = select( sockfd + 1, &fdset, NULL, NULL, &tv);
|
||||||
|
|
||||||
|
if ( ret == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "select error");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Read from the socket
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
TcpSocket :: read ( void * buf,
|
||||||
|
unsigned int len ) throw ( Exception )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = recv( sockfd, buf, len, 0);
|
||||||
|
|
||||||
|
if ( ret == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "recv error", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Check wether read() would return anything
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
TcpSocket :: 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( sockfd, &fdset);
|
||||||
|
tv.tv_sec = sec;
|
||||||
|
tv.tv_usec = usec;
|
||||||
|
|
||||||
|
ret = select( sockfd + 1, NULL, &fdset, NULL, &tv);
|
||||||
|
|
||||||
|
if ( ret == -1 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "select error");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Write to the socket
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
TcpSocket :: write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ret = send( sockfd, buf, len, MSG_DONTWAIT);
|
||||||
|
ret = send( sockfd, buf, len, 0);
|
||||||
|
|
||||||
|
if ( ret == -1 ) {
|
||||||
|
if ( errno == EAGAIN ) {
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
throw Exception( __FILE__, __LINE__, "send error", errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Close the socket
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
TcpSocket :: close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
flush();
|
||||||
|
::close( sockfd);
|
||||||
|
sockfd = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:55 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,193 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : TcpSocket.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
A TCP network socket
|
||||||
|
|
||||||
|
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 TCP_SOCKET_H
|
||||||
|
#define TCP_SOCKET_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Source.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class TcpSocket : public Source, public Sink
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
char * host;
|
||||||
|
unsigned short port;
|
||||||
|
|
||||||
|
int sockfd;
|
||||||
|
|
||||||
|
void
|
||||||
|
init ( const char * host,
|
||||||
|
unsigned short port ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
strip ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
TcpSocket ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline
|
||||||
|
TcpSocket( const char * host,
|
||||||
|
unsigned short port ) throw ( Exception )
|
||||||
|
{
|
||||||
|
init( host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TcpSocket( const TcpSocket & ss ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual
|
||||||
|
~TcpSocket( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual TcpSocket &
|
||||||
|
operator= ( const TcpSocket & ss ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual TcpSocket *
|
||||||
|
clone ( void ) const throw ( Exception )
|
||||||
|
{
|
||||||
|
TcpSocket * s = new TcpSocket(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const char *
|
||||||
|
getHost ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int
|
||||||
|
getPort ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return sockfd != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canRead ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
read ( void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
|
||||||
|
inline virtual void
|
||||||
|
flush ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TCP_SOCKET_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:55 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Util.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Widely used utilities
|
||||||
|
|
||||||
|
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 <string.h>
|
||||||
|
|
||||||
|
#include "Util.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Duplicate a string by allocating space with new[]
|
||||||
|
* The returned string must be freed with delete[]
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
char *
|
||||||
|
Util :: strDup( const char * str ) throw ( Exception )
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char * s;
|
||||||
|
|
||||||
|
if ( !str ) {
|
||||||
|
throw Exception( __FILE__, __LINE__, "no str");
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strlen( str) + 1;
|
||||||
|
s = new char[len];
|
||||||
|
memcpy( s, str, len);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:55 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : Util.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Widely used utilities
|
||||||
|
|
||||||
|
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 UTIL_H
|
||||||
|
#define UTIL_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class Util
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
inline
|
||||||
|
Util ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
Util ( const Util & e ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline
|
||||||
|
~Util ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Util &
|
||||||
|
operator= ( const Util & e ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static char *
|
||||||
|
strDup( const char * str ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* UTIL_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:55 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
AudioEncoder.h
|
||||||
|
AudioSource.h
|
||||||
|
BufferedSink.cpp
|
||||||
|
BufferedSink.h
|
||||||
|
CastSink.cpp
|
||||||
|
CastSink.h
|
||||||
|
Connector.cpp
|
||||||
|
Connector.h
|
||||||
|
DarkIce.cpp
|
||||||
|
DarkIce.h
|
||||||
|
Exception.cpp
|
||||||
|
Exception.h
|
||||||
|
ExternalEncoder.cpp
|
||||||
|
ExternalEncoder.h
|
||||||
|
FileSink.cpp
|
||||||
|
FileSink.h
|
||||||
|
FileSource.cpp
|
||||||
|
FileSource.h
|
||||||
|
IceCast.cpp
|
||||||
|
IceCast.h
|
||||||
|
LameEncoder.cpp
|
||||||
|
LameEncoder.h
|
||||||
|
OssDspSource.cpp
|
||||||
|
OssDspSource.h
|
||||||
|
PipeSink.cpp
|
||||||
|
PipeSink.h
|
||||||
|
PipeSource.cpp
|
||||||
|
PipeSource.h
|
||||||
|
Ref.h
|
||||||
|
Referable.h
|
||||||
|
Sink.h
|
||||||
|
Source.h
|
||||||
|
TcpSocket.cpp
|
||||||
|
TcpSocket.h
|
||||||
|
Util.cpp
|
||||||
|
Util.h
|
||||||
|
main.cpp
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : main.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Abstract :
|
||||||
|
|
||||||
|
Program entry point
|
||||||
|
|
||||||
|
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 <iostream.h>
|
||||||
|
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "DarkIce.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Program entry point
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
main (
|
||||||
|
int argc,
|
||||||
|
char * argv[] )
|
||||||
|
{
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
Ref<DarkIce> di = new DarkIce( argc, argv);
|
||||||
|
di->run();
|
||||||
|
|
||||||
|
} catch ( Exception & e ) {
|
||||||
|
cout << "Exception: " << e << endl << flush;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/11/05 10:05:52 darkeye
|
||||||
|
Initial revision
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in New Issue