/*------------------------------------------------------------------------------
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
Tyrell DarkIce
File : DarkIce.h
Version : $Revision: 1.14 $
Author : $Author: darkeye $
Location : $Source: /cvsroot/darkice/darkice/src/DarkIce.h,v $
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 */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_UNISTD_H
#include
#else
#error need unistd.h
#endif
#include
#include "Referable.h"
#include "Reporter.h"
#include "Exception.h"
#include "Ref.h"
#include "AudioSource.h"
#include "BufferedSink.h"
#include "Connector.h"
#include "AudioEncoder.h"
#include "TcpSocket.h"
#include "CastSink.h"
#include "Config.h"
/* ================================================================ constants */
/* =================================================================== macros */
/* =============================================================== data types */
/**
* Program main object.
*
* @author $Author: darkeye $
* @version $Revision: 1.14 $
*/
class DarkIce : public virtual Referable, public virtual Reporter
{
private:
/**
* The maximum number of supported outputs. This should be
* *
*/
static const unsigned int maxOutput = 4 * 7;
/**
* Type describing each lame library output.
*/
typedef struct {
Ref encoder;
Ref socket;
Ref server;
} Output;
/**
* The outputs.
*/
Output audioOuts[maxOutput];
/**
* Number of lame library outputs.
*/
unsigned int noAudioOuts;
/**
* Duration of playing, in seconds.
*/
unsigned int duration;
/**
* The dsp to record from.
*/
Ref dsp;
/**
* The encoding Connector, connecting the dsp to the encoders.
*/
Ref encConnector;
/**
* Original scheduling policy
*/
int origSchedPolicy;
/**
* Original scheduling priority
*/
int origSchedPriority;
/**
* Initialize the object.
*
* @param config the config Object to read initialization
* information from.
* @exception Exception
*/
void
init ( const Config & config ) throw ( Exception );
/**
* Look for the icecast stream outputs from the config file.
* Called from init()
*
* @param config the config Object to read initialization
* information from.
* @param bufferSecs number of seconds to buffer audio for
* @exception Exception
*/
void
configIceCast ( const Config & config,
unsigned int bufferSecs ) throw ( Exception );
/**
* Look for the icecast2 stream outputs from the config file.
* Called from init()
*
* @param config the config Object to read initialization
* information from.
* @param bufferSecs number of seconds to buffer audio for
* @exception Exception
*/
void
configIceCast2 ( const Config & config,
unsigned int bufferSecs ) throw ( Exception );
/**
* Look for the shoutcast stream outputs from the config file.
* Called from init()
*
* @param config the config Object to read initialization
* information from.
* @param bufferSecs number of seconds to buffer audio for
* @exception Exception
*/
void
configShoutCast ( const Config & config,
unsigned int bufferSecs ) throw ( Exception );
/**
* Look for file outputs from the config file.
* Called from init()
*
* @param config the config Object to read initialization
* information from.
* @exception Exception
*/
void
configFileCast ( const Config & config )
throw ( Exception );
/**
* Set POSIX real-time scheduling for the encoding process,
* if user permissions enable it.
*
* @exception Exception
*/
void
setRealTimeScheduling ( void ) throw ( Exception );
/**
* Set the scheduling that was before setting real-time scheduling.
* This function must be called _only_ after setRealTimeScheduling.
*
* @exception Exception
*/
void
setOriginalScheduling ( void ) throw ( Exception );
/**
* Start encoding. Spawns all encoders, opens the dsp and
* starts sending data to the encoders.
*
* @return if encoding was successful.
* @exception Exception
*/
bool
encode ( void ) throw ( Exception );
/**
* Start shouting. fork()-s a process for each output, reads
* the output of the encoders and sends them to an IceCast server.
*
* @return if shouting was successful.
* @exception Exception
*/
bool
shout ( unsigned int ) throw ( Exception );
protected:
/**
* Default constructor. Always throws an Exception.
*
* @exception Exception
*/
inline
DarkIce ( void ) throw ( Exception )
{
throw Exception( __FILE__, __LINE__);
}
public:
/**
* Constructor based on a configuration object.
*
* @param config the config Object to read initialization
* information from.
* @exception Exception
*/
inline
DarkIce ( const Config & config ) throw ( Exception )
{
init( config);
}
/**
* Destructor.
*
* @exception Exception
*/
inline virtual
~DarkIce ( void ) throw ( Exception )
{
}
/* TODO
inline
DarkIce ( const DarkIce & di ) throw ( Exception )
{
}
inline DarkIce &
operator= ( const DarkIce * di ) throw ( Exception )
{
}
*/
/**
* Run the process of recording / encoding / sending to the servers.
*
* @return 0 on success
* @exception Exception
*/
virtual int
run ( void ) throw ( Exception );
};
/* ================================================= external data structures */
/* ====================================================== function prototypes */
#endif /* DARK_ICE_H */
/*------------------------------------------------------------------------------
$Source: /cvsroot/darkice/darkice/src/DarkIce.h,v $
$Log: DarkIce.h,v $
Revision 1.14 2002/05/28 12:35:41 darkeye
code cleanup: compiles under gcc-c++ 3.1, using -pedantic option
Revision 1.13 2002/02/28 09:49:25 darkeye
added possibility to save the encoded stream to a local file only
(no streaming server needed)
Revision 1.12 2001/09/14 19:31:06 darkeye
added IceCast2 / vorbis support
Revision 1.11 2001/09/11 15:05:21 darkeye
added Solaris support
Revision 1.10 2001/09/09 11:27:31 darkeye
added support for ShoutCast servers
Revision 1.9 2001/08/30 17:25:56 darkeye
renamed configure.h to config.h
Revision 1.8 2001/08/26 20:44:30 darkeye
removed external command-line encoder support
replaced it with a shared-object support for lame with the possibility
of static linkage
Revision 1.7 2000/12/20 12:36:47 darkeye
added POSIX real-time scheduling
Revision 1.6 2000/11/15 18:08:43 darkeye
added multiple verbosity-level event reporting and verbosity command
line option
Revision 1.5 2000/11/13 19:38:55 darkeye
moved command line parameter parsing from DarkIce.cpp to main.cpp
Revision 1.4 2000/11/13 18:46:50 darkeye
added kdoc-style documentation comments
Revision 1.3 2000/11/10 20:16:21 darkeye
first real tests with multiple streaming
Revision 1.2 2000/11/09 22:09:46 darkeye
added multiple outputs
added configuration reading
added command line processing
Revision 1.1.1.1 2000/11/05 10:05:50 darkeye
initial version
------------------------------------------------------------------------------*/
| Generated by: darkeye on destroy on Sun Feb 15 23:41:12 2004, using kdoc 2.0a54. |