added real support for 8 / 16 bit mono / stereo input
(8 bit input still has to be spread on 16 bit words)
This commit is contained in:
		
							parent
							
								
									9467f67fb9
								
							
						
					
					
						commit
						5bdf95de9f
					
				| 
						 | 
					@ -39,12 +39,6 @@
 | 
				
			||||||
#error need string.h
 | 
					#error need string.h
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_LAME_LIB
 | 
					 | 
				
			||||||
#include <lame/lame.h>
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#error need lame/lame.h
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Exception.h"
 | 
					#include "Exception.h"
 | 
				
			||||||
#include "Util.h"
 | 
					#include "Util.h"
 | 
				
			||||||
| 
						 | 
					@ -93,6 +87,15 @@ LameLibEncoder :: open ( void )
 | 
				
			||||||
                         getInChannel() );
 | 
					                         getInChannel() );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ( 0 > lame_set_mode( lameGlobalFlags,
 | 
				
			||||||
 | 
					                            getInChannel() == 1 ? MONO : JOINT_STEREO) ) {
 | 
				
			||||||
 | 
					        throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
 | 
					                         "lame lib setting mode error",
 | 
				
			||||||
 | 
					                         JOINT_STEREO );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    reportEvent( 5, "set lame mode", lame_get_mode( lameGlobalFlags));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    reportEvent( 5,
 | 
					    reportEvent( 5,
 | 
				
			||||||
                 "set lame channels",
 | 
					                 "set lame channels",
 | 
				
			||||||
                 lame_get_num_channels( lameGlobalFlags));
 | 
					                 lame_get_num_channels( lameGlobalFlags));
 | 
				
			||||||
| 
						 | 
					@ -159,14 +162,6 @@ LameLibEncoder :: open ( void )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reportEvent( 5, "set lame quality", lame_get_quality( lameGlobalFlags));
 | 
					    reportEvent( 5, "set lame quality", lame_get_quality( lameGlobalFlags));
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if ( 0 > lame_set_mode( lameGlobalFlags, JOINT_STEREO) ) {
 | 
					 | 
				
			||||||
        throw Exception( __FILE__, __LINE__,
 | 
					 | 
				
			||||||
                         "lame lib setting mode error",
 | 
					 | 
				
			||||||
                         JOINT_STEREO );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    reportEvent( 5, "set lame mode", lame_get_mode( lameGlobalFlags));
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if ( 0 > lame_set_exp_nspsytune( lameGlobalFlags, 1) ) {
 | 
					    if ( 0 > lame_set_exp_nspsytune( lameGlobalFlags, 1) ) {
 | 
				
			||||||
        throw Exception( __FILE__, __LINE__,
 | 
					        throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
                         "lame lib setting  psycho acoustic model error");
 | 
					                         "lame lib setting  psycho acoustic model error");
 | 
				
			||||||
| 
						 | 
					@ -215,25 +210,73 @@ LameLibEncoder :: write (   const void    * buf,
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    unsigned int    bitsPerSample = getInBitsPerSample();
 | 
				
			||||||
 | 
					    unsigned int    channels      = getInChannel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ( bitsPerSample != 8 && bitsPerSample != 16 ) {
 | 
				
			||||||
 | 
					        throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
 | 
					                        "unsupported number of bits per sample for the encoder",
 | 
				
			||||||
 | 
					                         bitsPerSample );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if ( channels != 1 && channels != 2 ) {
 | 
				
			||||||
 | 
					        throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
 | 
					                         "unsupport number of channels for the encoder",
 | 
				
			||||||
 | 
					                         channels );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    unsigned int    sampleSize = (bitsPerSample / 8) * channels;
 | 
				
			||||||
    unsigned char * b = (unsigned char*) buf;
 | 
					    unsigned char * b = (unsigned char*) buf;
 | 
				
			||||||
    unsigned int    processed = len - (len % 4);
 | 
					    unsigned int    processed = len - (len % sampleSize);
 | 
				
			||||||
    unsigned int    nSamples = processed / 4;
 | 
					    unsigned int    nSamples = processed / sampleSize;
 | 
				
			||||||
    short int       leftBuffer[nSamples];
 | 
					    short int       leftBuffer[nSamples];
 | 
				
			||||||
    short int       rightBuffer[nSamples];
 | 
					    short int       rightBuffer[nSamples];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unsigned int    i, j;
 | 
					    unsigned int    i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for ( i = 0, j = 0; i < processed; ) {
 | 
					    if ( bitsPerSample == 8 ) {
 | 
				
			||||||
        unsigned short int   value;
 | 
					        // TODO: spread the 8 bits on the whole 16 bit input values
 | 
				
			||||||
 | 
					        if ( channels == 1 ) {
 | 
				
			||||||
 | 
					            for ( i = 0, j = 0; i < processed; ) {
 | 
				
			||||||
 | 
					                unsigned short int   value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        value  = b[i++];
 | 
					                value  = b[i++];
 | 
				
			||||||
        value += b[i++] << 8;
 | 
					                leftBuffer[j] = (short int) value;
 | 
				
			||||||
        leftBuffer[j] = (short int) value;
 | 
					                ++j;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            for ( i = 0, j = 0; i < processed; ) {
 | 
				
			||||||
 | 
					                unsigned short int   value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        value  = b[i++];
 | 
					                value  = b[i++];
 | 
				
			||||||
        value += b[i++] << 8;
 | 
					                leftBuffer[j] = (short int) value;
 | 
				
			||||||
        rightBuffer[j] = (short int) value;
 | 
					                value  = b[i++];
 | 
				
			||||||
 | 
					                rightBuffer[j] = (short int) value;
 | 
				
			||||||
 | 
					                ++j;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if ( bitsPerSample == 16 ) {
 | 
				
			||||||
 | 
					        if ( channels == 1 ) {
 | 
				
			||||||
 | 
					            for ( i = 0, j = 0; i < processed; ) {
 | 
				
			||||||
 | 
					                unsigned short int   value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ++j;
 | 
					                value  = b[i++];
 | 
				
			||||||
 | 
					                value += b[i++] << 8;
 | 
				
			||||||
 | 
					                leftBuffer[j] = (short int) value;
 | 
				
			||||||
 | 
					                ++j;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            for ( i = 0, j = 0; i < processed; ) {
 | 
				
			||||||
 | 
					                unsigned short int   value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                value  = b[i++];
 | 
				
			||||||
 | 
					                value += b[i++] << 8;
 | 
				
			||||||
 | 
					                leftBuffer[j] = (short int) value;
 | 
				
			||||||
 | 
					                value  = b[i++];
 | 
				
			||||||
 | 
					                value += b[i++] << 8;
 | 
				
			||||||
 | 
					                rightBuffer[j] = (short int) value;
 | 
				
			||||||
 | 
					                ++j;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // data chunk size estimate according to lame documentation
 | 
					    // data chunk size estimate according to lame documentation
 | 
				
			||||||
| 
						 | 
					@ -243,7 +286,7 @@ LameLibEncoder :: write (   const void    * buf,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = lame_encode_buffer( lameGlobalFlags,
 | 
					    ret = lame_encode_buffer( lameGlobalFlags,
 | 
				
			||||||
                              leftBuffer,
 | 
					                              leftBuffer,
 | 
				
			||||||
                              rightBuffer,
 | 
					                              channels == 2 ? rightBuffer : leftBuffer,
 | 
				
			||||||
                              nSamples,
 | 
					                              nSamples,
 | 
				
			||||||
                              mp3Buf,
 | 
					                              mp3Buf,
 | 
				
			||||||
                              mp3Size );
 | 
					                              mp3Size );
 | 
				
			||||||
| 
						 | 
					@ -253,7 +296,13 @@ LameLibEncoder :: write (   const void    * buf,
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sink->write( mp3Buf, ret);
 | 
					    unsigned int    written = sink->write( mp3Buf, ret);
 | 
				
			||||||
 | 
					    // just let go data that could not be written
 | 
				
			||||||
 | 
					    if ( written < (unsigned int) ret ) {
 | 
				
			||||||
 | 
					        reportEvent( 2,
 | 
				
			||||||
 | 
					                     "couldn't write all from encoder to underlying sink",
 | 
				
			||||||
 | 
					                     ret - written);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return processed;
 | 
					    return processed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -277,7 +326,13 @@ LameLibEncoder :: flush ( void )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = lame_encode_flush( lameGlobalFlags, mp3Buf, mp3Size );
 | 
					    ret = lame_encode_flush( lameGlobalFlags, mp3Buf, mp3Size );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sink->write( mp3Buf, ret);
 | 
					    unsigned int    written = sink->write( mp3Buf, ret);
 | 
				
			||||||
 | 
					    // just let go data that could not be written
 | 
				
			||||||
 | 
					    if ( written < (unsigned int) ret ) {
 | 
				
			||||||
 | 
					        reportEvent( 2,
 | 
				
			||||||
 | 
					                     "couldn't write all from encoder to underlying sink",
 | 
				
			||||||
 | 
					                     ret - written);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,6 +356,10 @@ LameLibEncoder :: close ( void )                    throw ( Exception )
 | 
				
			||||||
  $Source$
 | 
					  $Source$
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
 | 
					  Revision 1.2  2001/08/29 21:06:16  darkeye
 | 
				
			||||||
 | 
					  added real support for 8 / 16 bit mono / stereo input
 | 
				
			||||||
 | 
					  (8 bit input still has to be spread on 16 bit words)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.1  2001/08/26 20:44:30  darkeye
 | 
					  Revision 1.1  2001/08/26 20:44:30  darkeye
 | 
				
			||||||
  removed external command-line encoder support
 | 
					  removed external command-line encoder support
 | 
				
			||||||
  replaced it with a shared-object support for lame with the possibility
 | 
					  replaced it with a shared-object support for lame with the possibility
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,11 +119,12 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter,
 | 
				
			||||||
            this->lowpass  = lowpass;
 | 
					            this->lowpass  = lowpass;
 | 
				
			||||||
            this->highpass = highpass;
 | 
					            this->highpass = highpass;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ( getInBitsPerSample() != 16 ) {
 | 
					            if ( getInBitsPerSample() != 16 && getInBitsPerSample() != 8 ) {
 | 
				
			||||||
                throw Exception( __FILE__, __LINE__,
 | 
					                throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
                                 "only 16 bits per sample supported");
 | 
					                                 "specified bits per sample not supported",
 | 
				
			||||||
 | 
					                                 getInBitsPerSample() );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            if ( getOutSampleRate() != getInSampleRate() ) {
 | 
					            if ( getOutSampleRate() != getInSampleRate() ) {
 | 
				
			||||||
                throw Exception( __FILE__, __LINE__,
 | 
					                throw Exception( __FILE__, __LINE__,
 | 
				
			||||||
                              "different in and out sample rate not supported");
 | 
					                              "different in and out sample rate not supported");
 | 
				
			||||||
| 
						 | 
					@ -426,6 +427,10 @@ class LameLibEncoder : public AudioEncoder, public virtual Reporter,
 | 
				
			||||||
  $Sourc$
 | 
					  $Sourc$
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
 | 
					  Revision 1.2  2001/08/29 21:06:16  darkeye
 | 
				
			||||||
 | 
					  added real support for 8 / 16 bit mono / stereo input
 | 
				
			||||||
 | 
					  (8 bit input still has to be spread on 16 bit words)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.1  2001/08/26 20:44:30  darkeye
 | 
					  Revision 1.1  2001/08/26 20:44:30  darkeye
 | 
				
			||||||
  removed external command-line encoder support
 | 
					  removed external command-line encoder support
 | 
				
			||||||
  replaced it with a shared-object support for lame with the possibility
 | 
					  replaced it with a shared-object support for lame with the possibility
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue