void S_Shutdown(void) { int i; sfx_t *sfx; if (!sound_started) return; SNDDMA_Shutdown(); sound_started = 0; Cmd_RemoveCommand("play"); Cmd_RemoveCommand("stopsound"); Cmd_RemoveCommand("soundlist"); Cmd_RemoveCommand("soundinfo"); // free all sounds for (i=0, sfx=known_sfx ; i < num_sfx ; i++,sfx++) { if (!sfx->name[0]) continue; memset (sfx, 0, sizeof(*sfx)); } num_sfx = 0; }
void S_Shutdown(void) { if (!sound_started) return; SNDDMA_Shutdown(); sound_started = false; UnregisterCommand("play"); UnregisterCommand("stopsound"); UnregisterCommand("soundlist"); UnregisterCommand("soundinfo"); // free all sounds int i; sfx_t *sfx; for (i = 0, sfx = known_sfx; i < num_sfx; i++, sfx++) { if (!sfx->Name[0]) continue; if (sfx->cache) appFree(sfx->cache); memset(sfx, 0, sizeof(*sfx)); } num_sfx = 0; }
void S_Shutdown(void) { if (!sound_started) return; Cmd_RemoveCommand("play"); Cmd_RemoveCommand("stopsound"); Cmd_RemoveCommand("soundlist"); Cmd_RemoveCommand("soundinfo"); S_FreeAllSounds(); #ifdef USE_OPENAL if(alSound) { ALSnd_Shutdown(); alSound = false; } else #endif { SNDDMA_Shutdown(); } sound_started = false; }
void S_Shutdown (void) { if (!sound_started) return; sound_started = false; SNDDMA_Shutdown(); }
DWORD * DSOUND_LockBuffer (qboolean lockit) { int reps; static DWORD dwSize; static DWORD dwSize2; static DWORD *pbuf1; static DWORD *pbuf2; HRESULT hresult; if (!pDSBuf) return NULL; if (lockit) { reps = 0; while ((hresult = IDirectSoundBuffer_Lock (pDSBuf, 0, gSndBufSize, (LPVOID *)(char *) &pbuf1, &dwSize, (LPVOID *)(char *) &pbuf2, &dwSize2, 0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Sys_Printf ("S_TransferStereo16: DS::Lock Sound Buffer Failed\n"); SNDDMA_Shutdown (); SNDDMA_Init (); return NULL; } if (++reps > 10000) { Sys_Printf ("S_TransferStereo16: DS: couldn't restore buffer\n"); SNDDMA_Shutdown (); SNDDMA_Init (); return NULL; } } } else { IDirectSoundBuffer_Unlock (pDSBuf, pbuf1, dwSize, NULL, 0); pbuf1 = NULL; pbuf2 = NULL; dwSize = 0; dwSize2 = 0; } return (pbuf1); }
/* ================= SNDDMA_Activate When we change windows we need to do this ================= */ void SNDDMA_Activate( void ) { if ( !pDS ) { return; } if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_NORMAL ) ) { Com_Printf( "sound SetCooperativeLevel failed\n" ); SNDDMA_Shutdown(); } }
void S_Shutdown (void) { if (!shm) return; SNDDMA_Shutdown(); shm = NULL; sound_spatialized = false; }
/* ================= SNDDMA_Activate When we change windows we need to do this ================= */ void SNDDMA_Activate( void ) { if ( !pDS ) { return; } if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("sound SetCooperativeLevel failed\n"); SNDDMA_Shutdown (); } }
static void S_Device_f(cvar_t *var) { if (!sound_started || !shm) return; if (!SNDDMA_UsesDefaultDevice() || !(strlen(var->string) == 0 || strcmp("default", var->string) == 0)) { SNDDMA_Shutdown(); S_Startup(); } }
void SNDDMA_Activate() { if ( !pDS ) { return; } if ( DS_OK != pDS->SetCooperativeLevel( GMainWindow, DSSCL_PRIORITY ) ) { common->Printf( "sound SetCooperativeLevel failed\n" ); SNDDMA_Shutdown(); } }
/* shutdown sound engine */ static void S_Base_Shutdown(void) { if(!s_soundStarted) return; SNDDMA_Shutdown(); SND_shutdown(); s_soundStarted = 0; s_numSfx = 0; cmdremove("s_info"); }
void S_Base_Shutdown( void ) { if ( !s_soundStarted ) { return; } SNDDMA_Shutdown(); s_soundStarted = 0; Cmd_RemoveCommand("s_info"); }
// ======================================================================= // Shutdown sound engine // ======================================================================= void S_Shutdown (void) { if (!sound_started) return; sound_started = 0; snd_blocked = 0; S_CodecShutdown(); SNDDMA_Shutdown(); shm = NULL; }
/* * Shutdown sound engine */ void S_Shutdown(void) { if (!sound_started) return; shm = 0; sound_started = 0; if (!fakedma) SNDDMA_Shutdown(); }
/* * S_Activate * * Called when the main window gains or loses focus. * The window have been destroyed and recreated * between a deactivate and an activate. */ void S_Activate( bool active ) { if( !pDS ) return; if( s_globalfocus->modified ) { SNDDMA_Shutdown( false ); SNDDMA_InitDirect( false ); s_globalfocus->modified = false; if( !pDS ) return; } // just set the priority for directsound if( pDS->lpVtbl->SetCooperativeLevel( pDS, cl_hwnd, DSSCL_PRIORITY ) != DS_OK ) { Com_Printf( "DirectSound SetCooperativeLevel failed\n" ); SNDDMA_Shutdown( false ); } }
void S_Shutdown( void ) { if ( !s_soundStarted ) { return; } SNDDMA_Shutdown(); s_soundStarted = 0; Cmd_RemoveCommand("play"); Cmd_RemoveCommand("music"); Cmd_RemoveCommand("stopsound"); Cmd_RemoveCommand("soundlist"); Cmd_RemoveCommand("soundinfo"); }
/* ================= SNDDMA_Activate When we change windows we need to do this ================= */ void SNDDMA_Activate( qboolean bAppActive ) { if (s_UseOpenAL) { S_AL_MuteAllSounds(!bAppActive); } if ( !pDS ) { return; } if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("sound SetCooperativeLevel failed\n"); SNDDMA_Shutdown (); } }
void S_Shutdown(void) { if (!sound_started) return; if (shm) shm->gamealive = 0; shm = 0; sound_started = 0; if (!fakedma) { SNDDMA_Shutdown(); } }
void SNDDMA_BeginPainting() { int reps; DWORD dwSize2; DWORD* pbuf, * pbuf2; HRESULT hresult; DWORD dwStatus; if ( !pDSBuf ) { return; } // if the buffer was lost or stopped, restore it and/or restart it if ( pDSBuf->GetStatus( &dwStatus ) != DS_OK ) { common->Printf( "Couldn't get sound buffer status\n" ); } if ( dwStatus & DSBSTATUS_BUFFERLOST ) { pDSBuf->Restore(); } if ( !( dwStatus & DSBSTATUS_PLAYING ) ) { pDSBuf->Play( 0, 0, DSBPLAY_LOOPING ); } // lock the dsound buffer reps = 0; dma.buffer = NULL; while ( ( hresult = pDSBuf->Lock( 0, gSndBufSize, ( void** )&pbuf, &locksize, ( void** )&pbuf2, &dwSize2, 0 ) ) != DS_OK ) { if ( hresult != DSERR_BUFFERLOST ) { common->Printf( "SNDDMA_BeginPainting: Lock failed with error '%s'\n", DSoundError( hresult ) ); SNDDMA_Shutdown(); return; } else { pDSBuf->Restore(); } if ( ++reps > 2 ) { return; } } dma.buffer = ( byte* )pbuf; }
/* * S_Shutdown */ static void S_Shutdown( bool verbose ) { S_StopAllSounds( true, true ); S_StopAviDemo(); S_LockBackgroundTrack( false ); S_StopBackgroundTrack( ); S_FreeRawSounds(); SNDDMA_Shutdown( verbose ); SNDOGG_Shutdown( verbose ); num_loopsfx = 0; }
void S_Shutdown(void) { int i; sfx_t *sfx; if (!sound_started) return; #ifdef OGG_SUPPORT // Com_DPrintf ("S_Shutdown: calling S_OGG_Shutdown\n"); // debug S_OGG_Shutdown(); // Knightmare added #endif SNDDMA_Shutdown(); sound_started = 0; Cmd_RemoveCommand("play"); Cmd_RemoveCommand("stopsound"); Cmd_RemoveCommand("soundlist"); Cmd_RemoveCommand("soundinfo"); #ifdef OGG_SUPPORT Cmd_RemoveCommand("ogg_restart"); // Knightmare added #endif // free all sounds for (i=0, sfx=known_sfx ; i < num_sfx ; i++,sfx++) { if (!sfx->name[0]) continue; if (sfx->cache) Z_Free (sfx->cache); memset (sfx, 0, sizeof(*sfx)); } num_sfx = 0; }
static int SNDDMA_InitDS () { HRESULT hresult; qboolean pauseTried; DSBUFFERDESC dsbuf; DSBCAPS dsbcaps; WAVEFORMATEX format; Com_Printf( "Initializing DirectSound\n"); if ( !hInstDS ) { Com_DPrintf( "...loading dsound.dll: " ); hInstDS = LoadLibrary("dsound.dll"); if ( hInstDS == NULL ) { Com_Printf ("failed\n"); return 0; } Com_DPrintf ("ok\n"); pDirectSoundCreate = (long (__stdcall *)(struct _GUID *,struct IDirectSound ** ,struct IUnknown *)) GetProcAddress(hInstDS,"DirectSoundCreate"); if ( !pDirectSoundCreate ) { Com_Printf ("*** couldn't get DS proc addr ***\n"); return 0; } } Com_DPrintf( "...creating DS object: " ); pauseTried = qfalse; while ( ( hresult = iDirectSoundCreate( NULL, &pDS, NULL ) ) != DS_OK ) { if ( hresult != DSERR_ALLOCATED ) { Com_Printf( "failed\n" ); return 0; } if ( pauseTried ) { Com_Printf ("failed, hardware already in use\n" ); return 0; } // first try just waiting five seconds and trying again // this will handle the case of a sysyem beep playing when the // game starts Com_DPrintf ("retrying...\n"); Sleep( 3000 ); pauseTried = qtrue; } Com_DPrintf( "ok\n" ); Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf("ok\n" ); // create the secondary buffer we'll actually work with dma.channels = 2; dma.samplebits = 16; if (s_khz->integer == 44) dma.speed = 44100; else if (s_khz->integer == 22) dma.speed = 22050; else dma.speed = 11025; memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = dma.channels; format.wBitsPerSample = dma.samplebits; format.nSamplesPerSec = dma.speed; format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; format.cbSize = 0; format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; memset (&dsbuf, 0, sizeof(dsbuf)); dsbuf.dwSize = sizeof(DSBUFFERDESC); #define idDSBCAPS_GETCURRENTPOSITION2 0x00010000 dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCHARDWARE | idDSBCAPS_GETCURRENTPOSITION2; dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; dsbuf.lpwfxFormat = &format; Com_DPrintf( "...creating secondary buffer: " ); if (DS_OK != pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY; hresult = pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL); if (hresult != DS_OK) { Com_Printf( "failed to create secondary buffer - %s\n", DSoundError( hresult ) ); SNDDMA_Shutdown (); return qfalse; } } Com_Printf( "locked hardware. ok\n" ); // Make sure mixer is active if ( DS_OK != pDSBuf->Play(0, 0, DSBPLAY_LOOPING) ) { Com_Printf ("*** Looped sound play failed ***\n"); SNDDMA_Shutdown (); return qfalse; } memset(&dsbcaps, 0, sizeof(dsbcaps)); dsbcaps.dwSize = sizeof(dsbcaps); // get the returned buffer size if ( DS_OK != pDSBuf->GetCaps (&dsbcaps) ) { Com_Printf ("*** GetCaps failed ***\n"); SNDDMA_Shutdown (); return qfalse; } gSndBufSize = dsbcaps.dwBufferBytes; dma.channels = format.nChannels; dma.samplebits = format.wBitsPerSample; dma.speed = format.nSamplesPerSec; dma.samples = gSndBufSize/(dma.samplebits/8); dma.submission_chunk = 1; dma.buffer = NULL; // must be locked first sample16 = (dma.samplebits/8) - 1; SNDDMA_BeginPainting (); if (dma.buffer) memset(dma.buffer, 0, dma.samples * dma.samplebits/8); SNDDMA_Submit (); return 1; }
int SNDDMA_InitDS () { HRESULT hresult; DSBUFFERDESC dsbuf; DSBCAPS dsbcaps; WAVEFORMATEX format; int use8; HMODULE hdsounddll; pDirectSoundEnumerate DSEnumerate; if ((hdsounddll = LoadLibrary("dsound.dll")) != NULL && (DSEnumerate = (pDirectSoundEnumerate)GetProcAddress(hdsounddll, "DirectSoundEnumerateA")) != NULL && s_dev->string != NULL && s_dev->string[0] != '\0') { Com_Printf( "^4Looking for DirectSound Device '%s'\n", s_dev->string); if (FAILED(DSEnumerate(SNDDMAHD_DSEnumCallback, NULL))) Com_Printf("^1Error Enumerating DirectSound Devices\n"); if (g_dsguid == NULL) Com_Printf("^1Device '%s' not found. ^2Using default driver.\n", s_dev->string); } Com_Printf( "Initializing DirectSound\n"); use8 = 1; // Create IDirectSound using the primary sound device if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void **)&pDS))) { use8 = 0; if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void **)&pDS))) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } } hresult = pDS->lpVtbl->Initialize( pDS, g_dsguid); Com_DPrintf( "ok\n" ); Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf("ok\n" ); // create the secondary buffer we'll actually work with dma.channels = 2; dma.samplebits = 16; if (s_khz->integer >= 44) dma.speed = 44100; else if (s_khz->integer >= 32) dma.speed = 32000; else if (s_khz->integer >= 24) dma.speed = 24000; else if (s_khz->integer >= 22) dma.speed = 22050; else dma.speed = 11025; memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = dma.channels; format.wBitsPerSample = dma.samplebits; format.nSamplesPerSec = dma.speed; format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; format.cbSize = 0; format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; memset (&dsbuf, 0, sizeof(dsbuf)); dsbuf.dwSize = sizeof(DSBUFFERDESC); // Micah: take advantage of 2D hardware.if available. dsbuf.dwFlags = DSBCAPS_LOCHARDWARE; if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; dsbuf.lpwfxFormat = &format; memset(&dsbcaps, 0, sizeof(dsbcaps)); dsbcaps.dwSize = sizeof(dsbcaps); Com_DPrintf( "...creating secondary buffer: " ); if (DS_OK == pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { Com_Printf( "locked hardware. ok\n" ); } else { // Couldn't get hardware, fallback to software. dsbuf.dwFlags = DSBCAPS_LOCSOFTWARE; if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } if (DS_OK != pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { Com_Printf( "failed\n" ); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf( "forced to software. ok\n" ); } // Make sure mixer is active if ( DS_OK != pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING) ) { Com_Printf ("*** Looped sound play failed ***\n"); SNDDMA_Shutdown (); return qfalse; } // get the returned buffer size if ( DS_OK != pDSBuf->lpVtbl->GetCaps (pDSBuf, &dsbcaps) ) { Com_Printf ("*** GetCaps failed ***\n"); SNDDMA_Shutdown (); return qfalse; } gSndBufSize = dsbcaps.dwBufferBytes; dma.channels = format.nChannels; dma.samplebits = format.wBitsPerSample; dma.speed = format.nSamplesPerSec; dma.samples = gSndBufSize/(dma.samplebits/8); dma.submission_chunk = 1; dma.buffer = NULL; // must be locked first sample16 = (dma.samplebits/8) - 1; SNDDMA_BeginPainting (); if (dma.buffer) memset(dma.buffer, 0, dma.samples * dma.samplebits/8); SNDDMA_Submit (); return 1; }
int SNDDMA_InitDS () { HRESULT hresult; DSBUFFERDESC dsbuf; DSBCAPS dsbcaps; WAVEFORMATEX format; int use8; Com_Printf( "Initializing DirectSound\n"); use8 = 1; // Create IDirectSound using the primary sound device if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound8, (void **)&pDS))) { use8 = 0; if( FAILED( hresult = CoCreateInstance(CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound, (void **)&pDS))) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } } hresult = pDS->Initialize( NULL); Com_DPrintf( "ok\n" ); Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); if ( DS_OK != pDS->SetCooperativeLevel( g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf("ok\n" ); // create the secondary buffer we'll actually work with dma.channels = 2; dma.samplebits = 16; if (s_khz->integer == 44) dma.speed = 44100; else if (s_khz->integer == 22) dma.speed = 22050; else dma.speed = 11025; memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = dma.channels; format.wBitsPerSample = dma.samplebits; format.nSamplesPerSec = dma.speed; format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; format.cbSize = 0; format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; memset (&dsbuf, 0, sizeof(dsbuf)); dsbuf.dwSize = sizeof(DSBUFFERDESC); // Micah: take advantage of 2D hardware.if available. dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCHARDWARE; if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } //#define idDSBCAPS_GETCURRENTPOSITION2 0x00010000 dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; dsbuf.lpwfxFormat = &format; memset(&dsbcaps, 0, sizeof(dsbcaps)); dsbcaps.dwSize = sizeof(dsbcaps); Com_DPrintf( "...creating secondary buffer: " ); if (DS_OK == pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { Com_Printf( "locked hardware. ok\n" ); } else { // Couldn't get hardware, fallback to software. dsbuf.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE; if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } if (DS_OK != pDS->CreateSoundBuffer(&dsbuf, &pDSBuf, NULL)) { Com_Printf( "failed\n" ); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf( "forced to software. ok\n" ); } // Make sure mixer is active if ( DS_OK != pDSBuf->Play(0, 0, DSBPLAY_LOOPING) ) { Com_Printf ("*** Looped sound play failed ***\n"); SNDDMA_Shutdown (); return qfalse; } // get the returned buffer size if ( DS_OK != pDSBuf->GetCaps (&dsbcaps) ) { Com_Printf ("*** GetCaps failed ***\n"); SNDDMA_Shutdown (); return qfalse; } gSndBufSize = dsbcaps.dwBufferBytes; dma.channels = format.nChannels; dma.samplebits = format.wBitsPerSample; dma.speed = format.nSamplesPerSec; dma.samples = gSndBufSize/(dma.samplebits/8); dma.submission_chunk = 1; dma.buffer = NULL; // must be locked first sample16 = (dma.samplebits/8) - 1; SNDDMA_BeginPainting (); if (dma.buffer) memset(dma.buffer, 0, dma.samples * dma.samplebits/8); SNDDMA_Submit (); return 1; }
int SNDDMA_InitDS () { HRESULT hresult; DSBUFFERDESC dsbuf; DSBCAPS dsbcaps; WAVEFORMATEX format; int use8; // Match/Choose output directsound device SNDDMAHD_DSEnumSoundDevices(qfalse); Com_Printf( "Initializing DirectSound\n"); use8 = 1; // Create IDirectSound using the primary sound device if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void **)&pDS))) { use8 = 0; if( FAILED( hresult = CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void **)&pDS))) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } } hresult = pDS->lpVtbl->Initialize( pDS, g_dsguid); Com_DPrintf( "ok\n" ); Com_DPrintf("...setting DSSCL_PRIORITY coop level: " ); if ( DS_OK != pDS->lpVtbl->SetCooperativeLevel( pDS, g_wv.hWnd, DSSCL_PRIORITY ) ) { Com_Printf ("failed\n"); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf("ok\n" ); // create the secondary buffer we'll actually work with dma.channels = 2; dma.samplebits = 16; if (s_khz->integer >= 44) dma.speed = 44100; else if (s_khz->integer >= 32) dma.speed = 32000; else if (s_khz->integer >= 24) dma.speed = 24000; else if (s_khz->integer >= 22) dma.speed = 22050; else dma.speed = 11025; #ifndef NO_DMAHD if (dmaHD_Enabled()) { // p5yc0runn3r - Fix dmaHD sound to 44KHz, Stereo and 16 bits per sample. dma.speed = 44100; dma.channels = 2; dma.samplebits = 16; } #endif memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = dma.channels; format.wBitsPerSample = dma.samplebits; format.nSamplesPerSec = dma.speed; format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; format.cbSize = 0; format.nAvgBytesPerSec = format.nSamplesPerSec*format.nBlockAlign; memset (&dsbuf, 0, sizeof(dsbuf)); dsbuf.dwSize = sizeof(DSBUFFERDESC); // Micah: take advantage of 2D hardware.if available. dsbuf.dwFlags = DSBCAPS_LOCHARDWARE; if (s_alttabmute->integer == 0) { // Keep playing when out of focus. dsbuf.dwFlags |= DSBCAPS_STICKYFOCUS; } if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } dsbuf.dwBufferBytes = SECONDARY_BUFFER_SIZE; dsbuf.lpwfxFormat = &format; memset(&dsbcaps, 0, sizeof(dsbcaps)); dsbcaps.dwSize = sizeof(dsbcaps); Com_DPrintf( "...creating secondary buffer: " ); if (DS_OK == pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { Com_Printf( "locked hardware. ok\n" ); } else { // Couldn't get hardware, fallback to software. dsbuf.dwFlags = DSBCAPS_LOCSOFTWARE; if (use8) { dsbuf.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; } if (DS_OK != pDS->lpVtbl->CreateSoundBuffer(pDS, &dsbuf, &pDSBuf, NULL)) { Com_Printf( "failed\n" ); SNDDMA_Shutdown (); return qfalse; } Com_DPrintf( "forced to software. ok\n" ); } // Make sure mixer is active if ( DS_OK != pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING) ) { Com_Printf ("*** Looped sound play failed ***\n"); SNDDMA_Shutdown (); return qfalse; } // get the returned buffer size if ( DS_OK != pDSBuf->lpVtbl->GetCaps (pDSBuf, &dsbcaps) ) { Com_Printf ("*** GetCaps failed ***\n"); SNDDMA_Shutdown (); return qfalse; } gSndBufSize = dsbcaps.dwBufferBytes; dma.channels = format.nChannels; dma.samplebits = format.wBitsPerSample; dma.speed = format.nSamplesPerSec; dma.samples = gSndBufSize/(dma.samplebits/8); dma.submission_chunk = 1; dma.buffer = NULL; // must be locked first sample16 = (dma.samplebits/8) - 1; SNDDMA_BeginPainting (); if (dma.buffer) memset(dma.buffer, 0, dma.samples * dma.samplebits/8); SNDDMA_Submit (); return 1; }