From 5b5800d27fd53155b7b212cc6ad6b05cb5288e38 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Thu, 16 Mar 2017 16:11:41 -0400 Subject: [PATCH] 2017-03-16 Fred Gleason * Fixed a bug in 'lib/rdaudioconvert.cpp' that caused conversions from MPEG Layer 3 VBR data to be truncated when no end point was specified. * Fixed a bug in 'web/rdxport/import.cpp' that caused the end marker to be positioned incorrectly when importing MPEG Layer 3 VBR files. --- ChangeLog | 7 +++++++ lib/rdaudioconvert.cpp | 16 ++++++++-------- web/rdxport/import.cpp | 12 ++++++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8e1b98fd..6eab52df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15642,3 +15642,10 @@ * Fixed typos in 'rlm/rlm_tagstation.c' that caused failure to read the 'CategoryAdvertisements=' and 'CategoryPromotions=' directives. +2017-03-16 Fred Gleason + * Fixed a bug in 'lib/rdaudioconvert.cpp' that caused conversions + from MPEG Layer 3 VBR data to be truncated when no end point + was specified. + * Fixed a bug in 'web/rdxport/import.cpp' that caused the + end marker to be positioned incorrectly when importing MPEG + Layer 3 VBR files. diff --git a/lib/rdaudioconvert.cpp b/lib/rdaudioconvert.cpp index 9e557e40..350cd732 100644 --- a/lib/rdaudioconvert.cpp +++ b/lib/rdaudioconvert.cpp @@ -558,7 +558,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile, unsigned char buffer[STAGE1BUFSIZE]; float sf_buffer[1152*2]; sf_count_t start=0; - sf_count_t end=wave->getSampleLength(); + int64_t end=-1; sf_count_t frames=0; // @@ -607,13 +607,13 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile, int thiserr=mad_frame_decode(&mad_frame,&mad_stream); if(thiserr!=0) { - if(!MAD_RECOVERABLE(mad_stream.error)) + if(!MAD_RECOVERABLE(mad_stream.error)) { break; - else + } + else { continue; + } } - - //printf("decoding...\n"); mad_synth_frame(&mad_synth,&mad_frame); for(int i=0;i=start) { - if((frames+mad_synth.pcm.length)getChannels()); sf_writef_float(sf_dst,sf_buffer,mad_synth.pcm.length); } @@ -659,9 +659,9 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile, // Prevent buffer overflow on malformed files. // The amount checked for should match the maximum amount that may be read // by the next top-of-loop wave->readWave call. - if(left_over + fsize + 1 > STAGE1BUFSIZE) + if(left_over + fsize + 1 > STAGE1BUFSIZE) { return RDAudioConvert::ErrorFormatError; - + } memmove(buffer,mad_stream.next_frame,left_over); } diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index 19087039..8ab34f71 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -37,7 +37,7 @@ void Xport::Import() { unsigned length_deviation=0; - unsigned msecs; + unsigned msecs=0; int resp_code=0; // @@ -159,7 +159,6 @@ void Xport::Import() delete wave; XmlExit("Format Not Supported",415); } - msecs=wave->getExtTimeLength(); delete wave; RDAudioConvert *conv=new RDAudioConvert(xport_config->stationName()); conv->setSourceFile(filename); @@ -168,6 +167,15 @@ void Xport::Import() RDAudioConvert::ErrorCode conv_err=conv->convert(); switch(conv_err) { case RDAudioConvert::ErrorOk: + wave=new RDWaveFile(RDCut::pathName(cartnum,cutnum)); + if(wave->openWave()) { + msecs=wave->getExtTimeLength(); + } + else { + delete wave; + XmlExit("Unable to access imported file",500); + } + delete wave; cut->checkInRecording(xport_config->stationName(),settings,msecs); if(use_metadata>0) { cart->setMetadata(conv->sourceWaveData());