removed legacy branch
This commit is contained in:
parent
bb0fdb10b9
commit
11992d9cdd
|
@ -1,252 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,171 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,302 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,213 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,144 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,326 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,341 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,172 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,219 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,128 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,199 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,190 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,243 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,280 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,182 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,240 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,163 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,179 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,158 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,150 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,244 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
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
|
|
||||||
|
|
|
@ -1,238 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,179 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,141 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,226 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,139 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,135 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,317 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,193 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
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
|
|
|
@ -1,93 +0,0 @@
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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