static void getsfx (struct sfxinfo_struct *sfx) { Uint32 samplerate; Uint32 length ,expanded_length; Uint8 *data; Uint32 new_size = 0; Mix_Chunk *chunk; data = (Uint8 *)W_CacheLumpNum(sfx->lumpnum, PU_STATIC); // [Russell] - ICKY QUICKY HACKY SPACKY *I HATE THIS SOUND MANAGEMENT SYSTEM!* // get the lump size, shouldn't this be filled in elsewhere? sfx->length = W_LumpLength(sfx->lumpnum); // [Russell] is it not a doom sound lump? if (((data[1] << 8) | data[0]) != 3) { chunk = (Mix_Chunk *)Z_Malloc(sizeof(Mix_Chunk), PU_STATIC, NULL); chunk->allocated = 1; chunk->abuf = perform_sdlmix_conv(data, sfx->length, &new_size); chunk->alen = new_size; chunk->volume = MIX_MAX_VOLUME; sfx->data = chunk; Z_ChangeTag(data, PU_CACHE); return; } samplerate = (data[3] << 8) | data[2]; length = (data[5] << 8) | data[4]; // [Russell] - Ignore doom's sound format length info // if the lump is longer than the value, fixes exec.wad's ssg length = (sfx->length - 8 > length) ? sfx->length - 8 : length; expanded_length = (uint32_t) ((((uint64_t) length) * mixer_freq) / samplerate); // Double up twice: 8 -> 16 bit and mono -> stereo expanded_length *= 4; chunk = (Mix_Chunk *)Z_Malloc(sizeof(Mix_Chunk), PU_STATIC, NULL); chunk->allocated = 1; chunk->alen = expanded_length; chunk->abuf = (Uint8 *)Z_Malloc(expanded_length, PU_STATIC, &chunk->abuf); chunk->volume = MIX_MAX_VOLUME; ExpandSoundData((unsigned char *)data + 8, samplerate, length, chunk); sfx->data = chunk; Z_ChangeTag(data, PU_CACHE); }
// Load and convert a sound effect // Returns true if successful static dboolean CacheSFX(sfxinfo_t *sfxinfo) { int lumpnum; unsigned int lumplen; int samplerate; unsigned int length; byte *data; // need to load the sound lumpnum = sfxinfo->lumpnum; data = W_CacheLumpNum(lumpnum, PU_STATIC); lumplen = W_LumpLength(lumpnum); // Check the header, and ensure this is a valid sound if (lumplen < 8 || data[0] != 0x03 || data[1] != 0x00) { // Invalid sound return false; } // 16 bit sample rate field, 32 bit length field samplerate = ((data[3] << 8) | data[2]); length = ((data[7] << 24) | (data[6] << 16) | (data[5] << 8) | data[4]); // If the header specifies that the length of the sound is greater than // the length of the lump itself, this is an invalid sound lump // We also discard sound lumps that are less than 49 samples long, // as this is how DMX behaves - although the actual cut-off length // seems to vary slightly depending on the sample rate. This needs // further investigation to better understand the correct // behavior. if (length > lumplen - 8 || length <= 48) return false; // The DMX sound library seems to skip the first 16 and last 16 // bytes of the lump - reason unknown. data += 16; length -= 32; // Sample rate conversion if (!ExpandSoundData(sfxinfo, data + 8, samplerate, length)) return false; // don't need the original lump any more W_ReleaseLumpNum(lumpnum); return true; }
static boolean CacheSFX(sfxinfo_t *sfxinfo) { int lumpnum; unsigned int lumplen; int samplerate; unsigned int length; byte *data; // need to load the sound lumpnum = sfxinfo->lumpnum; data = W_CacheLumpNum(lumpnum, PU_STATIC); lumplen = W_LumpLength(lumpnum); // Check the header, and ensure this is a valid sound if (lumplen < 8 || data[0] != 0x03 || data[1] != 0x00) { // Invalid sound return false; } // 16 bit sample rate field, 32 bit length field samplerate = (data[3] << 8) | data[2]; length = (data[7] << 24) | (data[6] << 16) | (data[5] << 8) | data[4]; // If the header specifies that the length of the sound is greater than // the length of the lump itself, this is an invalid sound lump // We also discard sound lumps that are less than 49 samples long, // as this is how DMX behaves - although the actual cut-off length // seems to vary slightly depending on the sample rate. This needs // further investigation to better understand the correct // behavior. if (length > lumplen - 8 || length <= 48) { return false; } // The DMX sound library seems to skip the first 16 and last 16 // bytes of the lump - reason unknown. data += 16; length -= 32; // Sample rate conversion if (!ExpandSoundData(sfxinfo, data + 8, samplerate, length)) { return false; } #ifdef DEBUG_DUMP_WAVS { char filename[16]; allocated_sound_t * snd; M_snprintf(filename, sizeof(filename), "%s.wav", DEH_String(sfxinfo->name)); snd = GetAllocatedSoundBySfxInfoAndPitch(sfxinfo, NORM_PITCH); WriteWAV(filename, snd->chunk.abuf, snd->chunk.alen,mixer_freq); } #endif // don't need the original lump any more W_ReleaseLumpNum(lumpnum); return true; }