static bool ReadWAV (const char *name, Uint8 *buf, int size, ALuint albuffer) { WAVHeader *header = (WAVHeader *)buf; if (memcmp (header->riff, "RIFF",4) || memcmp (header->wavefmt, "WAVEfmt", 7)) { handleerror(0, "ReadWAV: invalid header.", name, 0); return false; } #define hswabword(c) header->c = swabword(header->c) #define hswabdword(c) header->c = swabdword(header->c) hswabword(format_tag); hswabword(channels); hswabword(BlockAlign); hswabword(BitsPerSample); hswabdword(totalLength); hswabdword(length); hswabdword(SamplesPerSec); hswabdword(AvgBytesPerSec); hswabdword(datalen); #undef hswabword #undef hswabdword if (header->format_tag != 1) { // Microsoft PCM format? handleerror(0,"ReadWAV: invalid format tag.", name, 0); return false; } ALenum format; if (header->channels == 1) { if (header->BitsPerSample == 8) format = AL_FORMAT_MONO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_MONO16; else { handleerror(0,"ReadWAV: invalid number of bits per sample (mono).",name,0); return false; } } else if(header->channels == 2) { if (header->BitsPerSample == 8) format = AL_FORMAT_STEREO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_STEREO16; else { handleerror(0,"ReadWAV: invalid number of bits per sample (stereo).", name,0); return false; } } else { handleerror(0,"ReadWAV (%s): invalid number of channels.", name,0); return false; } alBufferData(albuffer,format,buf+sizeof(WAVHeader),header->datalen > size-sizeof(WAVHeader) ? size-sizeof(WAVHeader) : header->datalen,header->SamplesPerSec); return CheckError("ReadWAV"); }
bool CDxSound::ReadWAV (const char *name, Uint8 *buf, int fileSize, Uint8 **soundData, Uint32* bufferSize, WAVEFORMATEX& wf) { WAVHeader *header = (WAVHeader *)buf; if (memcmp (header->riff, "RIFF",4) || memcmp (header->wavefmt, "WAVEfmt", 7)) { if (hardFail) { handleerror(0, "ReadWAV: invalid header.", name, 0); } return false; } #define hswabword(c) header->c = swabword(header->c) #define hswabdword(c) header->c = swabdword(header->c) hswabword(format_tag); hswabword(channels); hswabword(BlockAlign); hswabword(BitsPerSample); hswabdword(totalLength); hswabdword(length); hswabdword(SamplesPerSec); hswabdword(AvgBytesPerSec); hswabdword(datalen); #undef hswabword #undef hswabdword if (header->format_tag != 1) { // Microsoft PCM format? if (hardFail) { handleerror(0,"ReadWAV: invalid format tag.", name, 0); } return false; } wf.cbSize = 0; wf.wFormatTag = WAVE_FORMAT_PCM; wf.nChannels = header->channels; wf.nSamplesPerSec = header->SamplesPerSec; wf.wBitsPerSample = header->BitsPerSample; wf.nBlockAlign = header->channels * header->BitsPerSample / 8; wf.nAvgBytesPerSec = header->SamplesPerSec * wf.nBlockAlign; *bufferSize = header->datalen > fileSize-sizeof(WAVHeader) ? fileSize-sizeof(WAVHeader) : header->datalen; *soundData = buf + sizeof(WAVHeader); return true; }
bool SoundBuffer::LoadWAV(const std::string& file, std::vector<boost::uint8_t> buffer, bool strict) { WAVHeader* header = (WAVHeader*)(&buffer[0]); if (memcmp(header->riff, "RIFF", 4) || memcmp(header->wavefmt, "WAVEfmt", 7)) { if (strict) { ErrorMessageBox("ReadWAV: invalid header.", file, 0); } return false; } #define hswabword(c) header->c = swabword(header->c) #define hswabdword(c) header->c = swabdword(header->c) hswabword(format_tag); hswabword(channels); hswabword(BlockAlign); hswabword(BitsPerSample); hswabdword(totalLength); hswabdword(length); hswabdword(SamplesPerSec); hswabdword(AvgBytesPerSec); hswabdword(datalen); #undef hswabword #undef hswabdword if (header->format_tag != 1) { // Microsoft PCM format? if (strict) { ErrorMessageBox("ReadWAV: invalid format tag.", file, 0); } return false; } ALenum format; if (header->channels == 1) { if (header->BitsPerSample == 8) format = AL_FORMAT_MONO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_MONO16; else { if (strict) { ErrorMessageBox("ReadWAV: invalid number of bits per sample (mono).", file, 0); } return false; } } else if (header->channels == 2) { if (header->BitsPerSample == 8) format = AL_FORMAT_STEREO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_STEREO16; else { if (strict) { ErrorMessageBox("ReadWAV: invalid number of bits per sample (stereo).", file, 0); } return false; } } else { if (strict) { ErrorMessageBox("ReadWAV (%s): invalid number of channels.", file, 0); } return false; } if (static_cast<unsigned>(header->datalen) > buffer.size() - sizeof(WAVHeader)) { LogObject(LOG_SOUND) << "WAV file " << file << " has data length " << header->datalen << " greater than actual data length " << buffer.size() - sizeof(WAVHeader); // logOutput.Print("OpenAL: size %d\n", size); // logOutput.Print("OpenAL: sizeof(WAVHeader) %d\n", sizeof(WAVHeader)); // logOutput.Print("OpenAL: format_tag %d\n", header->format_tag); // logOutput.Print("OpenAL: channels %d\n", header->channels); // logOutput.Print("OpenAL: BlockAlign %d\n", header->BlockAlign); // logOutput.Print("OpenAL: BitsPerSample %d\n", header->BitsPerSample); // logOutput.Print("OpenAL: totalLength %d\n", header->totalLength); // logOutput.Print("OpenAL: length %d\n", header->length); // logOutput.Print("OpenAL: SamplesPerSec %d\n", header->SamplesPerSec); // logOutput.Print("OpenAL: AvgBytesPerSec %d\n", header->AvgBytesPerSec); header->datalen = boost::uint32_t(buffer.size() - sizeof(WAVHeader))&(~boost::uint32_t((header->BitsPerSample*header->channels)/8 -1)); } if (!AlGenBuffer(file, format, &buffer[sizeof(WAVHeader)], header->datalen, header->SamplesPerSec)) LogObject(LOG_SOUND) << "Loading audio failed for " << file; return true; }
bool COpenALSound::ReadWAV(const char* name, Uint8* buf, int size, ALuint albuffer) { WAVHeader* header = (WAVHeader*) buf; if (memcmp(header->riff, "RIFF", 4) || memcmp(header->wavefmt, "WAVEfmt", 7)) { if (hardFail) { handleerror(0, "ReadWAV: invalid header.", name, 0); } return false; } #define hswabword(c) header->c = swabword(header->c) #define hswabdword(c) header->c = swabdword(header->c) hswabword(format_tag); hswabword(channels); hswabword(BlockAlign); hswabword(BitsPerSample); hswabdword(totalLength); hswabdword(length); hswabdword(SamplesPerSec); hswabdword(AvgBytesPerSec); hswabdword(datalen); #undef hswabword #undef hswabdword if (header->format_tag != 1) { // Microsoft PCM format? if (hardFail) { handleerror(0,"ReadWAV: invalid format tag.", name, 0); } return false; } ALenum format; if (header->channels == 1) { if (header->BitsPerSample == 8) format = AL_FORMAT_MONO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_MONO16; else { if (hardFail) { handleerror(0,"ReadWAV: invalid number of bits per sample (mono).", name, 0); } return false; } } else if (header->channels == 2) { if (header->BitsPerSample == 8) format = AL_FORMAT_STEREO8; else if (header->BitsPerSample == 16) format = AL_FORMAT_STEREO16; else { if (hardFail) { handleerror(0,"ReadWAV: invalid number of bits per sample (stereo).", name, 0); } return false; } } else { if (hardFail) { handleerror(0, "ReadWAV (%s): invalid number of channels.", name, 0); } return false; } if (header->datalen > size - sizeof(WAVHeader)) { // logOutput.Print("\n"); logOutput.Print("OpenAL: %s has data length %d greater than actual data length %d\n", name, header->datalen, size - sizeof(WAVHeader)); // logOutput.Print("OpenAL: size %d\n", size); // logOutput.Print("OpenAL: sizeof(WAVHeader) %d\n", sizeof(WAVHeader)); // logOutput.Print("OpenAL: format_tag %d\n", header->format_tag); // logOutput.Print("OpenAL: channels %d\n", header->channels); // logOutput.Print("OpenAL: BlockAlign %d\n", header->BlockAlign); // logOutput.Print("OpenAL: BitsPerSample %d\n", header->BitsPerSample); // logOutput.Print("OpenAL: totalLength %d\n", header->totalLength); // logOutput.Print("OpenAL: length %d\n", header->length); // logOutput.Print("OpenAL: SamplesPerSec %d\n", header->SamplesPerSec); // logOutput.Print("OpenAL: AvgBytesPerSec %d\n", header->AvgBytesPerSec); // FIXME: setting datalen to size - sizeof(WAVHeader) only // works for some files that have a garbage datalen field // in their header, others cause SEGV's inside alBufferData() // (eg. ionbeam.wav in XTA 9.2) -- Kloot // header->datalen = size - sizeof(WAVHeader); header->datalen = 1; } alBufferData(albuffer, format, buf + sizeof(WAVHeader), header->datalen, header->SamplesPerSec); return CheckError("ReadWAV"); }