| 254 | int parseHeaderSB(Common::File *f, int soundIndex, uint32 &size) { |
| 255 | static const int freqTable[] = { |
| 256 | 3951, 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, |
| 257 | 7459, 7902, 8372, 8870, 9397, 9956, 10548, 11175, 11840, 12544, 13290, |
| 258 | 14080, 14917, 15804, 16744, 17740, 18795, 19912, 21096, 22351, 23680, 25088 |
| 259 | }; |
| 260 | const int fileBaseOffset = f->pos(); |
| 261 | |
| 262 | f->readUint16LE(); // number of sound indexes |
| 263 | const int fileInfoOffset = f->readUint16LE(); |
| 264 | f->seek(soundIndex * 4, SEEK_CUR); |
| 265 | const int soundSetupInfoOffset = f->readUint16LE(); |
| 266 | |
| 267 | f->seek(fileBaseOffset + soundSetupInfoOffset, SEEK_SET); |
| 268 | int frequency = 11025; // default to 'sane' values |
| 269 | int pcmDataOffsetIndex = 0; |
| 270 | while (true) { |
| 271 | uint8 opcode = f->readByte(); |
| 272 | if (opcode >= 32) { |
| 273 | frequency = freqTable[(opcode - 32) / 2]; |
| 274 | break; |
| 275 | } |
| 276 | switch (opcode) { |
| 277 | case 0: |
| 278 | f->readByte(); |
| 279 | break; |
| 280 | case 7: |
| 281 | pcmDataOffsetIndex = f->readByte(); |
| 282 | break; |
| 283 | default: |
| 284 | error("Invalid opcode %d in SB file header", opcode); |
| 285 | break; |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | f->seek(fileBaseOffset + fileInfoOffset + pcmDataOffsetIndex, SEEK_SET); |
| 290 | int pcmDataOffset = f->readUint16LE(); |
| 291 | pcmDataOffset |= f->readUint16LE() << 4; |
| 292 | size -= pcmDataOffset; |
| 293 | f->seek(fileBaseOffset + pcmDataOffset, SEEK_SET); |
| 294 | return frequency; |
| 295 | } |
| 296 | |
258 | | int headerSize; |
259 | | f->seek(2, SEEK_CUR); |
260 | | uint16 version = f->readUint16LE(); |
261 | | switch (version) { |
262 | | case 104: |
263 | | headerSize = SB_HEADER_SIZE_V104; |
264 | | break; |
265 | | case 110: |
266 | | headerSize = SB_HEADER_SIZE_V110; |
267 | | break; |
268 | | default: |
269 | | warning("Unhandled SB file version %d, defaulting to 104\n", version); |
270 | | headerSize = SB_HEADER_SIZE_V104; |
271 | | break; |
272 | | } |
273 | | f->seek(headerSize - 4, SEEK_CUR); |
274 | | size -= headerSize; |
| 298 | const int frequency = parseHeaderSB(f, 18, size); |