added possibility to downsample from stereo to mono when encoding
to Ogg Vorbis
This commit is contained in:
parent
c4c304f1c6
commit
950bca8e93
|
@ -21,4 +21,5 @@ with contributions by:
|
||||||
John Deeny <taqueso@dilapidated.org>
|
John Deeny <taqueso@dilapidated.org>
|
||||||
Robert Lunnon <bobl@optushome.com.au>
|
Robert Lunnon <bobl@optushome.com.au>
|
||||||
Enrico Ardizzoni <craken@users.sourceforge.net>
|
Enrico Ardizzoni <craken@users.sourceforge.net>
|
||||||
|
Deti Fliegl <deti@fliegl.de>
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@ DarkIce next release
|
||||||
|
|
||||||
o ported to OpenBSD and NetBSD, though real-time scheduling not supported,
|
o ported to OpenBSD and NetBSD, though real-time scheduling not supported,
|
||||||
since it is not implemented in OpenBSD / NetBSD
|
since it is not implemented in OpenBSD / NetBSD
|
||||||
|
o added possibility to downsample from stereo to mono when encoding
|
||||||
|
to Ogg Vorbis, thanks to Deti Fliegl, <deti@fliegl.de>
|
||||||
|
|
||||||
15-02-2004: DarkIce 0.14 released
|
15-02-2004: DarkIce 0.14 released
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH darkice 1 "February 15, 2004" "DarkIce" "DarkIce live audio streamer"
|
.TH darkice 1 "March 13, 2004" "DarkIce" "DarkIce live audio streamer"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
darkice \- an icecast / shoutcast live audio streamer
|
darkice \- an icecast / shoutcast live audio streamer
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -89,6 +89,7 @@ Developed with contributions by
|
||||||
John Deeny <taqueso@dilapidated.org>
|
John Deeny <taqueso@dilapidated.org>
|
||||||
Robert Lunnon <bobl@optushome.com.au>
|
Robert Lunnon <bobl@optushome.com.au>
|
||||||
Enrico Ardizzoni <craken@users.sourceforge.net>
|
Enrico Ardizzoni <craken@users.sourceforge.net>
|
||||||
|
Deti Fliegl <deti@fliegl.de>
|
||||||
|
|
||||||
.SH LINKS
|
.SH LINKS
|
||||||
Project homepage:
|
Project homepage:
|
||||||
|
|
|
@ -80,11 +80,6 @@ VorbisLibEncoder :: init ( CastSink * sink,
|
||||||
"unsupported number of channels for the encoder",
|
"unsupported number of channels for the encoder",
|
||||||
getInChannel() );
|
getInChannel() );
|
||||||
}
|
}
|
||||||
if ( getInChannel() != getOutChannel() ) {
|
|
||||||
throw Exception( __FILE__, __LINE__,
|
|
||||||
"different number of input and output channels",
|
|
||||||
getOutChannel() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( getOutSampleRate() == getInSampleRate() ) {
|
if ( getOutSampleRate() == getInSampleRate() ) {
|
||||||
resampleRatio = 1;
|
resampleRatio = 1;
|
||||||
|
@ -99,11 +94,6 @@ VorbisLibEncoder :: init ( CastSink * sink,
|
||||||
converter = new aflibConverter( true, true, false);
|
converter = new aflibConverter( true, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( getInChannel() != getOutChannel() ) {
|
|
||||||
throw Exception( __FILE__, __LINE__,
|
|
||||||
"different in and out channels not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
encoderOpen = false;
|
encoderOpen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +127,7 @@ VorbisLibEncoder :: open ( void )
|
||||||
maxBitrate = -1;
|
maxBitrate = -1;
|
||||||
}
|
}
|
||||||
if ( (ret = vorbis_encode_init( &vorbisInfo,
|
if ( (ret = vorbis_encode_init( &vorbisInfo,
|
||||||
getInChannel(),
|
getOutChannel(),
|
||||||
getOutSampleRate(),
|
getOutSampleRate(),
|
||||||
maxBitrate,
|
maxBitrate,
|
||||||
getOutBitrate() * 1000,
|
getOutBitrate() * 1000,
|
||||||
|
@ -150,7 +140,7 @@ VorbisLibEncoder :: open ( void )
|
||||||
case abr:
|
case abr:
|
||||||
/* set non-managed VBR around the average bitrate */
|
/* set non-managed VBR around the average bitrate */
|
||||||
ret = vorbis_encode_setup_managed( &vorbisInfo,
|
ret = vorbis_encode_setup_managed( &vorbisInfo,
|
||||||
getInChannel(),
|
getOutChannel(),
|
||||||
getOutSampleRate(),
|
getOutSampleRate(),
|
||||||
-1,
|
-1,
|
||||||
getOutBitrate() * 1000,
|
getOutBitrate() * 1000,
|
||||||
|
@ -165,7 +155,7 @@ VorbisLibEncoder :: open ( void )
|
||||||
|
|
||||||
case vbr:
|
case vbr:
|
||||||
if ( (ret = vorbis_encode_init_vbr( &vorbisInfo,
|
if ( (ret = vorbis_encode_init_vbr( &vorbisInfo,
|
||||||
getInChannel(),
|
getOutChannel(),
|
||||||
getOutSampleRate(),
|
getOutSampleRate(),
|
||||||
getOutQuality() )) ) {
|
getOutQuality() )) ) {
|
||||||
throw Exception( __FILE__, __LINE__,
|
throw Exception( __FILE__, __LINE__,
|
||||||
|
@ -241,10 +231,30 @@ VorbisLibEncoder :: write ( const void * buf,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int bitsPerSample = getInBitsPerSample();
|
|
||||||
unsigned int channels = getInChannel();
|
unsigned int channels = getInChannel();
|
||||||
|
unsigned int bitsPerSample = getInBitsPerSample();
|
||||||
unsigned int sampleSize = (bitsPerSample / 8) * channels;
|
unsigned int sampleSize = (bitsPerSample / 8) * channels;
|
||||||
|
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if ( getInChannel() == 2 && getOutChannel() == 1 ) {
|
||||||
|
for ( i = 0; i < len/sampleSize; i++) {
|
||||||
|
if ( bitsPerSample == 8 ) {
|
||||||
|
char * buf8 = (char *) buf;
|
||||||
|
unsigned int ix = sampleSize * i;
|
||||||
|
buf8[i] = (buf8[ix] + buf8[++ix]) / 2;
|
||||||
|
}
|
||||||
|
if ( bitsPerSample == 16 ) {
|
||||||
|
short * buf16 = (short *) buf;
|
||||||
|
unsigned int ix = (bitsPerSample >> 3) * i;
|
||||||
|
buf16[i] = (buf16[ix] + buf16[++ix]) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
len >>= 1;
|
||||||
|
channels = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sampleSize = (bitsPerSample / 8) * channels;
|
||||||
unsigned char * b = (unsigned char*) buf;
|
unsigned char * b = (unsigned char*) buf;
|
||||||
unsigned int processed = len - (len % sampleSize);
|
unsigned int processed = len - (len % sampleSize);
|
||||||
unsigned int nSamples = processed / sampleSize;
|
unsigned int nSamples = processed / sampleSize;
|
||||||
|
@ -255,6 +265,8 @@ VorbisLibEncoder :: write ( const void * buf,
|
||||||
// with channels still interleaved
|
// with channels still interleaved
|
||||||
unsigned int totalSamples = nSamples * channels;
|
unsigned int totalSamples = nSamples * channels;
|
||||||
short int * shortBuffer = new short int[totalSamples];
|
short int * shortBuffer = new short int[totalSamples];
|
||||||
|
|
||||||
|
|
||||||
Util::conv( bitsPerSample, b, processed, shortBuffer, isInBigEndian());
|
Util::conv( bitsPerSample, b, processed, shortBuffer, isInBigEndian());
|
||||||
|
|
||||||
if ( converter ) {
|
if ( converter ) {
|
||||||
|
@ -375,6 +387,10 @@ VorbisLibEncoder :: close ( void ) throw ( Exception )
|
||||||
$Source$
|
$Source$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.19 2004/03/13 10:41:39 darkeye
|
||||||
|
added possibility to downsample from stereo to mono when encoding
|
||||||
|
to Ogg Vorbis
|
||||||
|
|
||||||
Revision 1.18 2004/02/15 13:07:42 darkeye
|
Revision 1.18 2004/02/15 13:07:42 darkeye
|
||||||
ogg vorbis recording to only a file caused a segfault. now fixed
|
ogg vorbis recording to only a file caused a segfault. now fixed
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue