HEFFECT CALL HGE_Impl::Effect_Load(const char *filename, DWORD size) { DWORD _size, length, samples; void *data; if(hOpenAL) { if(bSilent) return 1; if(size) { data=(void *)filename; _size=size; } else { data=Resource_Load(filename, &_size); if(!data) return 0; } const BYTE *magic = (const BYTE *) data; const bool isOgg = ( (_size > 4) && (magic[0] == 'O') && (magic[1] == 'g') && (magic[2] == 'g') && (magic[3] == 'S') ); // !!! FIXME: we currently expect Ogg Vorbis, since this is all we // !!! FIXME: need at the moment. if (!isOgg) { if(!size) Resource_Free(data); return 0; } // !!! FIXME: alternately, stream ogg data? void *allocation_decompressed = NULL; void *decompressed = NULL; ALsizei decompressed_size = 0; ALsizei freq = 0; ALenum fmt = AL_FORMAT_STEREO16; if (isOgg) { if (alIsExtensionPresent((const ALchar *) "AL_EXT_vorbis")) { fmt = alGetEnumValue((const ALchar *) "AL_FORMAT_VORBIS_EXT"); decompressed = data; decompressed_size = _size; } else { allocation_decompressed = decompress_vorbis((const BYTE *) data, _size, &decompressed_size, &fmt, &freq); decompressed = allocation_decompressed; } } ALuint bid = 0; alGenBuffers(1, &bid); alBufferData(bid, fmt, decompressed, decompressed_size, freq); free(allocation_decompressed); // not delete[] ! if(!size) Resource_Free(data); return (HEFFECT) bid; } else return 0; }
HEFFECT CALL HGE_Impl::Effect_Load(const char *filename, DWORD size) { DWORD _size, length, samples; HSAMPLE hs; HSTREAM hstrm; BASS_CHANNELINFO info; void *buffer, *data; if(hBass) { if(bSilent) return 1; if(size) { data=(void *)filename; _size=size; } else { data=Resource_Load(filename, &_size); if(!data) return NULL; } hs=BASS_SampleLoad(TRUE, data, 0, _size, 4, BASS_SAMPLE_OVER_VOL); if(!hs) { hstrm=BASS_StreamCreateFile(TRUE, data, 0, _size, BASS_STREAM_DECODE); if(hstrm) { length=(DWORD)BASS_ChannelGetLength(hstrm); BASS_ChannelGetInfo(hstrm, &info); samples=length; if(info.chans < 2) samples>>=1; if((info.flags & BASS_SAMPLE_8BITS) == 0) samples>>=1; buffer=BASS_SampleCreate(samples, info.freq, 2, 4, info.flags | BASS_SAMPLE_OVER_VOL); if(!buffer) { BASS_StreamFree(hstrm); _PostError("Can't create sound effect: Not enough memory"); } else { BASS_ChannelGetData(hstrm, buffer, length); hs=BASS_SampleCreateDone(); BASS_StreamFree(hstrm); if(!hs) _PostError("Can't create sound effect"); } } } if(!size) Resource_Free(data); return hs; }