int pest_open( HWND win ){ HMODULE lib; DIRECTSOUNDCREATE dsound_create; WAVEFORMATEX format; DSBUFFERDESC desc_primary, desc_secondary; lib = (HMODULE)LoadLibrary("dsound.dll"); if(lib==NULL) return FALSE; dsound_create = (DIRECTSOUNDCREATE)GetProcAddress(lib, "DirectSoundCreate"); if(dsound_create==NULL) return FALSE; FreeLibrary(lib); if( dsound_create( NULL, &dsound, NULL )!= DS_OK ) return FALSE; if( IDirectSound_SetCooperativeLevel( dsound, win, DSSCL_EXCLUSIVE | DSSCL_PRIORITY ) != DS_OK ) return FALSE; memset( &desc_primary, 0, sizeof(DSBUFFERDESC) ); desc_primary.dwSize = sizeof(DSBUFFERDESC); desc_primary.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_STICKYFOCUS; if(IDirectSound_CreateSoundBuffer( dsound, &desc_primary, &primary, NULL )!=DS_OK) return FALSE; memset( &format, 0, sizeof(WAVEFORMATEX) ); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 2; format.nSamplesPerSec = 44100; format.nAvgBytesPerSec = 44100 * 4; format.nBlockAlign = 4; format.wBitsPerSample = 16; if( IDirectSoundBuffer_SetFormat( primary, &format )!= DS_OK) return FALSE; memset( &desc_secondary, 0, sizeof(DSBUFFERDESC) ); desc_secondary.dwSize = sizeof(DSBUFFERDESC); desc_secondary.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; desc_secondary.lpwfxFormat = &format; desc_secondary.dwBufferBytes = 2*2*BUFFER_LEN; if(IDirectSound_CreateSoundBuffer( dsound, &desc_secondary, &secondary, NULL )!=DS_OK) return FALSE; InitializeCriticalSection(&critical); return TRUE; }
bool AudioOutputDSoundPrivate::init() { if (!loadDll()) return false; typedef HRESULT (WINAPI *DirectSoundCreateFunc)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); //typedef HRESULT (WINAPI *DirectSoundEnumerateFunc)(LPDSENUMCALLBACKA, LPVOID); DirectSoundCreateFunc dsound_create = (DirectSoundCreateFunc)GetProcAddress(dll, "DirectSoundCreate"); //DirectSoundEnumerateFunc dsound_enumerate = (DirectSoundEnumerateFunc)GetProcAddress(dll, "DirectSoundEnumerateA"); if (!dsound_create) { qWarning("Failed to resolve 'DirectSoundCreate'"); unloadDll(); return false; } if (FAILED(dsound_create(NULL/*dev guid*/, &dsound, NULL))){ unloadDll(); return false; } /* DSSCL_EXCLUSIVE: can modify the settings of the primary buffer, only the sound of this app will be hearable when it will have the focus. */ if (FAILED(dsound->SetCooperativeLevel(GetDesktopWindow(), DSSCL_EXCLUSIVE))) { qWarning("Cannot set direct sound cooperative level"); SafeRelease(&dsound); return false; } qDebug("DirectSound initialized."); DSCAPS dscaps; memset(&dscaps, 0, sizeof(DSCAPS)); dscaps.dwSize = sizeof(DSCAPS); if (FAILED(dsound->GetCaps(&dscaps))) { qWarning("Cannot get device capabilities."); SafeRelease(&dsound); return false; } if (dscaps.dwFlags & DSCAPS_EMULDRIVER) qDebug("DirectSound is emulated"); write_offset = 0; return true; }