/* ==================== SndSys_LockRenderBuffer Get the exclusive lock on "snd_renderbuffer" ==================== */ qboolean SndSys_LockRenderBuffer (void) { #ifdef SUPPORTDIRECTX int reps; HRESULT hresult; DWORD dwStatus; if (pDSBuf) { // if the buffer was lost or stopped, restore it and/or restart it if (IDirectSoundBuffer_GetStatus (pDSBuf, &dwStatus) != DS_OK) Con_Print("Couldn't get sound buffer status\n"); if (dwStatus & DSBSTATUS_BUFFERLOST) { Con_Print("DSound buffer is lost!!\n"); IDirectSoundBuffer_Restore (pDSBuf); } if (!(dwStatus & DSBSTATUS_PLAYING)) IDirectSoundBuffer_Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); reps = 0; while ((hresult = IDirectSoundBuffer_Lock(pDSBuf, 0, gSndBufSize, (LPVOID*)&dsound_pbuf, &dsound_dwSize, (LPVOID*)&dsound_pbuf2, &dsound_dwSize2, 0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Con_Print("S_LockBuffer: DS: Lock Sound Buffer Failed\n"); S_Shutdown (); S_Startup (); return false; } if (++reps > 10000) { Con_Print("S_LockBuffer: DS: couldn't restore buffer\n"); S_Shutdown (); S_Startup (); return false; } } if ((void*)dsound_pbuf != snd_renderbuffer->ring) Sys_Error("SndSys_LockRenderBuffer: the ring address has changed!!!\n"); return true; } #endif return wav_init; }
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 *) & pbuf1, &dwSize, (LPVOID *) & pbuf2, &dwSize2,0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Con_Printf ("S_TransferStereo16: DS::Lock Sound Buffer Failed\n"); S_Shutdown (); S_Startup (); return NULL; } if (++reps > 10000) { Con_Printf ("S_TransferStereo16: DS: couldn't restore buffer\n"); S_Shutdown (); S_Startup (); return NULL; } } } else { IDirectSoundBuffer_Unlock (pDSBuf, pbuf1, dwSize, NULL, 0); pbuf1=NULL; pbuf2=NULL; dwSize=0; dwSize2=0; } return(pbuf1); }
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(); } }
static void *ds7_lock(struct SoundCard *sc) { struct dspriv *p = sc->driverprivate; int reps; DWORD dwSize,dwSize2; DWORD *pbuf2; HRESULT hresult; reps = 0; while ((hresult = p->pDSBuf->lpVtbl->Lock(p->pDSBuf, 0, p->gSndBufSize, &sc->buffer, &p->lockedsize, &pbuf2, &dwSize2, 0)) != DS_OK) { if (hresult != DSERR_BUFFERLOST) { Com_Printf("dsound7: Lock Sound Buffer Failed\n"); #if 0 S_Shutdown (); S_Startup (); #endif return NULL; } if (++reps > 10000) { Com_Printf("dsound7: couldn't restore buffer\n"); #if 0 S_Shutdown (); S_Startup (); #endif return NULL; } } return sc->buffer; }
static void S_Restart_f (void) { Com_DPrintf("Restarting sound system....\n"); Cache_Flush(); S_StopAllSounds (true); S_Shutdown(); Com_DPrintf("sound: Shutdown OK\n"); if (!S_Startup()) { snd_initialized = false; return; } ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); S_StopAllSounds (true); if (developer.value) S_SoundInfo_f(); }
/* ================ S_Init ================ */ void S_Init (void) { Con_Printf("\nSound Initialization\n"); Cvar_RegisterVariable(&precache); if (COM_CheckParm("-nosound")) return; if (COM_CheckParm("-simsound")) fakedma = true; Cmd_AddCommand("play", S_Play); Cmd_AddCommand("playvol", S_PlayVol); Cmd_AddCommand("stopsound", S_StopAllSoundsC); Cmd_AddCommand("soundlist", S_SoundList); Cmd_AddCommand("soundinfo", S_SoundInfo_f); Cvar_RegisterVariable(&nosound); Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&loadas8bit); Cvar_RegisterVariable(&bgmvolume); Cvar_RegisterVariable(&bgmtype); Cvar_RegisterVariable(&bgmbuffer); Cvar_RegisterVariable(&ambient_level); Cvar_RegisterVariable(&ambient_fade); Cvar_RegisterVariable(&snd_noextraupdate); Cvar_RegisterVariable(&snd_show); Cvar_RegisterVariable(&_snd_mixahead); if (host_parms.memsize < 0x800000) { Cvar_Set ("loadas8bit", "1"); Con_Printf ("loading all sounds as 8bit\n"); } snd_initialized = true; S_Startup (); SND_InitScaletable (); known_sfx = Hunk_AllocName (MAX_SFX*sizeof(sfx_t), "sfx_t"); num_sfx = 0; // create a piece of DMA memory if (fakedma) { shm = (void *) Hunk_AllocName(sizeof(*shm), "shm"); shm->splitbuffer = 0; shm->samplebits = 16; shm->speed = 22050; shm->channels = 2; shm->samples = 32768; shm->samplepos = 0; shm->soundalive = true; shm->gamealive = true; shm->submission_chunk = 1; shm->buffer = Hunk_AllocName(1<<16, "shmbuf"); } Con_Printf ("Sound sampling rate: %i\n", shm->speed); // provides a tick sound until washed clean // if (shm->buffer) // shm->buffer[4] = shm->buffer[5] = 0x7f; // force a pop for debugging ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); S_StopAllSounds (true); }
void S_Init (void) { if (snd_initialized) { //whoops Com_Printf_State (PRINT_INFO, "Sound is already initialized\n"); return; } Com_DPrintf("\nSound Initialization\n"); Cvar_SetCurrentGroup(CVAR_GROUP_SOUND); Cvar_Register(&bgmvolume); Cvar_Register(&s_volume); Cvar_Register(&s_nosound); Cvar_Register(&s_precache); Cvar_Register(&s_loadas8bit); Cvar_Register(&s_khz); Cvar_Register(&s_ambientlevel); Cvar_Register(&s_ambientfade); Cvar_Register(&s_noextraupdate); Cvar_Register(&s_show); Cvar_Register(&s_mixahead); Cvar_Register(&s_swapstereo); #if (defined(__linux__) || defined(__FreeBSD__)) Cvar_Register(&s_stereo); Cvar_Register(&s_device); Cvar_Register(&s_bits); #endif #ifdef __linux__ Cvar_Register(&s_noalsa); #endif Cvar_ResetCurrentGroup(); // compatibility with old configs Cmd_AddLegacyCommand ("nosound", "s_nosound"); Cmd_AddLegacyCommand ("precache", "s_precache"); Cmd_AddLegacyCommand ("loadas8bit", "s_loadas8bit"); Cmd_AddLegacyCommand ("ambient_level", "s_ambientlevel"); Cmd_AddLegacyCommand ("ambient_fade", "s_ambientfade"); Cmd_AddLegacyCommand ("snd_noextraupdate", "s_noextraupdate"); Cmd_AddLegacyCommand ("snd_show", "s_show"); Cmd_AddLegacyCommand ("_snd_mixahead", "s_mixahead"); if (COM_CheckParm("-nosound")) { Cmd_AddLegacyCommand ("play", ""); // just suppress warnings return; } Cmd_AddCommand("snd_restart", S_Restart_f); Cmd_AddLegacyCommand("s_restart", "snd_restart"); // exclusively for Disconnect Cmd_AddCommand("play", S_Play_f); Cmd_AddCommand("playvol", S_PlayVol_f); Cmd_AddCommand("stopsound", S_StopAllSounds_f); Cmd_AddCommand("soundlist", S_SoundList_f); Cmd_AddCommand("soundinfo", S_SoundInfo_f); if (!snd_initialized && host_memsize < 0x800000) { Cvar_Set (&s_loadas8bit, "1"); Com_Printf ("loading all sounds as 8bit\n"); } snd_initialized = true; SND_InitScaletable (); if (!S_Startup ()) { snd_initialized = false; return; } known_sfx = (sfx_t *) Hunk_AllocName (MAX_SFX * sizeof(sfx_t), "sfx_t"); num_sfx = 0; ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); S_StopAllSounds (true); }
/* ================ S_Init ================ */ void S_Init (void) { int i; if (snd_initialized) { Con_Printf("Sound is already initialized\n"); return; } Cvar_RegisterVariable(&nosound); Cvar_RegisterVariable(&sfxvolume); Cvar_RegisterVariable(&precache); Cvar_RegisterVariable(&loadas8bit); Cvar_RegisterVariable(&bgmvolume); Cvar_RegisterVariable(&ambient_level); Cvar_RegisterVariable(&ambient_fade); Cvar_RegisterVariable(&snd_noextraupdate); Cvar_RegisterVariable(&snd_show); Cvar_RegisterVariable(&_snd_mixahead); Cvar_RegisterVariable(&sndspeed); Cvar_RegisterVariable(&snd_mixspeed); Cvar_RegisterVariable(&snd_filterquality); if (safemode || COM_CheckParm("-nosound")) return; Con_Printf("\nSound Initialization\n"); Cmd_AddCommand("play", S_Play); Cmd_AddCommand("playvol", S_PlayVol); Cmd_AddCommand("stopsound", S_StopAllSoundsC); Cmd_AddCommand("soundlist", S_SoundList); Cmd_AddCommand("soundinfo", S_SoundInfo_f); i = COM_CheckParm("-sndspeed"); if (i && i < com_argc-1) { Cvar_SetQuick (&sndspeed, com_argv[i+1]); } i = COM_CheckParm("-mixspeed"); if (i && i < com_argc-1) { Cvar_SetQuick (&snd_mixspeed, com_argv[i+1]); } if (host_parms->memsize < 0x800000) { Cvar_SetQuick (&loadas8bit, "1"); Con_Printf ("loading all sounds as 8bit\n"); } Cvar_SetCallback(&sfxvolume, SND_Callback_sfxvolume); Cvar_SetCallback(&snd_filterquality, &SND_Callback_snd_filterquality); SND_InitScaletable (); known_sfx = (sfx_t *) Hunk_AllocName (MAX_SFX*sizeof(sfx_t), "sfx_t"); num_sfx = 0; snd_initialized = true; S_Startup (); if (sound_started == 0) return; // provides a tick sound until washed clean // if (shm->buffer) // shm->buffer[4] = shm->buffer[5] = 0x7f; // force a pop for debugging ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); S_CodecInit (); S_StopAllSounds (true); }