/*------------------------------------------------------------------------------ * Look for the FileCast stream outputs in the config file *----------------------------------------------------------------------------*/ void DarkIce :: configFileCast ( const Config & config ) throw ( Exception ) { // look for FileCast encoder output streams, // sections [file-0], [file-1], ... char stream[] = "file- "; size_t streamLen = Util::strLen( stream); unsigned int u; for ( u = noAudioOuts; u < maxOutput; ++u ) { const ConfigSection * cs; // ugly hack to change the section name to "stream0", "stream1", etc. stream[streamLen-1] = '0' + (u - noAudioOuts); if ( !(cs = config.get( stream)) ) { break; } const char * str; const char * format = 0; AudioEncoder::BitrateMode bitrateMode; unsigned int bitrate = 0; double quality = 0.0; const char * targetFileName = 0; unsigned int sampleRate = 0; int lowpass = 0; int highpass = 0; bool fileAddDate = false; const char * fileDateFormat = 0; format = cs->getForSure( "format", " missing in section ", stream); if ( !Util::strEq( format, "vorbis") && !Util::strEq( format, "mp3") && !Util::strEq( format, "mp2") && !Util::strEq( format, "aac") && !Util::strEq( format, "aacp") ) { throw Exception( __FILE__, __LINE__, "unsupported stream format: ", format); } str = cs->getForSure("bitrate", " missing in section ", stream); bitrate = Util::strToL( str); targetFileName = cs->getForSure( "fileName", " missing in section ", stream); str = cs->get( "fileAddDate"); fileAddDate = str ? (Util::strEq( str, "yes") ? true : false) : false; fileDateFormat = cs->get( "fileDateFormat"); str = cs->get( "sampleRate"); sampleRate = str ? Util::strToL( str) : dsp->getSampleRate(); str = cs->get( "bitrate"); bitrate = str ? Util::strToL( str) : 0; str = cs->get( "quality"); quality = str ? Util::strToD( str) : 0.0; str = cs->getForSure( "bitrateMode", " not specified in section ", stream); if ( Util::strEq( str, "cbr") ) { bitrateMode = AudioEncoder::cbr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for CBR encoding"); } } else if ( Util::strEq( str, "abr") ) { bitrateMode = AudioEncoder::abr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for ABR encoding"); } } else if ( Util::strEq( str, "vbr") ) { bitrateMode = AudioEncoder::vbr; if ( cs->get( "quality" ) == 0 ) { throw Exception( __FILE__, __LINE__, "quality not specified for VBR encoding"); } } else { throw Exception( __FILE__, __LINE__, "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"); } if (Util::strEq(format, "aacp") && bitrateMode != AudioEncoder::cbr) { throw Exception(__FILE__, __LINE__, "currently the AAC+ format only supports " "constant bitrate mode"); } str = cs->get( "lowpass"); lowpass = str ? Util::strToL( str) : 0; str = cs->get( "highpass"); highpass = str ? Util::strToL( str) : 0; // go on and create the things // the underlying file if ( fileAddDate ) { if (fileDateFormat == 0) { targetFileName = Util::fileAddDate( targetFileName); } else { targetFileName = Util::fileAddDate( targetFileName, fileDateFormat ); } } FileSink * targetFile = new FileSink( stream, targetFileName); if ( !targetFile->exists() ) { if ( !targetFile->create() ) { throw Exception( __FILE__, __LINE__, "can't create output file", targetFileName); } } // streaming related stuff audioOuts[u].socket = 0; audioOuts[u].server = new FileCast( targetFile ); if ( Util::strEq( format, "mp3") ) { #ifndef HAVE_LAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with lame support, " "thus can't create mp3 stream: ", stream); #else audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, dsp->getChannel(), lowpass, highpass ); #endif // HAVE_TWOLAME_LIB } else if ( Util::strEq( format, "mp2") ) { #ifndef HAVE_TWOLAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with TwoLAME support, " "thus can't create MPEG Audio Layer 2 stream: ", stream); #else audioOuts[u].encoder = new TwoLameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, sampleRate, dsp->getChannel() ); #endif // HAVE_TWOLAME_LIB } else if ( Util::strEq( format, "vorbis") ) { #ifndef HAVE_VORBIS_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with Ogg Vorbis support, " "thus can't Ogg Vorbis stream: ", stream); #else audioOuts[u].encoder = new VorbisLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, dsp->getSampleRate(), dsp->getChannel() ); #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 if ( Util::strEq( format, "aacp") ) { #ifndef HAVE_AACPLUS_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with AAC+ support, " "thus can't aacplus stream: ", stream); #else audioOuts[u].encoder = new aacPlusEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, dsp->getChannel()); #endif // HAVE_AACPLUS_LIB } else { throw Exception( __FILE__, __LINE__, "Illegal stream format: ", format); } encConnector->attach( audioOuts[u].encoder.get()); } noAudioOuts += u; }
/*------------------------------------------------------------------------------ * Look for the ShoutCast stream outputs in the config file *----------------------------------------------------------------------------*/ void DarkIce :: configShoutCast ( const Config & config, unsigned int bufferSecs ) throw ( Exception ) { // look for Shoutcast encoder output streams, // sections [shoutcast-0], [shoutcast-1], ... char stream[] = "shoutcast- "; size_t streamLen = Util::strLen( stream); unsigned int u; for ( u = noAudioOuts; u < maxOutput; ++u ) { const ConfigSection * cs; // ugly hack to change the section name to "stream0", "stream1", etc. stream[streamLen-1] = '0' + (u - noAudioOuts); if ( !(cs = config.get( stream)) ) { break; } #ifndef HAVE_LAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with lame support, " "thus can't connect to ShoutCast, stream: ", stream); #else const char * str; unsigned int sampleRate = 0; unsigned int channel = 0; AudioEncoder::BitrateMode bitrateMode; unsigned int bitrate = 0; double quality = 0.0; const char * server = 0; unsigned int port = 0; const char * password = 0; const char * name = 0; const char * url = 0; const char * genre = 0; bool isPublic = false; const char * mountPoint = 0; int lowpass = 0; int highpass = 0; const char * irc = 0; const char * aim = 0; const char * icq = 0; const char * localDumpName = 0; FileSink * localDumpFile = 0; bool fileAddDate = false; const char * fileDateFormat = 0; str = cs->get( "sampleRate"); sampleRate = str ? Util::strToL( str) : dsp->getSampleRate(); str = cs->get( "channel"); channel = str ? Util::strToL( str) : dsp->getChannel(); str = cs->get( "bitrate"); bitrate = str ? Util::strToL( str) : 0; str = cs->get( "quality"); quality = str ? Util::strToD( str) : 0.0; str = cs->getForSure( "bitrateMode", " not specified in section ", stream); if ( Util::strEq( str, "cbr") ) { bitrateMode = AudioEncoder::cbr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for CBR encoding"); } if ( cs->get( "quality" ) == 0 ) { throw Exception( __FILE__, __LINE__, "quality not specified for CBR encoding"); } } else if ( Util::strEq( str, "abr") ) { bitrateMode = AudioEncoder::abr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for ABR encoding"); } } else if ( Util::strEq( str, "vbr") ) { bitrateMode = AudioEncoder::vbr; if ( cs->get( "quality" ) == 0 ) { throw Exception( __FILE__, __LINE__, "quality not specified for VBR encoding"); } } else { throw Exception( __FILE__, __LINE__, "invalid bitrate mode: ", str); } server = cs->getForSure( "server", " missing in section ", stream); str = cs->getForSure( "port", " missing in section ", stream); port = Util::strToL( str); password = cs->getForSure("password"," missing in section ",stream); name = cs->get( "name"); mountPoint = cs->get( "mountPoint" ); url = cs->get( "url"); genre = cs->get( "genre"); str = cs->get( "public"); isPublic = str ? (Util::strEq( str, "yes") ? true : false) : false; str = cs->get( "lowpass"); lowpass = str ? Util::strToL( str) : 0; str = cs->get( "highpass"); highpass = str ? Util::strToL( str) : 0; irc = cs->get( "irc"); aim = cs->get( "aim"); icq = cs->get( "icq"); str = cs->get("fileAddDate"); fileAddDate = str ? (Util::strEq( str, "yes") ? true : false) : false; fileDateFormat = cs->get( "fileDateFormat"); localDumpName = cs->get( "localDumpFile"); // go on and create the things // check for and create the local dump file if needed if ( localDumpName != 0 ) { if ( fileAddDate ) { if (fileDateFormat == 0) { localDumpName = Util::fileAddDate(localDumpName); } else { localDumpName = Util::fileAddDate( localDumpName, fileDateFormat ); } } localDumpFile = new FileSink( stream, localDumpName); if ( !localDumpFile->exists() ) { if ( !localDumpFile->create() ) { reportEvent( 1, "can't create local dump file", localDumpName); localDumpFile = 0; } } if ( fileAddDate ) { delete[] localDumpFile; } } // streaming related stuff audioOuts[u].socket = new TcpSocket( server, port); audioOuts[u].server = new ShoutCast( audioOuts[u].socket.get(), password, mountPoint, bitrate, name, url, genre, isPublic, irc, aim, icq, localDumpFile, bufferSecs ); audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, channel, lowpass, highpass ); encConnector->attach( audioOuts[u].encoder.get()); #endif // HAVE_LAME_LIB } noAudioOuts += u; }
/*------------------------------------------------------------------------------ * Look for the ShoutCast stream outputs in the config file *----------------------------------------------------------------------------*/ void DarkIce :: configShoutCast ( const Config & config, unsigned int bufferSecs ) throw ( Exception ) { // look for IceCast encoder output streams, // sections [shoutcast-0], [shoutcast-1], ... char stream[] = "shoutcast- "; size_t streamLen = Util::strLen( stream); unsigned int u; for ( u = 0; u < maxOutput; ++u ) { const ConfigSection * cs; // ugly hack to change the section name to "stream0", "stream1", etc. stream[streamLen-1] = '0' + u; if ( !(cs = config.get( stream)) ) { break; } #ifndef HAVE_LAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with lame support, " "thus can't connect to ShoutCast, stream: ", stream); #else const char * str; unsigned int sampleRate = 0; unsigned int bitrate = 0; const char * server = 0; unsigned int port = 0; const char * password = 0; const char * name = 0; const char * url = 0; const char * genre = 0; bool isPublic = false; int lowpass = 0; int highpass = 0; const char * irc = 0; const char * aim = 0; const char * icq = 0; const char * localDumpName = 0; FileSink * localDumpFile = 0; str = cs->get( "sampleRate"); sampleRate = str ? Util::strToL( str) : dsp->getSampleRate(); str = cs->getForSure("bitrate", " missing in section ", stream); bitrate = Util::strToL( str); server = cs->getForSure( "server", " missing in section ", stream); str = cs->getForSure( "port", " missing in section ", stream); port = Util::strToL( str); password = cs->getForSure("password"," missing in section ",stream); name = cs->get( "name"); url = cs->get( "url"); genre = cs->get( "genre"); str = cs->get( "public"); isPublic = str ? (Util::strEq( str, "yes") ? true : false) : false; str = cs->get( "lowpass"); lowpass = str ? Util::strToL( str) : 0; str = cs->get( "highpass"); highpass = str ? Util::strToL( str) : 0; irc = cs->get( "irc"); aim = cs->get( "aim"); icq = cs->get( "icq"); localDumpName = cs->get( "localDumpFile"); // go on and create the things // check for and create the local dump file if needed if ( localDumpName != 0 ) { localDumpFile = new FileSink( localDumpName); if ( !localDumpFile->exists() ) { if ( !localDumpFile->create() ) { reportEvent( 1, "can't create local dump file", localDumpName); localDumpFile = 0; } } } // encoder related stuff unsigned int bs = bufferSecs * (dsp->getBitsPerSample() / 8) * dsp->getChannel() * dsp->getSampleRate(); reportEvent( 6, "using buffer size", bs); // streaming related stuff audioOuts[u].socket = new TcpSocket( server, port); audioOuts[u].server = new ShoutCast( audioOuts[u].socket.get(), password, bitrate, name, url, genre, isPublic, irc, aim, icq, localDumpFile ); audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrate, sampleRate, dsp->getChannel(), lowpass, highpass ); encConnector->attach( audioOuts[u].encoder.get()); #endif // HAVE_LAME_LIB } noAudioOuts += u; }
/*------------------------------------------------------------------------------ * Look for the IceCast2 stream outputs in the config file *----------------------------------------------------------------------------*/ void DarkIce :: configIceCast2 ( const Config & config, unsigned int bufferSecs ) throw ( Exception ) { // look for IceCast2 encoder output streams, // sections [icecast2-0], [icecast2-1], ... char stream[] = "icecast2- "; size_t streamLen = Util::strLen( stream); unsigned int u; for ( u = noAudioOuts; u < maxOutput; ++u ) { const ConfigSection * cs; // ugly hack to change the section name to "stream0", "stream1", etc. stream[streamLen-1] = '0' + (u - noAudioOuts); if ( !(cs = config.get( stream)) ) { break; } const char * str; IceCast2::StreamFormat format; unsigned int sampleRate = 0; unsigned int channel = 0; AudioEncoder::BitrateMode bitrateMode; unsigned int bitrate = 0; unsigned int maxBitrate = 0; double quality = 0.0; const char * server = 0; unsigned int port = 0; const char * password = 0; const char * mountPoint = 0; const char * name = 0; const char * description = 0; const char * url = 0; const char * genre = 0; bool isPublic = false; int lowpass = 0; int highpass = 0; const char * localDumpName = 0; FileSink * localDumpFile = 0; bool fileAddDate = false; const char * fileDateFormat = 0; str = cs->getForSure( "format", " missing in section ", stream); if ( Util::strEq( str, "vorbis") ) { format = IceCast2::oggVorbis; } else if ( Util::strEq( str, "mp3") ) { format = IceCast2::mp3; } else if ( Util::strEq( str, "mp2") ) { format = IceCast2::mp2; } else if ( Util::strEq( str, "aac") ) { format = IceCast2::aac; } else if ( Util::strEq( str, "aacp") ) { format = IceCast2::aacp; } else { throw Exception( __FILE__, __LINE__, "unsupported stream format: ", str); } str = cs->get( "sampleRate"); sampleRate = str ? Util::strToL( str) : dsp->getSampleRate(); str = cs->get( "channel"); channel = str ? Util::strToL( str) : dsp->getChannel(); // determine fixed bitrate or variable bitrate quality str = cs->get( "bitrate"); bitrate = str ? Util::strToL( str) : 0; str = cs->get( "maxBitrate"); maxBitrate = str ? Util::strToL( str) : 0; str = cs->get( "quality"); quality = str ? Util::strToD( str) : 0.0; str = cs->getForSure( "bitrateMode", " not specified in section ", stream); if ( Util::strEq( str, "cbr") ) { bitrateMode = AudioEncoder::cbr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for CBR encoding"); } } else if ( Util::strEq( str, "abr") ) { bitrateMode = AudioEncoder::abr; if ( bitrate == 0 ) { throw Exception( __FILE__, __LINE__, "bitrate not specified for ABR encoding"); } } else if ( Util::strEq( str, "vbr") ) { bitrateMode = AudioEncoder::vbr; if ( cs->get( "quality" ) == 0 ) { throw Exception( __FILE__, __LINE__, "quality not specified for VBR encoding"); } } else { throw Exception( __FILE__, __LINE__, "invalid bitrate mode: ", str); } server = cs->getForSure( "server", " missing in section ", stream); str = cs->getForSure( "port", " missing in section ", stream); port = Util::strToL( str); password = cs->getForSure("password"," missing in section ",stream); mountPoint = cs->getForSure( "mountPoint", " missing in section ", stream); name = cs->get( "name"); description = cs->get( "description"); url = cs->get( "url"); genre = cs->get( "genre"); str = cs->get( "public"); isPublic = str ? (Util::strEq( str, "yes") ? true : false) : false; str = cs->get( "lowpass"); lowpass = str ? Util::strToL( str) : 0; str = cs->get( "highpass"); highpass = str ? Util::strToL( str) : 0; str = cs->get( "fileAddDate"); fileAddDate = str ? (Util::strEq( str, "yes") ? true : false) : false; fileDateFormat = cs->get( "fileDateFormat"); localDumpName = cs->get( "localDumpFile"); // go on and create the things // check for and create the local dump file if needed if ( localDumpName != 0 ) { if ( fileAddDate ) { if (fileDateFormat == 0) { localDumpName = Util::fileAddDate(localDumpName); } else { localDumpName = Util::fileAddDate( localDumpName, fileDateFormat ); } } localDumpFile = new FileSink( stream, localDumpName); if ( !localDumpFile->exists() ) { if ( !localDumpFile->create() ) { reportEvent( 1, "can't create local dump file", localDumpName); localDumpFile = 0; } } if ( fileAddDate ) { delete[] localDumpName; } } // streaming related stuff audioOuts[u].socket = new TcpSocket( server, port); audioOuts[u].server = new IceCast2( audioOuts[u].socket.get(), password, mountPoint, format, bitrate, name, description, url, genre, isPublic, localDumpFile, bufferSecs ); switch ( format ) { case IceCast2::mp3: #ifndef HAVE_LAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with lame support, " "thus can't create mp3 stream: ", stream); #else audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, channel, lowpass, highpass ); #endif // HAVE_LAME_LIB break; case IceCast2::oggVorbis: #ifndef HAVE_VORBIS_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with Ogg Vorbis support, " "thus can't Ogg Vorbis stream: ", stream); #else audioOuts[u].encoder = new VorbisLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, dsp->getChannel(), maxBitrate); #endif // HAVE_VORBIS_LIB break; case IceCast2::mp2: #ifndef HAVE_TWOLAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with TwoLame support, " "thus can't create mp2 stream: ", stream); #else audioOuts[u].encoder = new TwoLameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, sampleRate, channel ); #endif // HAVE_TWOLAME_LIB 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; case IceCast2::aacp: #ifndef HAVE_AACPLUS_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with AAC+ support, " "thus can't aacp stream: ", stream); #else audioOuts[u].encoder = new aacPlusEncoder( audioOuts[u].server.get(), dsp.get(), bitrateMode, bitrate, quality, sampleRate, channel ); #endif // HAVE_AACPLUS_LIB break; default: throw Exception( __FILE__, __LINE__, "Illegal stream format: ", format); } encConnector->attach( audioOuts[u].encoder.get()); } noAudioOuts += u; }
/*------------------------------------------------------------------------------ * Look for the IceCast2 stream outputs in the config file *----------------------------------------------------------------------------*/ void DarkIce :: configIceCast2 ( const Config & config, unsigned int bufferSecs ) throw ( Exception ) { // look for IceCast2 encoder output streams, // sections [icecast2-0], [icecast2-1], ... char stream[] = "icecast2- "; size_t streamLen = Util::strLen( stream); unsigned int u; for ( u = 0; u < maxOutput; ++u ) { const ConfigSection * cs; // ugly hack to change the section name to "stream0", "stream1", etc. stream[streamLen-1] = '0' + u; if ( !(cs = config.get( stream)) ) { break; } const char * str; IceCast2::StreamFormat format; unsigned int bitrate = 0; const char * server = 0; unsigned int port = 0; const char * password = 0; const char * mountPoint = 0; const char * name = 0; const char * description = 0; const char * url = 0; const char * genre = 0; bool isPublic = false; const char * localDumpName = 0; FileSink * localDumpFile = 0; str = cs->getForSure( "format", " missing in section ", stream); if ( Util::strEq( str, "vorbis") ) { format = IceCast2::oggVorbis; } else if ( Util::strEq( str, "mp3") ) { format = IceCast2::mp3; // TODO: enable this format in the future, when icecast2 // supports it as well throw Exception( __FILE__, __LINE__, "unsupported stream format: ", str); } else { throw Exception( __FILE__, __LINE__, "unsupported stream format: ", str); } str = cs->getForSure("bitrate", " missing in section ", stream); bitrate = Util::strToL( str); server = cs->getForSure( "server", " missing in section ", stream); str = cs->getForSure( "port", " missing in section ", stream); port = Util::strToL( str); password = cs->getForSure("password"," missing in section ",stream); mountPoint = cs->getForSure( "mountPoint", " missing in section ", stream); name = cs->get( "name"); description = cs->get("description"); url = cs->get( "url"); genre = cs->get( "genre"); str = cs->get( "public"); isPublic = str ? (Util::strEq( str, "yes") ? true : false) : false; localDumpName = cs->get( "localDumpFile"); // go on and create the things // check for and create the local dump file if needed if ( localDumpName != 0 ) { localDumpFile = new FileSink( localDumpName); if ( !localDumpFile->exists() ) { if ( !localDumpFile->create() ) { reportEvent( 1, "can't create local dump file", localDumpName); localDumpFile = 0; } } } // encoder related stuff unsigned int bs = bufferSecs * (dsp->getBitsPerSample() / 8) * dsp->getChannel() * dsp->getSampleRate(); reportEvent( 6, "using buffer size", bs); // streaming related stuff audioOuts[u].socket = new TcpSocket( server, port); audioOuts[u].server = new IceCast2( audioOuts[u].socket.get(), password, mountPoint, format, bitrate, name, description, url, genre, isPublic, localDumpFile ); switch ( format ) { case IceCast2::mp3: #ifndef HAVE_LAME_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with lame support, " "thus can't create mp3 stream: ", stream); #else audioOuts[u].encoder = new LameLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrate, dsp->getSampleRate(), dsp->getChannel() ); #endif // HAVE_LAME_LIB break; case IceCast2::oggVorbis: #ifndef HAVE_VORBIS_LIB throw Exception( __FILE__, __LINE__, "DarkIce not compiled with Ogg Vorbis support, " "thus can't Ogg Vorbis stream: ", stream); #else audioOuts[u].encoder = new VorbisLibEncoder( audioOuts[u].server.get(), dsp.get(), bitrate, dsp->getSampleRate(), dsp->getChannel() ); #endif // HAVE_VORBIS_LIB break; default: throw Exception( __FILE__, __LINE__, "Illegal stream format: ", format); } encConnector->attach( audioOuts[u].encoder.get()); } noAudioOuts += u; }