added AAC support through the faac codec, http://www.audiocoding.com/
This commit is contained in:
parent
2ebf68e42a
commit
9a23ebe086
|
@ -1,3 +1,7 @@
|
||||||
|
DarkIce next version
|
||||||
|
|
||||||
|
o added AAC support through the faac codec, http://www.audiocoding.com
|
||||||
|
|
||||||
14-04-2005 DarkIce 0.15 released
|
14-04-2005 DarkIce 0.15 released
|
||||||
|
|
||||||
o ported to OpenBSD and NetBSD, though real-time scheduling not supported,
|
o ported to OpenBSD and NetBSD, though real-time scheduling not supported,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
AC_INIT(darkice, 0.15)
|
AC_INIT(darkice, 0.16beta)
|
||||||
AC_CONFIG_SRCDIR(src/DarkIce.cpp)
|
AC_CONFIG_SRCDIR(src/DarkIce.cpp)
|
||||||
AM_CONFIG_HEADER(src/config.h)
|
AM_CONFIG_HEADER(src/config.h)
|
||||||
|
|
||||||
|
@ -115,6 +115,40 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
dnl link the faac library if requested
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
AC_SUBST( FAAC_INCFLAGS)
|
||||||
|
AC_SUBST( FAAC_LDFLAGS)
|
||||||
|
|
||||||
|
AC_ARG_WITH( faac,
|
||||||
|
[ --with-faac use faac for encoding AAC streams [yes] ],
|
||||||
|
USE_FAAC=${withval}, USE_FAAC="yes" )
|
||||||
|
AC_ARG_WITH( faac-prefix,
|
||||||
|
[ --with-faac-prefix=DIR alternate location for faac [/usr]
|
||||||
|
look for libraries in FAAC-PREFIX/lib,
|
||||||
|
for headers in FAAC-PREFIX/include],
|
||||||
|
CONFIG_FAAC_PREFIX="${withval}", CONFIG_FAAC_PREFIX="/usr")
|
||||||
|
|
||||||
|
if test "x${USE_FAAC}" = "xyes" ; then
|
||||||
|
AC_MSG_CHECKING( [for faac library at ${CONFIG_FAAC_PREFIX}] )
|
||||||
|
LA_SEARCH_LIB( FAAC_LIB_LOC, FAAC_INC_LOC, libfaac.a, faac.h,
|
||||||
|
${CONFIG_FAAC_PREFIX})
|
||||||
|
if test "x${FAAC_LIB_LOC}" != "x" ; then
|
||||||
|
AC_DEFINE( HAVE_FAAC_LIB, 1, [build with faac library] )
|
||||||
|
if test "x${FAAC_INC_LOC}" != "x${SYSTEM_INCLUDE}" ; then
|
||||||
|
FAAC_INCFLAGS="-I${FAAC_INC_LOC}"
|
||||||
|
fi
|
||||||
|
FAAC_LDFLAGS="-L${FAAC_LIB_LOC} -lfaac"
|
||||||
|
AC_MSG_RESULT( [found at ${CONFIG_FAAC_PREFIX}] )
|
||||||
|
else
|
||||||
|
AC_MSG_WARN( [not found, building without faac])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT( [building without faac] )
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
dnl-----------------------------------------------------------------------------
|
dnl-----------------------------------------------------------------------------
|
||||||
dnl make sure at least one of lame and vorbis present
|
dnl make sure at least one of lame and vorbis present
|
||||||
dnl-----------------------------------------------------------------------------
|
dnl-----------------------------------------------------------------------------
|
||||||
|
|
|
@ -88,6 +88,10 @@
|
||||||
#include "VorbisLibEncoder.h"
|
#include "VorbisLibEncoder.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FAAC_LIB
|
||||||
|
#include "FaacEncoder.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* =================================================== local data structures */
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
@ -395,6 +399,8 @@ DarkIce :: configIceCast2 ( const Config & config,
|
||||||
format = IceCast2::oggVorbis;
|
format = IceCast2::oggVorbis;
|
||||||
} else if ( Util::strEq( str, "mp3") ) {
|
} else if ( Util::strEq( str, "mp3") ) {
|
||||||
format = IceCast2::mp3;
|
format = IceCast2::mp3;
|
||||||
|
} else if ( Util::strEq( str, "aac") ) {
|
||||||
|
format = IceCast2::aac;
|
||||||
} else {
|
} else {
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
"unsupported stream format: ", str);
|
"unsupported stream format: ", str);
|
||||||
|
@ -534,6 +540,24 @@ DarkIce :: configIceCast2 ( const Config & config,
|
||||||
#endif // HAVE_VORBIS_LIB
|
#endif // HAVE_VORBIS_LIB
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IceCast2::aac:
|
||||||
|
#ifndef HAVE_FAAC_LIB
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"DarkIce not compiled with AAC support, "
|
||||||
|
"thus can't aac stream: ",
|
||||||
|
stream);
|
||||||
|
#else
|
||||||
|
audioOuts[u].encoder = new FaacEncoder(
|
||||||
|
audioOuts[u].server.get(),
|
||||||
|
dsp.get(),
|
||||||
|
bitrateMode,
|
||||||
|
bitrate,
|
||||||
|
quality,
|
||||||
|
sampleRate,
|
||||||
|
dsp->getChannel());
|
||||||
|
#endif // HAVE_FAAC_LIB
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
"Illegal stream format: ", format);
|
"Illegal stream format: ", format);
|
||||||
|
@ -753,7 +777,9 @@ DarkIce :: configFileCast ( const Config & config )
|
||||||
int highpass = 0;
|
int highpass = 0;
|
||||||
|
|
||||||
format = cs->getForSure( "format", " missing in section ", stream);
|
format = cs->getForSure( "format", " missing in section ", stream);
|
||||||
if ( !Util::strEq( format, "vorbis") && !Util::strEq( format, "mp3") ) {
|
if ( !Util::strEq( format, "vorbis")
|
||||||
|
&& !Util::strEq( format, "mp3")
|
||||||
|
&& !Util::strEq( format, "aac") ) {
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
"unsupported stream format: ", format);
|
"unsupported stream format: ", format);
|
||||||
}
|
}
|
||||||
|
@ -804,6 +830,12 @@ DarkIce :: configFileCast ( const Config & config )
|
||||||
"invalid bitrate mode: ", str);
|
"invalid bitrate mode: ", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Util::strEq(format, "aac") && bitrateMode != AudioEncoder::abr) {
|
||||||
|
throw Exception(__FILE__, __LINE__,
|
||||||
|
"currently the AAC format only supports "
|
||||||
|
"average bitrate mode");
|
||||||
|
}
|
||||||
|
|
||||||
str = cs->get( "lowpass");
|
str = cs->get( "lowpass");
|
||||||
lowpass = str ? Util::strToL( str) : 0;
|
lowpass = str ? Util::strToL( str) : 0;
|
||||||
str = cs->get( "highpass");
|
str = cs->get( "highpass");
|
||||||
|
@ -858,6 +890,22 @@ DarkIce :: configFileCast ( const Config & config )
|
||||||
dsp->getSampleRate(),
|
dsp->getSampleRate(),
|
||||||
dsp->getChannel() );
|
dsp->getChannel() );
|
||||||
#endif // HAVE_VORBIS_LIB
|
#endif // HAVE_VORBIS_LIB
|
||||||
|
} else if ( Util::strEq( format, "aac") ) {
|
||||||
|
#ifndef HAVE_FAAC_LIB
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"DarkIce not compiled with AAC support, "
|
||||||
|
"thus can't aac stream: ",
|
||||||
|
stream);
|
||||||
|
#else
|
||||||
|
audioOuts[u].encoder = new FaacEncoder(
|
||||||
|
audioOuts[u].server.get(),
|
||||||
|
dsp.get(),
|
||||||
|
bitrateMode,
|
||||||
|
bitrate,
|
||||||
|
quality,
|
||||||
|
sampleRate,
|
||||||
|
dsp->getChannel());
|
||||||
|
#endif // HAVE_FAAC_LIB
|
||||||
} else {
|
} else {
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
"Illegal stream format: ", format);
|
"Illegal stream format: ", format);
|
||||||
|
@ -1011,6 +1059,9 @@ DarkIce :: run ( void ) throw ( Exception )
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.44 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
Revision 1.43 2005/04/11 19:27:43 darkeye
|
Revision 1.43 2005/04/11 19:27:43 darkeye
|
||||||
added option to turn off automatic reconnect feature
|
added option to turn off automatic reconnect feature
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2005 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FaacEncoder.cpp
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Copyright notice:
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// compile the whole file only if lame support configured in
|
||||||
|
#ifdef HAVE_FAAC_LIB
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Util.h"
|
||||||
|
#include "FaacEncoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* File identity
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static const char fileid[] = "$Id$";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Open an encoding session
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
FaacEncoder :: open ( void )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// open the underlying sink
|
||||||
|
if ( !sink->open() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"faac lib opening underlying sink error");
|
||||||
|
}
|
||||||
|
|
||||||
|
char * faacVersion;
|
||||||
|
char * faacCopyright;
|
||||||
|
faacEncGetVersion(&faacVersion, &faacCopyright);
|
||||||
|
reportEvent(1, "Using faac codec version", faacVersion);
|
||||||
|
|
||||||
|
encoderHandle = faacEncOpen(getInSampleRate(),
|
||||||
|
getInChannel(),
|
||||||
|
&inputSamples,
|
||||||
|
&maxOutputBytes);
|
||||||
|
|
||||||
|
faacEncConfiguration * faacConfig;
|
||||||
|
|
||||||
|
faacConfig = faacEncGetCurrentConfiguration(encoderHandle);
|
||||||
|
|
||||||
|
faacConfig->aacObjectType = MAIN;
|
||||||
|
faacConfig->mpegVersion = MPEG2;
|
||||||
|
faacConfig->useTns = 1;
|
||||||
|
faacConfig->shortctl = SHORTCTL_NORMAL;
|
||||||
|
faacConfig->useLfe = 0;
|
||||||
|
faacConfig->allowMidside = 1;
|
||||||
|
faacConfig->bitRate = getOutBitrate() * 1000 / getOutChannel();
|
||||||
|
faacConfig->bandWidth = lowpass;
|
||||||
|
faacConfig->quantqual = (unsigned long) (getOutQuality() * 1000.0);
|
||||||
|
faacConfig->outputFormat = 1;
|
||||||
|
faacConfig->inputFormat = FAAC_INPUT_16BIT;
|
||||||
|
|
||||||
|
if (!faacEncSetConfiguration(encoderHandle, faacConfig)) {
|
||||||
|
throw Exception(__FILE__, __LINE__,
|
||||||
|
"error configuring faac library");
|
||||||
|
}
|
||||||
|
|
||||||
|
faacOpen = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Write data to the encoder
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
unsigned int
|
||||||
|
FaacEncoder :: write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() || len == 0 ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int channels = getInChannel();
|
||||||
|
unsigned int bitsPerSample = getInBitsPerSample();
|
||||||
|
unsigned int sampleSize = (bitsPerSample / 8) * channels;
|
||||||
|
unsigned char * b = (unsigned char*) buf;
|
||||||
|
unsigned int processed = len - (len % sampleSize);
|
||||||
|
unsigned int nSamples = processed / sampleSize;
|
||||||
|
unsigned char * faacBuf = new unsigned char[maxOutputBytes];
|
||||||
|
int samples = (int) nSamples * channels;
|
||||||
|
int processedSamples = 0;
|
||||||
|
|
||||||
|
while (processedSamples < samples) {
|
||||||
|
int outputBytes;
|
||||||
|
int inSamples = samples - processedSamples < (int) inputSamples
|
||||||
|
? samples - processedSamples
|
||||||
|
: inputSamples;
|
||||||
|
|
||||||
|
outputBytes = faacEncEncode(encoderHandle,
|
||||||
|
(int32_t*) (b + processedSamples/sampleSize),
|
||||||
|
inSamples,
|
||||||
|
faacBuf,
|
||||||
|
maxOutputBytes);
|
||||||
|
sink->write(faacBuf, outputBytes);
|
||||||
|
|
||||||
|
processedSamples += inSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] faacBuf;
|
||||||
|
|
||||||
|
return processedSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Flush the data from the encoder
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
FaacEncoder :: flush ( void )
|
||||||
|
throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sink->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Close the encoding session
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
FaacEncoder :: close ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
flush();
|
||||||
|
faacEncClose(encoderHandle);
|
||||||
|
faacOpen = false;
|
||||||
|
|
||||||
|
sink->close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HAVE_FAAC_LIB
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -0,0 +1,451 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2005 Tyrell Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Tyrell DarkIce
|
||||||
|
|
||||||
|
File : FaacEncoder.h
|
||||||
|
Version : $Revision$
|
||||||
|
Author : $Author$
|
||||||
|
Location : $Source$
|
||||||
|
|
||||||
|
Copyright notice:
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef AAC_ENCODER_H
|
||||||
|
#define AAC_ENCODER_H
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FAAC_LIB
|
||||||
|
#include <faac.h>
|
||||||
|
#else
|
||||||
|
#error configure with faac
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "Ref.h"
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Reporter.h"
|
||||||
|
#include "AudioEncoder.h"
|
||||||
|
#include "Sink.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class representing faac AAC encoder.
|
||||||
|
*
|
||||||
|
* @author $Author$
|
||||||
|
* @version $Revision$
|
||||||
|
*/
|
||||||
|
class FaacEncoder : public AudioEncoder, public virtual Reporter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A flag to indicate if the encoding session is open.
|
||||||
|
*/
|
||||||
|
bool faacOpen;;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The handle to the AAC encoder instance.
|
||||||
|
*/
|
||||||
|
faacEncHandle encoderHandle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of input samples to supply to the encoder.
|
||||||
|
*/
|
||||||
|
unsigned long inputSamples;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of output bytes the encoder returns in one call.
|
||||||
|
*/
|
||||||
|
unsigned long maxOutputBytes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lowpass filter. Sound frequency in Hz, from where up the
|
||||||
|
* input is cut.
|
||||||
|
*/
|
||||||
|
int lowpass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Sink to dump mp3 data to
|
||||||
|
*/
|
||||||
|
Ref<Sink> sink;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the object.
|
||||||
|
*
|
||||||
|
* @param sink the sink to send mp3 output to
|
||||||
|
* @param lowpass frequency threshold for the lowpass filter.
|
||||||
|
* Input above this frequency is cut.
|
||||||
|
* If 0, lame's default values are used,
|
||||||
|
* which depends on the out sample rate.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline void
|
||||||
|
init ( Sink * sink,
|
||||||
|
int lowpass) throw (Exception)
|
||||||
|
{
|
||||||
|
this->sink = sink;
|
||||||
|
this->lowpass = lowpass;
|
||||||
|
|
||||||
|
if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 8 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"specified bits per sample not supported",
|
||||||
|
getInBitsPerSample() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( getInChannel() != 1 && getInChannel() != 2 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"unsupported number of input channels for the encoder",
|
||||||
|
getInChannel() );
|
||||||
|
}
|
||||||
|
if ( getOutChannel() != 1 && getOutChannel() != 2 ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"unsupported number of output channels for the encoder",
|
||||||
|
getOutChannel() );
|
||||||
|
}
|
||||||
|
if ( getInChannel() != getOutChannel() ) {
|
||||||
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
"input channels and output channels do not match");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* De-initialize the object.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline void
|
||||||
|
strip ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor. Always throws an Exception.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline
|
||||||
|
FaacEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
throw Exception( __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param sink the sink to send mp3 output to
|
||||||
|
* @param inSampleRate sample rate of the input.
|
||||||
|
* @param inBitsPerSample number of bits per sample of the input.
|
||||||
|
* @param inChannel number of channels of the input.
|
||||||
|
* @param inBigEndian shows if the input is big or little endian
|
||||||
|
* @param outBitrateMode the bit rate mode of the output.
|
||||||
|
* @param outBitrate bit rate of the output (kbits/sec).
|
||||||
|
* @param outQuality the quality of the stream.
|
||||||
|
* @param outSampleRate sample rate of the output.
|
||||||
|
* If 0, inSampleRate is used.
|
||||||
|
* @param outChannel number of channels of the output.
|
||||||
|
* If 0, inChannel is used.
|
||||||
|
* @param lowpass frequency threshold for the lowpass filter.
|
||||||
|
* Input above this frequency is cut.
|
||||||
|
* If 0, lame's default values are used,
|
||||||
|
* which depends on the out sample rate.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline
|
||||||
|
FaacEncoder ( Sink * sink,
|
||||||
|
unsigned int inSampleRate,
|
||||||
|
unsigned int inBitsPerSample,
|
||||||
|
unsigned int inChannel,
|
||||||
|
bool inBigEndian,
|
||||||
|
BitrateMode outBitrateMode,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
double outQuality,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0,
|
||||||
|
int lowpass = 0)
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: AudioEncoder ( inSampleRate,
|
||||||
|
inBitsPerSample,
|
||||||
|
inChannel,
|
||||||
|
inBigEndian,
|
||||||
|
outBitrateMode,
|
||||||
|
outBitrate,
|
||||||
|
outQuality,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init( sink, lowpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param sink the sink to send mp3 output to
|
||||||
|
* @param as get input sample rate, bits per sample and channels
|
||||||
|
* from this AudioSource.
|
||||||
|
* @param outBitrateMode the bit rate mode of the output.
|
||||||
|
* @param outBitrate bit rate of the output (kbits/sec).
|
||||||
|
* @param outQuality the quality of the stream.
|
||||||
|
* @param outSampleRate sample rate of the output.
|
||||||
|
* If 0, input sample rate is used.
|
||||||
|
* @param outChannel number of channels of the output.
|
||||||
|
* If 0, input channel is used.
|
||||||
|
* @param lowpass frequency threshold for the lowpass filter.
|
||||||
|
* Input above this frequency is cut.
|
||||||
|
* If 0, lame's default values are used,
|
||||||
|
* which depends on the out sample rate.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline
|
||||||
|
FaacEncoder ( Sink * sink,
|
||||||
|
const AudioSource * as,
|
||||||
|
BitrateMode outBitrateMode,
|
||||||
|
unsigned int outBitrate,
|
||||||
|
double outQuality,
|
||||||
|
unsigned int outSampleRate = 0,
|
||||||
|
unsigned int outChannel = 0,
|
||||||
|
int lowpass = 0)
|
||||||
|
throw ( Exception )
|
||||||
|
|
||||||
|
: AudioEncoder ( as,
|
||||||
|
outBitrateMode,
|
||||||
|
outBitrate,
|
||||||
|
outQuality,
|
||||||
|
outSampleRate,
|
||||||
|
outChannel )
|
||||||
|
{
|
||||||
|
init( sink, lowpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy constructor.
|
||||||
|
*
|
||||||
|
* @param encoder the FaacEncoder to copy.
|
||||||
|
*/
|
||||||
|
inline
|
||||||
|
FaacEncoder ( const FaacEncoder & encoder )
|
||||||
|
throw ( Exception )
|
||||||
|
: AudioEncoder( encoder )
|
||||||
|
{
|
||||||
|
init( encoder.sink.get(), encoder.lowpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline virtual
|
||||||
|
~FaacEncoder ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( isOpen() ) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assignment operator.
|
||||||
|
*
|
||||||
|
* @param encoder the FaacEncoder to assign this to.
|
||||||
|
* @return a reference to this FaacEncoder.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline virtual FaacEncoder &
|
||||||
|
operator= ( const FaacEncoder & encoder ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( this != &encoder ) {
|
||||||
|
strip();
|
||||||
|
AudioEncoder::operator=( encoder);
|
||||||
|
init( encoder.sink.get(), encoder.lowpass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the version string of the underlying faac library.
|
||||||
|
*
|
||||||
|
* @return the version string of the underlying faac library.
|
||||||
|
*/
|
||||||
|
inline const char *
|
||||||
|
getFaacVersion( void )
|
||||||
|
{
|
||||||
|
char * id;
|
||||||
|
char * copyright;
|
||||||
|
|
||||||
|
faacEncGetVersion(&id, ©right);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check wether encoding is in progress.
|
||||||
|
*
|
||||||
|
* @return true if encoding is in progress, false otherwise.
|
||||||
|
*/
|
||||||
|
inline virtual bool
|
||||||
|
isRunning ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start encoding. This function returns as soon as possible,
|
||||||
|
* with encoding started in the background.
|
||||||
|
*
|
||||||
|
* @return true if encoding has started, false otherwise.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline virtual bool
|
||||||
|
start ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return open();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop encoding. Stops the encoding running in the background.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline virtual void
|
||||||
|
stop ( void ) throw ( Exception )
|
||||||
|
{
|
||||||
|
return close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open an encoding session.
|
||||||
|
*
|
||||||
|
* @return true if opening was successfull, false otherwise.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
virtual bool
|
||||||
|
open ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the encoding session is open.
|
||||||
|
*
|
||||||
|
* @return true if the encoding session is open, false otherwise.
|
||||||
|
*/
|
||||||
|
inline virtual bool
|
||||||
|
isOpen ( void ) const throw ()
|
||||||
|
{
|
||||||
|
return faacOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the encoder is ready to accept data.
|
||||||
|
*
|
||||||
|
* @param sec the maximum seconds to block.
|
||||||
|
* @param usec micro seconds to block after the full seconds.
|
||||||
|
* @return true if the encoder is ready to accept data,
|
||||||
|
* false otherwise.
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
inline virtual bool
|
||||||
|
canWrite ( unsigned int sec,
|
||||||
|
unsigned int usec ) throw ( Exception )
|
||||||
|
{
|
||||||
|
if ( !isOpen() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write data to the encoder.
|
||||||
|
* Buf is expected to be a sequence of big-endian 16 bit values,
|
||||||
|
* with left and right channels interleaved. Len is the number of
|
||||||
|
* bytes, must be a multiple of 4.
|
||||||
|
*
|
||||||
|
* @param buf the data to write.
|
||||||
|
* @param len number of bytes to write from buf.
|
||||||
|
* @return the number of bytes written (may be less than len).
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
virtual unsigned int
|
||||||
|
write ( const void * buf,
|
||||||
|
unsigned int len ) throw ( Exception );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush all data that was written to the encoder to the underlying
|
||||||
|
* connection.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
flush ( void ) throw ( Exception );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the encoding session.
|
||||||
|
*
|
||||||
|
* @exception Exception
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
close ( void ) throw ( Exception );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AAC_ENCODER_H */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$Source$
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -156,6 +156,10 @@ IceCast2 :: sendLogin ( void ) throw ( Exception )
|
||||||
str = "application/ogg";
|
str = "application/ogg";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case aac:
|
||||||
|
str = "audio/aac";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
"unsupported stream format", format);
|
"unsupported stream format", format);
|
||||||
|
@ -255,6 +259,9 @@ IceCast2 :: sendLogin ( void ) throw ( Exception )
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.12 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
Revision 1.11 2005/04/11 18:32:32 darkeye
|
Revision 1.11 2005/04/11 18:32:32 darkeye
|
||||||
changed MIME type to application/ogg, which is now official
|
changed MIME type to application/ogg, which is now official
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ class IceCast2 : public CastSink
|
||||||
/**
|
/**
|
||||||
* Type for specifying the format of the stream.
|
* Type for specifying the format of the stream.
|
||||||
*/
|
*/
|
||||||
enum StreamFormat { mp3, oggVorbis };
|
enum StreamFormat { mp3, oggVorbis, aac };
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -273,6 +273,9 @@ class IceCast2 : public CastSink
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.5 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
Revision 1.4 2005/04/14 11:53:17 darkeye
|
Revision 1.4 2005/04/14 11:53:17 darkeye
|
||||||
fixed API documentation issues
|
fixed API documentation issues
|
||||||
|
|
||||||
|
|
|
@ -176,6 +176,7 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
|
||||||
* @param inSampleRate sample rate of the input.
|
* @param inSampleRate sample rate of the input.
|
||||||
* @param inBitsPerSample number of bits per sample of the input.
|
* @param inBitsPerSample number of bits per sample of the input.
|
||||||
* @param inChannel number of channels of the input.
|
* @param inChannel number of channels of the input.
|
||||||
|
* @param inBigEndian shows if the input is big or little endian
|
||||||
* @param outBitrateMode the bit rate mode of the output.
|
* @param outBitrateMode the bit rate mode of the output.
|
||||||
* @param outBitrate bit rate of the output (kbits/sec).
|
* @param outBitrate bit rate of the output (kbits/sec).
|
||||||
* @param outQuality the quality of the stream.
|
* @param outQuality the quality of the stream.
|
||||||
|
@ -183,7 +184,6 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
|
||||||
* If 0, inSampleRate is used.
|
* If 0, inSampleRate is used.
|
||||||
* @param outChannel number of channels of the output.
|
* @param outChannel number of channels of the output.
|
||||||
* If 0, inChannel is used.
|
* If 0, inChannel is used.
|
||||||
* @param inBigEndian shows if the input is big or little endian
|
|
||||||
* @param lowpass frequency threshold for the lowpass filter.
|
* @param lowpass frequency threshold for the lowpass filter.
|
||||||
* Input above this frequency is cut.
|
* Input above this frequency is cut.
|
||||||
* If 0, lame's default values are used,
|
* If 0, lame's default values are used,
|
||||||
|
@ -448,6 +448,9 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.16 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
Revision 1.15 2004/01/07 13:18:17 darkeye
|
Revision 1.15 2004/01/07 13:18:17 darkeye
|
||||||
commited patch sent by John Hay, fixing FreeBSD problems
|
commited patch sent by John Hay, fixing FreeBSD problems
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
bin_PROGRAMS = darkice
|
bin_PROGRAMS = darkice
|
||||||
AM_CXXFLAGS = -O2 -pedantic -Wall @DEBUG_CXXFLAGS@ @PTHREAD_CFLAGS@ @JACK_CFLAGS@
|
AM_CXXFLAGS = -O2 -pedantic -Wall @DEBUG_CXXFLAGS@ @PTHREAD_CFLAGS@
|
||||||
INCLUDES = @LAME_INCFLAGS@ @VORBIS_INCFLAGS@ @ALSA_INCFLAGS@
|
@JACK_CFLAGS@
|
||||||
LDADD = @PTHREAD_LIBS@ @LAME_LDFLAGS@ @VORBIS_LDFLAGS@ @ALSA_LDFLAGS@ @JACK_LIBS@
|
INCLUDES = @LAME_INCFLAGS@ @VORBIS_INCFLAGS@ @FAAC_INCFLAGS@ @ALSA_INCFLAGS@
|
||||||
|
LDADD = @PTHREAD_LIBS@ @LAME_LDFLAGS@ @VORBIS_LDFLAGS@ @FAAC_LDFLAGS@ \
|
||||||
|
@ALSA_LDFLAGS@ @JACK_LIBS@
|
||||||
|
|
||||||
darkice_SOURCES = AudioEncoder.h\
|
darkice_SOURCES = AudioEncoder.h\
|
||||||
AudioSource.h\
|
AudioSource.h\
|
||||||
|
@ -32,6 +34,8 @@ darkice_SOURCES = AudioEncoder.h\
|
||||||
LameLibEncoder.h\
|
LameLibEncoder.h\
|
||||||
VorbisLibEncoder.cpp\
|
VorbisLibEncoder.cpp\
|
||||||
VorbisLibEncoder.h\
|
VorbisLibEncoder.h\
|
||||||
|
FaacEncoder.cpp\
|
||||||
|
FaacEncoder.h\
|
||||||
aflibDebug.h\
|
aflibDebug.h\
|
||||||
aflibDebug.cc\
|
aflibDebug.cc\
|
||||||
aflibConverter.h\
|
aflibConverter.h\
|
||||||
|
|
|
@ -296,7 +296,7 @@ VorbisLibEncoder :: write ( const void * buf,
|
||||||
|
|
||||||
|
|
||||||
Util::conv( bitsPerSample, b, processed, shortBuffer, isInBigEndian());
|
Util::conv( bitsPerSample, b, processed, shortBuffer, isInBigEndian());
|
||||||
|
|
||||||
if ( converter ) {
|
if ( converter ) {
|
||||||
// resample if needed
|
// resample if needed
|
||||||
int inCount = nSamples;
|
int inCount = nSamples;
|
||||||
|
@ -415,6 +415,9 @@ VorbisLibEncoder :: close ( void ) throw ( Exception )
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.22 2005/04/16 21:57:34 darkeye
|
||||||
|
added AAC support through the faac codec, http://www.audiocoding.com/
|
||||||
|
|
||||||
Revision 1.21 2005/04/11 19:26:55 darkeye
|
Revision 1.21 2005/04/11 19:26:55 darkeye
|
||||||
cosmetic changes
|
cosmetic changes
|
||||||
fixed warning for implicit cast from doulbe to int
|
fixed warning for implicit cast from doulbe to int
|
||||||
|
|
Loading…
Reference in New Issue