FBSOUND.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File:       fbsound.c
  6.  *  Content: Game sound effect routines
  7.  *
  8.  ***************************************************************************/
  9. #include "foxbear.h"
  10.     
  11. /*
  12.  * Array of pointers to our sound effects
  13.  */
  14. LPDIRECTSOUND lpDS;
  15. LPDIRECTSOUNDBUFFER     lpSoundEffects[NUM_SOUND_EFFECTS];
  16. char szSoundEffects[NUM_SOUND_EFFECTS][MAX_PATH] =
  17. {
  18.     "STOP",
  19.     "THROW",
  20.     "JUMP",
  21.     "STUNNED",
  22.     "STRIKE02",
  23.     "MISS02"
  24. };
  25. /*
  26.  * DSEnable
  27.  *
  28.  * Figures out whether or not to use DirectSound, based on an entry
  29.  * in WIN.INI.  Sets a module-level flag and goes about creating the
  30.  * DirectSound object if necessary.  Returns TRUE if successful.
  31.  */
  32. BOOL DSEnable( HWND hwnd )
  33. {
  34.     HRESULT dsrval;
  35.     BOOL                bUseDSound;
  36.     bUseDSound = GetProfileInt("FoxBear", "use_dsound", bWantSound);
  37.     if (!bUseDSound)
  38.     {
  39.         lpDS = NULL;
  40.         return TRUE;
  41.     }
  42.     if (lpDS != NULL)
  43.     {
  44.         Msg( "DSEnable, already enabled" );
  45.         return TRUE;
  46.     }
  47.     dsrval = DirectSoundCreate(NULL, &lpDS, NULL);
  48.     if (dsrval != DS_OK)
  49.     {
  50.         Msg("DirectSoundCreate FAILED");
  51.         return FALSE;
  52.     }
  53.     dsrval = IDirectSound_SetCooperativeLevel(lpDS, hwnd, DSSCL_NORMAL);
  54.     if (dsrval != DS_OK)
  55.     {
  56.         DSDisable();
  57.         Msg("SetCooperativeLevel FAILED");
  58.         return FALSE;
  59.     }
  60.     return TRUE;
  61. } /* DSEnable */
  62. /*
  63.  * DSDisable
  64.  *
  65.  * Turn off DirectSound
  66.  */
  67. BOOL DSDisable( void )
  68. {
  69.     if (lpDS == NULL)
  70.     {
  71. return TRUE;
  72.     }
  73.     IDirectSound_Release(lpDS);
  74.     lpDS = NULL;
  75.     return TRUE;
  76. } /* DSDisable */
  77. /*
  78.  * InitSound
  79.  *
  80.  * Sets up the DirectSound object and loads all sounds into secondary
  81.  * DirectSound buffers.  Returns FALSE on error, or TRUE if successful
  82.  */
  83. BOOL InitSound( HWND hwndOwner )
  84. {
  85.     int idx;
  86.     DSBUFFERDESC dsBD;
  87.     IDirectSoundBuffer *lpPrimary;
  88.     DSEnable(hwndOwner);
  89.     if (lpDS == NULL)
  90.         return TRUE;
  91.     /*
  92.      * Load all sounds -- any that can't load for some reason will have NULL
  93.      * pointers instead of valid SOUNDEFFECT data, and we will know not to
  94.      * play them later on.
  95.      */
  96.     for( idx = 0; idx < NUM_SOUND_EFFECTS; idx++ )
  97.     {
  98.         if (SoundLoadEffect((EFFECT)idx))
  99.         {
  100.             DSBCAPS  caps;
  101.             caps.dwSize = sizeof(caps);
  102.             IDirectSoundBuffer_GetCaps(lpSoundEffects[idx], &caps);
  103.             if (caps.dwFlags & DSBCAPS_LOCHARDWARE)
  104.                 Msg( "Sound effect %s in hardware", szSoundEffects[idx]);
  105.             else
  106.                 Msg( "Sound effect %s in software", szSoundEffects[idx]);
  107.         }
  108.         else
  109.         {
  110.             Msg( "cant load sound effect %s", szSoundEffects[idx]);
  111.         }
  112.     }
  113.     /*
  114.      * get the primary buffer and start it playing
  115.      *
  116.      * by playing the primary buffer, DirectSound knows to keep the
  117.      * mixer active, even though we are not making any noise.
  118.      */
  119.     ZeroMemory( &dsBD, sizeof(DSBUFFERDESC) );
  120.     dsBD.dwSize = sizeof(dsBD);
  121.     dsBD.dwFlags = DSBCAPS_PRIMARYBUFFER;
  122.     if (SUCCEEDED(IDirectSound_CreateSoundBuffer(lpDS, &dsBD, &lpPrimary, NULL)))
  123.     {
  124.         if (!SUCCEEDED(IDirectSoundBuffer_Play(lpPrimary, 0, 0, DSBPLAY_LOOPING)))
  125.         {
  126.             Msg("Unable to play Primary sound buffer");
  127.         }
  128.         IDirectSoundBuffer_Release(lpPrimary);
  129.     }
  130.     else
  131.     {
  132.         Msg("Unable to create Primary sound buffer");
  133.     }
  134.     return TRUE;
  135. } /* InitSound */
  136. /*
  137.  * DestroySound
  138.  *
  139.  * Undoes everything that was done in a InitSound call
  140.  */
  141. BOOL DestroySound( void )
  142. {
  143.     DWORD idxKill;
  144.     
  145.     for( idxKill = 0; idxKill < NUM_SOUND_EFFECTS; idxKill++ )
  146.     {
  147. SoundDestroyEffect( (EFFECT)idxKill );
  148.     }
  149.     DSDisable();
  150.     return TRUE;
  151. } /* DestroySound */
  152. /*
  153.  * SoundDestroyEffect
  154.  *
  155.  * Frees up resources associated with a sound effect
  156.  */
  157. BOOL SoundDestroyEffect( EFFECT sfx )
  158. {
  159.     if(lpSoundEffects[sfx])
  160.     {
  161.         IDirectSoundBuffer_Release(lpSoundEffects[sfx]);
  162.         lpSoundEffects[sfx] = NULL;
  163.     }
  164.     return TRUE;
  165. } /* SoundDestryEffect */
  166. /*
  167.  * SoundLoadEffect
  168.  *
  169.  * Initializes a sound effect by loading the WAV file from a resource
  170.  */
  171. BOOL SoundLoadEffect( EFFECT sfx )
  172. {
  173.     if (lpDS && lpSoundEffects[sfx] == NULL && *szSoundEffects[sfx])
  174.     {
  175.         //
  176.         //  use DSLoadSoundBuffer (in ..miscdsutil.c) to load
  177.         //  a sound from a resource.
  178.         //
  179.         lpSoundEffects[sfx] = DSLoadSoundBuffer(lpDS, szSoundEffects[sfx]);
  180.     }
  181.     return lpSoundEffects[sfx] != NULL;
  182. } /* SoundLoadEffect */
  183. /*
  184.  * SoundPlayEffect
  185.  *
  186.  * Plays the sound effect specified.  
  187.  * Returns TRUE if succeeded.
  188.  */
  189. BOOL SoundPlayEffect( EFFECT sfx )
  190. {
  191.     HRESULT     dsrval;
  192.     IDirectSoundBuffer *pdsb = lpSoundEffects[sfx];
  193.     
  194.     if( !lpDS || !pdsb )
  195.     {
  196. return FALSE;
  197.     }
  198.     
  199.     /*
  200.      * Rewind the play cursor to the start of the effect, and play
  201.      */
  202.     IDirectSoundBuffer_SetCurrentPosition(pdsb, 0);
  203.     dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0);
  204.     if (dsrval == DSERR_BUFFERLOST)
  205.     {
  206.         Msg("** %s needs restored", szSoundEffects[sfx]);
  207.         dsrval = IDirectSoundBuffer_Restore(pdsb);
  208.         if (dsrval == DS_OK)
  209.         {
  210.             if (DSReloadSoundBuffer(pdsb, szSoundEffects[sfx]))
  211.             {
  212.                 Msg("** %s has been restored", szSoundEffects[sfx]);
  213.                 IDirectSoundBuffer_SetCurrentPosition(pdsb, 0);
  214.                 dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0);
  215.             }
  216.             else
  217.             {
  218.                 dsrval = E_FAIL;
  219.             }
  220.         }
  221.     }
  222.     return (dsrval == DS_OK);
  223. } /* SoundPlayEffect */
  224. /*
  225.  * SoundStopEffect
  226.  *
  227.  * Stops the sound effect specified.
  228.  * Returns TRUE if succeeded.
  229.  */
  230. BOOL SoundStopEffect( EFFECT sfx )
  231. {
  232.     HRESULT dsrval;
  233.     if( !lpDS || !lpSoundEffects[sfx] )
  234.     {
  235. return FALSE;
  236.     }
  237.     dsrval = IDirectSoundBuffer_Stop(lpSoundEffects[sfx]);
  238.     return SUCCEEDED(dsrval);
  239. } /* SoundStopEffect */