static int Initialize(void *hwnd) { DSBUFFERDESC primaryDesc; if (!g_lpDSDevice) return TRUE; sysMemZero(&primaryDesc, sizeof(DSBUFFERDESC)); primaryDesc.dwSize = sizeof(DSBUFFERDESC); primaryDesc.dwFlags = DSBCAPS_PRIMARYBUFFER; if (RLX.Audio.Config & RLXAUDIO_Use3D) primaryDesc.dwFlags|= DSBCAPS_CTRL3D; if (SYS_DXTRACE(g_lpDSDevice->SetCooperativeLevel((HWND)hwnd, DSSCL_EXCLUSIVE)) != DS_OK) return -1; if (SYS_DXTRACE(g_lpDSDevice->CreateSoundBuffer(&primaryDesc, &g_lpPrimaryBuffer, NULL))!=DS_OK ) return 0; else { HRESULT hr; sysMemZero(&g_cDSPCMOutFormat, sizeof(WAVEFORMATEX)); g_cDSPCMOutFormat.wFormatTag = WAVE_FORMAT_PCM; g_cDSPCMOutFormat.wBitsPerSample = 16; g_cDSPCMOutFormat.nChannels = 2; g_cDSPCMOutFormat.nSamplesPerSec = 44100; g_cDSPCMOutFormat.nBlockAlign = (uint16_t)(g_cDSPCMOutFormat.nChannels * (g_cDSPCMOutFormat.wBitsPerSample>>3)); g_cDSPCMOutFormat.nAvgBytesPerSec = (uint32_t)g_cDSPCMOutFormat.nBlockAlign * (uint32_t)g_cDSPCMOutFormat.nSamplesPerSec; hr = g_lpPrimaryBuffer->SetFormat(&g_cDSPCMOutFormat); if ( hr != DS_OK ) FindAlternateSampleFormat(); if (RLX.Audio.Config & RLXAUDIO_Use3D) { hr = SYS_DXTRACE(g_lpPrimaryBuffer->QueryInterface(IID_IDirectSound3DListener, (void**)&g_lpDS3DListener)); if (hr== DS_OK) hr = g_lpDS3DListener->SetAllParameters(&Listener3dProps, DS3D_IMMEDIATE); } } return 0; // no problemo. }
//----------------------------------------------------------------------------- // Name: Set3DParameters() // Desc: Set the 3D buffer parameters //----------------------------------------------------------------------------- VOID Set3DParameters( FLOAT fDopplerFactor, FLOAT fRolloffFactor, FLOAT fMinDistance, FLOAT fMaxDistance ) { // Every change to 3-D sound buffer and listener settings causes // DirectSound to remix, at the expense of CPU cycles. // To minimize the performance impact of changing 3-D settings, // use the DS3D_DEFERRED flag in the dwApply parameter of any of // the IDirectSound3DListener or IDirectSound3DBuffer methods that // change 3-D settings. Then call the IDirectSound3DListener::CommitDeferredSettings // method to execute all of the deferred commands at once. DWORD dwApplyFlag = ( g_bDeferSettings ) ? DS3D_DEFERRED : DS3D_IMMEDIATE; g_dsListenerParams.flDopplerFactor = fDopplerFactor; g_dsListenerParams.flRolloffFactor = fRolloffFactor; if( g_pDSListener ) g_pDSListener->SetAllParameters( &g_dsListenerParams, dwApplyFlag ); g_dsBufferParams.flMinDistance = fMinDistance; g_dsBufferParams.flMaxDistance = fMaxDistance; if( g_pDS3DBuffer ) g_pDS3DBuffer->SetAllParameters( &g_dsBufferParams, dwApplyFlag ); }