1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-03 17:39:25 +02:00

Bug 2383 - Audio converted to 16-bit before encoded to MP3

This commit is contained in:
Leland Lucius 2020-04-17 00:50:52 -05:00
parent a6d0b3f902
commit efa9354e8d

View File

@ -700,20 +700,20 @@ typedef lame_global_flags *lame_init_t(void);
typedef int lame_init_params_t(lame_global_flags*); typedef int lame_init_params_t(lame_global_flags*);
typedef const char* get_lame_version_t(void); typedef const char* get_lame_version_t(void);
typedef int lame_encode_buffer_t ( typedef int CDECL lame_encode_buffer_ieee_float_t(
lame_global_flags* gf, lame_t gfp,
const short int buffer_l [], const float pcm_l[],
const short int buffer_r [], const float pcm_r[],
const int nsamples, const int nsamples,
unsigned char * mp3buf, unsigned char * mp3buf,
const int mp3buf_size); const int mp3buf_size);
typedef int lame_encode_buffer_interleaved_t( typedef int CDECL lame_encode_buffer_interleaved_ieee_float_t(
lame_global_flags* gf, lame_t gfp,
short int pcm[], const float pcm[],
int num_samples, /* per channel */ const int nsamples,
unsigned char * mp3buf, unsigned char * mp3buf,
int mp3buf_size ); const int mp3buf_size);
typedef int lame_encode_flush_t( typedef int lame_encode_flush_t(
lame_global_flags *gf, lame_global_flags *gf,
@ -826,12 +826,12 @@ public:
int GetOutBufferSize(); int GetOutBufferSize();
/* returns the number of bytes written. input is interleaved if stereo*/ /* returns the number of bytes written. input is interleaved if stereo*/
int EncodeBuffer(short int inbuffer[], unsigned char outbuffer[]); int EncodeBuffer(float inbuffer[], unsigned char outbuffer[]);
int EncodeRemainder(short int inbuffer[], int nSamples, int EncodeRemainder(float inbuffer[], int nSamples,
unsigned char outbuffer[]); unsigned char outbuffer[]);
int EncodeBufferMono(short int inbuffer[], unsigned char outbuffer[]); int EncodeBufferMono(float inbuffer[], unsigned char outbuffer[]);
int EncodeRemainderMono(short int inbuffer[], int nSamples, int EncodeRemainderMono(float inbuffer[], int nSamples,
unsigned char outbuffer[]); unsigned char outbuffer[]);
int FinishStream(unsigned char outbuffer[]); int FinishStream(unsigned char outbuffer[]);
@ -863,8 +863,8 @@ private:
/* function pointers to the symbols we get from the library */ /* function pointers to the symbols we get from the library */
lame_init_t* lame_init; lame_init_t* lame_init;
lame_init_params_t* lame_init_params; lame_init_params_t* lame_init_params;
lame_encode_buffer_t* lame_encode_buffer; lame_encode_buffer_ieee_float_t* lame_encode_buffer_ieee_float;
lame_encode_buffer_interleaved_t* lame_encode_buffer_interleaved; lame_encode_buffer_interleaved_ieee_float_t* lame_encode_buffer_interleaved_ieee_float;
lame_encode_flush_t* lame_encode_flush; lame_encode_flush_t* lame_encode_flush;
lame_close_t* lame_close; lame_close_t* lame_close;
get_lame_version_t* get_lame_version; get_lame_version_t* get_lame_version;
@ -1085,8 +1085,8 @@ bool MP3Exporter::InitLibraryInternal()
lame_init = ::lame_init; lame_init = ::lame_init;
get_lame_version = ::get_lame_version; get_lame_version = ::get_lame_version;
lame_init_params = ::lame_init_params; lame_init_params = ::lame_init_params;
lame_encode_buffer = ::lame_encode_buffer; lame_encode_buffer_ieee_float = ::lame_encode_buffer_ieee_float;
lame_encode_buffer_interleaved = ::lame_encode_buffer_interleaved; lame_encode_buffer_interleaved_ieee_float = ::lame_encode_buffer_interleaved_ieee_float;
lame_encode_flush = ::lame_encode_flush; lame_encode_flush = ::lame_encode_flush;
lame_close = ::lame_close; lame_close = ::lame_close;
@ -1146,10 +1146,10 @@ bool MP3Exporter::InitLibraryExternal(wxString libpath)
lame_lib.GetSymbol(wxT("get_lame_version")); lame_lib.GetSymbol(wxT("get_lame_version"));
lame_init_params = (lame_init_params_t *) lame_init_params = (lame_init_params_t *)
lame_lib.GetSymbol(wxT("lame_init_params")); lame_lib.GetSymbol(wxT("lame_init_params"));
lame_encode_buffer = (lame_encode_buffer_t *) lame_encode_buffer_ieee_float = (lame_encode_buffer_ieee_float_t *)
lame_lib.GetSymbol(wxT("lame_encode_buffer")); lame_lib.GetSymbol(wxT("lame_encode_buffer_ieee_float"));
lame_encode_buffer_interleaved = (lame_encode_buffer_interleaved_t *) lame_encode_buffer_interleaved_ieee_float = (lame_encode_buffer_interleaved_ieee_float_t *)
lame_lib.GetSymbol(wxT("lame_encode_buffer_interleaved")); lame_lib.GetSymbol(wxT("lame_encode_buffer_interleaved_ieee_float_t"));
lame_encode_flush = (lame_encode_flush_t *) lame_encode_flush = (lame_encode_flush_t *)
lame_lib.GetSymbol(wxT("lame_encode_flush")); lame_lib.GetSymbol(wxT("lame_encode_flush"));
lame_close = (lame_close_t *) lame_close = (lame_close_t *)
@ -1199,8 +1199,8 @@ bool MP3Exporter::InitLibraryExternal(wxString libpath)
if (!lame_init || if (!lame_init ||
!get_lame_version || !get_lame_version ||
!lame_init_params || !lame_init_params ||
!lame_encode_buffer || !lame_encode_buffer_ieee_float ||
!lame_encode_buffer_interleaved || !lame_encode_buffer_interleaved_ieee_float ||
!lame_encode_flush || !lame_encode_flush ||
!lame_close || !lame_close ||
!lame_set_in_samplerate || !lame_set_in_samplerate ||
@ -1386,45 +1386,45 @@ int MP3Exporter::GetOutBufferSize()
return mOutBufferSize; return mOutBufferSize;
} }
int MP3Exporter::EncodeBuffer(short int inbuffer[], unsigned char outbuffer[]) int MP3Exporter::EncodeBuffer(float inbuffer[], unsigned char outbuffer[])
{ {
if (!mEncoding) { if (!mEncoding) {
return -1; return -1;
} }
return lame_encode_buffer_interleaved(mGF, inbuffer, mSamplesPerChunk, return lame_encode_buffer_interleaved_ieee_float(mGF, inbuffer, mSamplesPerChunk,
outbuffer, mOutBufferSize); outbuffer, mOutBufferSize);
} }
int MP3Exporter::EncodeRemainder(short int inbuffer[], int nSamples, int MP3Exporter::EncodeRemainder(float inbuffer[], int nSamples,
unsigned char outbuffer[]) unsigned char outbuffer[])
{ {
if (!mEncoding) { if (!mEncoding) {
return -1; return -1;
} }
return lame_encode_buffer_interleaved(mGF, inbuffer, nSamples, outbuffer, return lame_encode_buffer_interleaved_ieee_float(mGF, inbuffer, nSamples, outbuffer,
mOutBufferSize); mOutBufferSize);
} }
int MP3Exporter::EncodeBufferMono(short int inbuffer[], unsigned char outbuffer[]) int MP3Exporter::EncodeBufferMono(float inbuffer[], unsigned char outbuffer[])
{ {
if (!mEncoding) { if (!mEncoding) {
return -1; return -1;
} }
return lame_encode_buffer(mGF, inbuffer,inbuffer, mSamplesPerChunk, return lame_encode_buffer_ieee_float(mGF, inbuffer,inbuffer, mSamplesPerChunk,
outbuffer, mOutBufferSize); outbuffer, mOutBufferSize);
} }
int MP3Exporter::EncodeRemainderMono(short int inbuffer[], int nSamples, int MP3Exporter::EncodeRemainderMono(float inbuffer[], int nSamples,
unsigned char outbuffer[]) unsigned char outbuffer[])
{ {
if (!mEncoding) { if (!mEncoding) {
return -1; return -1;
} }
return lame_encode_buffer(mGF, inbuffer, inbuffer, nSamples, outbuffer, return lame_encode_buffer_ieee_float(mGF, inbuffer, inbuffer, nSamples, outbuffer,
mOutBufferSize); mOutBufferSize);
} }
@ -1914,7 +1914,7 @@ ProgressResult ExportMP3::Export(AudacityProject *project,
auto mixer = CreateMixer(tracks, selectionOnly, auto mixer = CreateMixer(tracks, selectionOnly,
t0, t1, t0, t1,
channels, inSamples, true, channels, inSamples, true,
rate, int16Sample, true, mixerSpec); rate, floatSample, true, mixerSpec);
TranslatableString title; TranslatableString title;
if (rmode == MODE_SET) { if (rmode == MODE_SET) {
@ -1946,7 +1946,7 @@ ProgressResult ExportMP3::Export(AudacityProject *project,
break; break;
} }
short *mixed = (short *)mixer->GetBuffer(); float *mixed = (float *)mixer->GetBuffer();
if ((int)blockLen < inSamples) { if ((int)blockLen < inSamples) {
if (channels > 1) { if (channels > 1) {