From 31baca91333bb90d0108eb912972c8279311f63a Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 26 Jul 2022 16:07:23 -0400 Subject: [PATCH] 2022-07-26 Fred Gleason * Modified 'RDWaveFile' to work around known fencepost errors in WAV files generated by "Sonic Studio soundBlade" by "PME Mastering, Inc." Signed-off-by: Fred Gleason --- ChangeLog | 4 ++++ lib/rdwavefile.cpp | 28 ++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd1687cd..149a848d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16726,3 +16726,7 @@ * Incremented the package version to 2.19.2int08. 2018-10-31 Fred Gleason * Incremented the package version to 2.19.3. +2022-07-26 Fred Gleason + * Modified 'RDWaveFile' to work around known fencepost errors in + WAV files generated by "Sonic Studio soundBlade" by + "PME Mastering, Inc." diff --git a/lib/rdwavefile.cpp b/lib/rdwavefile.cpp index 0df50dcd..0a93a7d8 100644 --- a/lib/rdwavefile.cpp +++ b/lib/rdwavefile.cpp @@ -2394,13 +2394,19 @@ bool RDWaveFile::IsM4A(int fd) off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size, bool big_end) { - int i; + int offset; char name[5]={0,0,0,0,0}; unsigned char buffer[4]; lseek(fd,12,SEEK_SET); - i=read(fd,name,4); - i=read(fd,buffer,4); + offset=read(fd,name,4); + if(!isalnum(0xff&name[0])) { + name[0]=name[1]; + name[1]=name[2]; + name[2]=name[3]; + offset=read(fd,name+3,1); + } + offset=read(fd,buffer,4); if(big_end) { *chunk_size= buffer[3]+(256*buffer[2])+(65536*buffer[1])+(16777216*buffer[0]); @@ -2409,13 +2415,23 @@ off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size, *chunk_size= buffer[0]+(256*buffer[1])+(65536*buffer[2])+(16777216*buffer[3]); } - while(i==4) { + while(offset==4) { if(strcasecmp(chunk_name,name)==0) { return lseek(fd,0,SEEK_CUR); } lseek(fd,*chunk_size,SEEK_CUR); - i=read(fd,name,4); - i=read(fd,buffer,4); + offset=read(fd,name,4); + // + // Attempt to work around known fencepost errors in WAV files generated by + // "Sonic Studio soundBlade" by "PME Mastering, Inc." (and perhaps others?) + // + if(!isalnum(0xff&name[0])) { + name[0]=name[1]; + name[1]=name[2]; + name[2]=name[3]; + offset=read(fd,name+3,1); + } + offset=read(fd,buffer,4); if(big_end) { *chunk_size=buffer[3]+(256*buffer[2])+(65536*buffer[1])+ (16777216*buffer[0]);