/*========================================================================== * * Copyright (c) 1995 - 1997 Microsoft Corporation. All Rights Reserved. * * File: fbsound.c * Content: Game sound effect routines * ***************************************************************************/ #include "foxbear.h" /* * Array of pointers to our sound effects */ LPDIRECTSOUND lpDS; LPDIRECTSOUNDBUFFER lpSoundEffects[NUM_SOUND_EFFECTS]; char szSoundEffects[NUM_SOUND_EFFECTS][MAX_PATH] = { "STOP", "THROW", "JUMP", "STUNNED", "STRIKE02", "MISS02" }; /* * DSEnable * * Figures out whether or not to use DirectSound, based on an entry * in WIN.INI. Sets a module-level flag and goes about creating the * DirectSound object if necessary. Returns TRUE if successful. */ BOOL DSEnable( HWND hwnd ) { HRESULT dsrval; BOOL bUseDSound; bUseDSound = GetProfileInt("FoxBear", "use_dsound", bWantSound); if (!bUseDSound) { lpDS = NULL; return TRUE; } if (lpDS != NULL) { Msg( "DSEnable, already enabled" ); return TRUE; } dsrval = DirectSoundCreate(NULL, &lpDS, NULL); if (dsrval != DS_OK) { Msg("DirectSoundCreate FAILED"); return FALSE; } dsrval = IDirectSound_SetCooperativeLevel(lpDS, hwnd, DSSCL_NORMAL); if (dsrval != DS_OK) { DSDisable(); Msg("SetCooperativeLevel FAILED"); return FALSE; } return TRUE; } /* DSEnable */ /* * DSDisable * * Turn off DirectSound */ BOOL DSDisable( void ) { if (lpDS == NULL) { return TRUE; } IDirectSound_Release(lpDS); lpDS = NULL; return TRUE; } /* DSDisable */ /* * InitSound * * Sets up the DirectSound object and loads all sounds into secondary * DirectSound buffers. Returns FALSE on error, or TRUE if successful */ BOOL InitSound( HWND hwndOwner ) { int idx; DSBUFFERDESC dsBD; IDirectSoundBuffer *lpPrimary; DSEnable(hwndOwner); if (lpDS == NULL) return TRUE; /* * Load all sounds -- any that can't load for some reason will have NULL * pointers instead of valid SOUNDEFFECT data, and we will know not to * play them later on. */ for( idx = 0; idx < NUM_SOUND_EFFECTS; idx++ ) { if (SoundLoadEffect((EFFECT)idx)) { DSBCAPS caps; caps.dwSize = sizeof(caps); IDirectSoundBuffer_GetCaps(lpSoundEffects[idx], &caps); if (caps.dwFlags & DSBCAPS_LOCHARDWARE) Msg( "Sound effect %s in hardware", szSoundEffects[idx]); else Msg( "Sound effect %s in software", szSoundEffects[idx]); } else { Msg( "cant load sound effect %s", szSoundEffects[idx]); } } /* * get the primary buffer and start it playing * * by playing the primary buffer, DirectSound knows to keep the * mixer active, even though we are not making any noise. */ ZeroMemory( &dsBD, sizeof(DSBUFFERDESC) ); dsBD.dwSize = sizeof(dsBD); dsBD.dwFlags = DSBCAPS_PRIMARYBUFFER; if (SUCCEEDED(IDirectSound_CreateSoundBuffer(lpDS, &dsBD, &lpPrimary, NULL))) { if (!SUCCEEDED(IDirectSoundBuffer_Play(lpPrimary, 0, 0, DSBPLAY_LOOPING))) { Msg("Unable to play Primary sound buffer"); } IDirectSoundBuffer_Release(lpPrimary); } else { Msg("Unable to create Primary sound buffer"); } return TRUE; } /* InitSound */ /* * DestroySound * * Undoes everything that was done in a InitSound call */ BOOL DestroySound( void ) { DWORD idxKill; for( idxKill = 0; idxKill < NUM_SOUND_EFFECTS; idxKill++ ) { SoundDestroyEffect( (EFFECT)idxKill ); } DSDisable(); return TRUE; } /* DestroySound */ /* * SoundDestroyEffect * * Frees up resources associated with a sound effect */ BOOL SoundDestroyEffect( EFFECT sfx ) { if(lpSoundEffects[sfx]) { IDirectSoundBuffer_Release(lpSoundEffects[sfx]); lpSoundEffects[sfx] = NULL; } return TRUE; } /* SoundDestryEffect */ /* * SoundLoadEffect * * Initializes a sound effect by loading the WAV file from a resource */ BOOL SoundLoadEffect( EFFECT sfx ) { if (lpDS && lpSoundEffects[sfx] == NULL && *szSoundEffects[sfx]) { // // use DSLoadSoundBuffer (in ..\misc\dsutil.c) to load // a sound from a resource. // lpSoundEffects[sfx] = DSLoadSoundBuffer(lpDS, szSoundEffects[sfx]); } return lpSoundEffects[sfx] != NULL; } /* SoundLoadEffect */ /* * SoundPlayEffect * * Plays the sound effect specified. * Returns TRUE if succeeded. */ BOOL SoundPlayEffect( EFFECT sfx ) { HRESULT dsrval; IDirectSoundBuffer *pdsb = lpSoundEffects[sfx]; if( !lpDS || !pdsb ) { return FALSE; } /* * Rewind the play cursor to the start of the effect, and play */ IDirectSoundBuffer_SetCurrentPosition(pdsb, 0); dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0); if (dsrval == DSERR_BUFFERLOST) { Msg("** %s needs restored", szSoundEffects[sfx]); dsrval = IDirectSoundBuffer_Restore(pdsb); if (dsrval == DS_OK) { if (DSReloadSoundBuffer(pdsb, szSoundEffects[sfx])) { Msg("** %s has been restored", szSoundEffects[sfx]); IDirectSoundBuffer_SetCurrentPosition(pdsb, 0); dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0); } else { dsrval = E_FAIL; } } } return (dsrval == DS_OK); } /* SoundPlayEffect */ /* * SoundStopEffect * * Stops the sound effect specified. * Returns TRUE if succeeded. */ BOOL SoundStopEffect( EFFECT sfx ) { HRESULT dsrval; if( !lpDS || !lpSoundEffects[sfx] ) { return FALSE; } dsrval = IDirectSoundBuffer_Stop(lpSoundEffects[sfx]); return SUCCEEDED(dsrval); } /* SoundStopEffect */