My code only accepts 16bit uncompressed PCM wav files atm.
I am running my test of my code with a wavfile that is 43,847,784 bytes in size. So minus 44 byte header, that should be 43,847,740.
But when I print out SubChunk2Size, that I have read in from the header, it prints a value of 27070524.
I have no explanation for this discrepancy. All other values seem to be reading in properly.
my code to read the WavFile
Code: Select all
WavFile::WavFile(std::string filename)
{
std::ifstream ifs;
ifs.open( filename, std::ios::binary | std::ios::in );
LogStream(LOG_DEBUG) << "WavFile::WavFile - - - - BEGIN READING WAV - - - -";
if(ifs.fail())
throw std::invalid_argument("WavFile::WavFile : Failed to open wavFile "+filename);
char hbytes[HEADER_SIZE];
ifs.read(hbytes , HEADER_SIZE);
// check that this is actually a wave file
bool valid_riff = hbytes[0]=='R' && hbytes[1]=='I' && hbytes[2]=='F' && hbytes[3]=='F';
bool valid_wave = hbytes[8]=='W' && hbytes[9]=='A' && hbytes[10]=='V' && hbytes[11]=='E';
bool valid_ftm = (hbytes[12]=='f' && hbytes[13]=='m' && hbytes[14]=='t' && hbytes[15]==' ');
bool valid_data = (hbytes[36]=='d' && hbytes[37]=='a' && hbytes[38]=='t' && hbytes[39]=='a');
LogStream(LOG_DEBUG) << "WavFile::WavFile - valid_riff="<<valid_riff<<" valid_wave="<<valid_wave<<" valid_ftm="<<valid_ftm<<" valid_data="<<valid_data;
if(!(valid_data && valid_ftm && valid_riff))
throw std::invalid_argument("WavFile::WavFile : Invalid argument - unable to open wavfile "+filename);
int audioFormat = ReadShort(hbytes , 20);
int SubChunk1Size = ReadInt(hbytes , 16);
if(audioFormat != 1 || SubChunk1Size != 16)
throw std::invalid_argument("WavFile::WavFile : Only uncompressed PCM wave format supported."+filename);
int subChunk2size = ReadInt(hbytes , 40);
m_header.num_channels = ReadShort(hbytes , 22);
m_header.sample_rate = ReadInt(hbytes , 24);
m_header.bits_per_sample = ReadShort(hbytes , 34);
LogStream(LOG_DEBUG) << "WavFile::WavFile num_channels="<<m_header.num_channels << " sample_rate="<<m_header.sample_rate<<" bits_per_sample="<<m_header.bits_per_sample;
m_pcm_data.resize( subChunk2size / sizeof(int16_t) );
LogStream(LOG_DEBUG) << "WavFile::WavFile - subChunk2size = "<<subChunk2size;
LogStream(LOG_DEBUG) << "WavFile::WavFile - m_pcm_data.size() = "<<m_pcm_data.size();
ifs.read((char*)m_pcm_data.data() , subChunk2size);
LogStream(LOG_DEBUG) << "WavFile: ifstream failbit="<<ifs.fail()<<" badbit="<<ifs.bad()<<" goodbit="<<ifs.good();
ifs.close();
LogStream(LOG_DEBUG) << "WavFile::WavFile - - - - END READING WAV - - - -\n";
LogStream(LOG_DEBUG) << "WavFile::WavFile";
}
Code: Select all
[2572] [SLOG][D] - WavFile::WavFile - - - - BEGIN READING WAV - - - -
[2572] [SLOG][D] - WavFile::WavFile - valid_riff=1 valid_wave=1 valid_ftm=1 valid_data=1
[2572] [SLOG][D] - WavFile::WavFile num_channels=2 sample_rate=96000 bits_per_sample=16
[2572] [SLOG][D] - WavFile::WavFile - subChunk2size = 27070524
[2572] [SLOG][D] - WavFile::WavFile - m_pcm_data.size() = 13535262
[2572] [SLOG][D] - WavFile: ifstream failbit=0 badbit=0 goodbit=1
[2572] [SLOG][D] - WavFile::WavFile - - - - END READING WAV - - - -