2020-07-07 Fred Gleason <fredg@paravelsystems.com>

* 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 <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2020-07-07 12:08:49 -04:00
parent 5ee62649ab
commit 5692b42aef
2 changed files with 27 additions and 6 deletions

View File

@ -19912,3 +19912,7 @@
2020-06-23 Fred Gleason <fredg@paravelsystems.com> 2020-06-23 Fred Gleason <fredg@paravelsystems.com>
* Applied the RD_MAX_CART_NUMBER define in * Applied the RD_MAX_CART_NUMBER define in
'rdairplay/local_macros.cpp'. 'rdairplay/local_macros.cpp'.
2020-07-07 Fred Gleason <fredg@paravelsystems.com>
* Modified 'RDWaveFile' to work around known fencepost errors in
WAV files generated by "Sonic Studio soundBlade" by
"PME Mastering, Inc."

View File

@ -2494,16 +2494,23 @@ bool RDWaveFile::IsM4A(int fd)
#endif #endif
} }
off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size, off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
bool big_end) bool big_end)
{ {
int i; int offset;
char name[5]={0,0,0,0,0}; char name[5]={0,0,0,0,0};
unsigned char buffer[4]; unsigned char buffer[4];
lseek(fd,12,SEEK_SET); lseek(fd,12,SEEK_SET);
i=read(fd,name,4); offset=read(fd,name,4);
i=read(fd,buffer,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) { if(big_end) {
*chunk_size= *chunk_size=
buffer[3]+(256*buffer[2])+(65536*buffer[1])+(16777216*buffer[0]); buffer[3]+(256*buffer[2])+(65536*buffer[1])+(16777216*buffer[0]);
@ -2512,13 +2519,23 @@ off_t RDWaveFile::FindChunk(int fd,const char *chunk_name,unsigned *chunk_size,
*chunk_size= *chunk_size=
buffer[0]+(256*buffer[1])+(65536*buffer[2])+(16777216*buffer[3]); buffer[0]+(256*buffer[1])+(65536*buffer[2])+(16777216*buffer[3]);
} }
while(i==4) { while(offset==4) {
if(strcasecmp(chunk_name,name)==0) { if(strcasecmp(chunk_name,name)==0) {
return lseek(fd,0,SEEK_CUR); return lseek(fd,0,SEEK_CUR);
} }
lseek(fd,*chunk_size,SEEK_CUR); lseek(fd,*chunk_size,SEEK_CUR);
i=read(fd,name,4); offset=read(fd,name,4);
i=read(fd,buffer,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) { if(big_end) {
*chunk_size=buffer[3]+(256*buffer[2])+(65536*buffer[1])+ *chunk_size=buffer[3]+(256*buffer[2])+(65536*buffer[1])+
(16777216*buffer[0]); (16777216*buffer[0]);