| 118 | } |
| 119 | |
| 120 | bool SFXWavStream::_readHeader() |
| 121 | { |
| 122 | // We read the wav chunks to gather than header info |
| 123 | // and find the start and end position of the data chunk. |
| 124 | mDataStart = -1; |
| 125 | |
| 126 | WAVFileHdr fileHdr; |
| 127 | mStream->read( 4, &fileHdr.id[0] ); |
| 128 | mStream->read( &fileHdr.size ); |
| 129 | mStream->read( 4, &fileHdr.type[0] ); |
| 130 | |
| 131 | fileHdr.size=((fileHdr.size+1)&~1)-4; |
| 132 | |
| 133 | WAVChunkHdr chunkHdr; |
| 134 | mStream->read( 4, &chunkHdr.id[0] ); |
| 135 | mStream->read( &chunkHdr.size ); |
| 136 | |
| 137 | // Unread chunk data rounded up to nearest WORD. |
| 138 | S32 chunkRemaining = chunkHdr.size + ( chunkHdr.size & 1 ); |
| 139 | |
| 140 | WAVFmtHdr fmtHdr; |
| 141 | WAVFmtExHdr fmtExHdr; |
| 142 | WAVSmplHdr smplHdr; |
| 143 | |
| 144 | dMemset(&fmtHdr, 0, sizeof(fmtHdr)); |
| 145 | |
| 146 | while ((fileHdr.size!=0) && (mStream->getStatus() != Stream::EOS)) |
| 147 | { |
| 148 | // WAV format header chunk. |
| 149 | if ( !dStrncmp( (const char*)chunkHdr.id, "fmt ", 4 ) ) |
| 150 | { |
| 151 | mStream->read(&fmtHdr.format); |
| 152 | mStream->read(&fmtHdr.channels); |
| 153 | mStream->read(&fmtHdr.samplesPerSec); |
| 154 | mStream->read(&fmtHdr.bytesPerSec); |
| 155 | mStream->read(&fmtHdr.blockAlign); |
| 156 | mStream->read(&fmtHdr.bitsPerSample); |
| 157 | |
| 158 | if ( fmtHdr.format == 0x0001 ) |
| 159 | { |
| 160 | mFormat.set( fmtHdr.channels, fmtHdr.bitsPerSample * fmtHdr.channels, fmtHdr.samplesPerSec ); |
| 161 | chunkRemaining -= sizeof( WAVFmtHdr ); |
| 162 | } |
| 163 | else |
| 164 | { |
| 165 | mStream->read(sizeof(WAVFmtExHdr), &fmtExHdr); |
| 166 | chunkRemaining -= sizeof(WAVFmtExHdr); |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | // WAV data chunk |
| 171 | else if (!dStrncmp((const char*)chunkHdr.id,"data",4)) |
| 172 | { |
| 173 | // TODO: Handle these other formats in a more graceful manner! |
| 174 | |
| 175 | if (fmtHdr.format==0x0001) |
| 176 | { |
| 177 | mDataStart = mStream->getPosition(); |
nothing calls this directly
no test coverage detected