added function vorbisBlocksOut(), finalized vorbis support

This commit is contained in:
darkeye 2001-09-15 11:36:22 +00:00
parent 17ec06eb28
commit afc8fe2ca9
2 changed files with 68 additions and 59 deletions

View File

@ -33,12 +33,6 @@
#include "config.h" #include "config.h"
#endif #endif
#ifdef HAVE_STRING_H
#include <string.h>
#else
#error need string.h
#endif
#include "Exception.h" #include "Exception.h"
#include "Util.h" #include "Util.h"
@ -155,8 +149,7 @@ VorbisLibEncoder :: conv8 ( unsigned char * pcmBuffer,
short int value; short int value;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
leftBuffer[j] = ((float) value) / 32768.f; leftBuffer[j] = ((float) value) / 128.f;
rightBuffer[j] = leftBuffer[j];
++j; ++j;
} }
} else { } else {
@ -166,9 +159,9 @@ VorbisLibEncoder :: conv8 ( unsigned char * pcmBuffer,
short int value; short int value;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
leftBuffer[j] = ((float) value) / 32768.f; leftBuffer[j] = ((float) value) / 128.f;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
rightBuffer[j] = ((float) value) / 32768.f; rightBuffer[j] = ((float) value) / 128.f;
++j; ++j;
} }
} }
@ -193,9 +186,8 @@ VorbisLibEncoder :: conv16 ( unsigned char * pcmBuffer,
short int value; short int value;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
value += pcmBuffer[i++] << 8; value |= pcmBuffer[i++] << 8;
leftBuffer[j] = ((float) value) / 32768.f; leftBuffer[j] = ((float) value) / 32768.f;
rightBuffer[j] = leftBuffer[j];
++j; ++j;
} }
} else { } else {
@ -205,10 +197,10 @@ VorbisLibEncoder :: conv16 ( unsigned char * pcmBuffer,
short int value; short int value;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
value += pcmBuffer[i++] << 8; value |= pcmBuffer[i++] << 8;
leftBuffer[j] = ((float) value) / 32768.f; leftBuffer[j] = ((float) value) / 32768.f;
value = pcmBuffer[i++]; value = pcmBuffer[i++];
value += pcmBuffer[i++] << 8; value |= pcmBuffer[i++] << 8;
rightBuffer[j] = ((float) value) / 32768.f; rightBuffer[j] = ((float) value) / 32768.f;
++j; ++j;
} }
@ -255,36 +247,7 @@ VorbisLibEncoder :: write ( const void * buf,
} }
vorbis_analysis_wrote( &vorbisDspState, nSamples); vorbis_analysis_wrote( &vorbisDspState, nSamples);
vorbisBlocksOut();
while ( 1 == vorbis_analysis_blockout( &vorbisDspState, &vorbisBlock) ) {
ogg_packet oggPacket;
ogg_page oggPage;
vorbis_analysis( &vorbisBlock, &oggPacket);
ogg_stream_packetin( &oggStreamState, &oggPacket);
while ( ogg_stream_pageout( &oggStreamState, &oggPage) ) {
int written;
written = sink->write( oggPage.header, oggPage.header_len);
reportEvent( 5, "written to server ", written, " bytes.");
if ( written < oggPage.header_len ) {
// just let go data that could not be written
reportEvent( 2,
"couldn't write full vorbis header to underlying sink",
oggPage.header_len - written);
}
written = sink->write( oggPage.body, oggPage.body_len);
reportEvent( 5, "written to server ", written, " bytes.");
if ( written < oggPage.body_len ) {
// just let go data that could not be written
reportEvent( 2,
"couldn't write full vorbis body to underlying sink",
oggPage.body_len - written);
}
}
}
return processed; return processed;
} }
@ -302,7 +265,38 @@ VorbisLibEncoder :: flush ( void )
} }
vorbis_analysis_wrote( &vorbisDspState, 0); vorbis_analysis_wrote( &vorbisDspState, 0);
// ??? vorbisBlocksOut();
sink->flush();
}
/*------------------------------------------------------------------------------
* Send pending Vorbis blocks to the underlying stream
*----------------------------------------------------------------------------*/
void
VorbisLibEncoder :: vorbisBlocksOut ( void ) throw ()
{
while ( 1 == vorbis_analysis_blockout( &vorbisDspState, &vorbisBlock) ) {
ogg_packet oggPacket;
ogg_page oggPage;
vorbis_analysis( &vorbisBlock, &oggPacket);
ogg_stream_packetin( &oggStreamState, &oggPacket);
while ( ogg_stream_pageout( &oggStreamState, &oggPage) ) {
int written;
written = sink->write( oggPage.header, oggPage.header_len);
written += sink->write( oggPage.body, oggPage.body_len);
if ( written < oggPage.header_len + oggPage.body_len ) {
// just let go data that could not be written
reportEvent( 2,
"couldn't write full vorbis data to underlying sink",
oggPage.header_len + oggPage.body_len - written);
}
}
}
} }
@ -331,6 +325,9 @@ VorbisLibEncoder :: close ( void ) throw ( Exception )
$Source$ $Source$
$Log$ $Log$
Revision 1.2 2001/09/15 11:36:22 darkeye
added function vorbisBlocksOut(), finalized vorbis support
Revision 1.1 2001/09/14 19:31:06 darkeye Revision 1.1 2001/09/14 19:31:06 darkeye
added IceCast2 / vorbis support added IceCast2 / vorbis support

View File

@ -40,8 +40,11 @@
#include "config.h" #include "config.h"
#endif #endif
// TODO #ifdef HAVE_VORBIS_VORBISENC_H
#include <vorbis/vorbisenc.h> #include <vorbis/vorbisenc.h>
#else
#error need vorbis/vorbisenc.h
#endif
#include "Ref.h" #include "Ref.h"
@ -147,8 +150,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
* channels are interleaved * channels are interleaved
* @param lenPcmBuffer length of pcmBuffer * @param lenPcmBuffer length of pcmBuffer
* @param leftBuffer put the left channel here (must be big enough) * @param leftBuffer put the left channel here (must be big enough)
* @param rightBuffer put the right channel here (if mono, same * @param rightBuffer put the right channel here (if mono, not
* as leftChannel, must be big enough) * touched, must be big enough)
* @param channels number of channels (1 = mono, 2 = stereo) * @param channels number of channels (1 = mono, 2 = stereo)
*/ */
void void
@ -165,8 +168,8 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
* channels are interleaved * channels are interleaved
* @param lenPcmBuffer length of pcmBuffer * @param lenPcmBuffer length of pcmBuffer
* @param leftBuffer put the left channel here (must be big enough) * @param leftBuffer put the left channel here (must be big enough)
* @param rightBuffer put the right channel here (if mono, same * @param rightBuffer put the right channel here (if mono, not
* as leftChannel, must be big enough) * touched, must be big enough)
* @param channels number of channels (1 = mono, 2 = stereo) * @param channels number of channels (1 = mono, 2 = stereo)
*/ */
void void
@ -176,6 +179,12 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
float * rightBuffer, float * rightBuffer,
unsigned int channels ); unsigned int channels );
/**
* Send pending Vorbis blocks to the underlying stream
*/
void
vorbisBlocksOut( void ) throw ();
protected: protected:
@ -433,6 +442,9 @@ class VorbisLibEncoder : public AudioEncoder, public virtual Reporter
$Source$ $Source$
$Log$ $Log$
Revision 1.2 2001/09/15 11:36:22 darkeye
added function vorbisBlocksOut(), finalized vorbis support
Revision 1.1 2001/09/14 19:31:06 darkeye Revision 1.1 2001/09/14 19:31:06 darkeye
added IceCast2 / vorbis support added IceCast2 / vorbis support