90 posts
[SOLVED] day 008 - squarewave to directsound: DSERR_PRIOLEVELNEEDED
Edited by C_Worm on
Hello!

im writing along at this episode (008 directsoud squarewave).

but i can't get the sound to work.

i've debugged and went through the code and the problem seem to be that GetCurrentPosition(); fails.

 1 2 3 4 DWORD playCursor; DWORD writeCursor; hr = global_pDsSecondaryBuffer->GetCurrentPosition(&playCursor, &writeCursor); if(SUCCEEDED(hr)) // <---- this returns 0x88780046 (seems to be DSERR_PRIOLEVELNEEDED) 

it returns and HRESULT written in hex 0x88780046, which after some searching seemed to correspond to DSERR_PRIOLEVELNEEDED.

however, in my initSound() function i manage to set the cooperativelevel successfully.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 void initDSound(HWND hwnd, int samplesPerSecond, int secBufferSize) { LPDIRECTSOUND pDSound = {}; DSBUFFERDESC dsSecondaryBufferDesc = {}; // SECONDARY BUFFER DSBUFFERDESC dsPrimaryBufferDesc = {}; // PRIMARY BUFFER LPDIRECTSOUNDBUFFER pDsPrimaryBuffer = {}; WAVEFORMATEX waveFormat = {}; // WAVEFORMAT waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = 2; waveFormat.nSamplesPerSec = samplesPerSecond; waveFormat.wBitsPerSample = 16; waveFormat.nBlockAlign = (waveFormat.nChannels * waveFormat.wBitsPerSample) / 8; waveFormat.nAvgBytesPerSec = (waveFormat.nSamplesPerSec * waveFormat.nBlockAlign); HRESULT hr; if(SUCCEEDED(hr = DirectSoundCreate(0, &pDSound, 0))) { OutputDebugString("DirectSound created successfully!"); if(SUCCEEDED(hr = pDSound->SetCooperativeLevel(hwnd, DSSCL_PRIORITY))) { OutputDebugString("\nSet CooperativeLevel successfully!"); } dsPrimaryBufferDesc.dwSize = sizeof(dsPrimaryBufferDesc); dsPrimaryBufferDesc.dwFlags = DSBCAPS_PRIMARYBUFFER; if (SUCCEEDED(hr = pDSound->CreateSoundBuffer(&dsPrimaryBufferDesc, &pDsPrimaryBuffer, 0))) { OutputDebugString("\nCreate Primary Sound Buffer successfully!"); if (SUCCEEDED(hr = pDsPrimaryBuffer->SetFormat(&waveFormat))) { OutputDebugString("\nPrim Buffer Format set Success!"); } } dsSecondaryBufferDesc.dwSize = sizeof(dsSecondaryBufferDesc); dsSecondaryBufferDesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2; dsSecondaryBufferDesc.dwBufferBytes = secBufferSize; dsSecondaryBufferDesc.guid3DAlgorithm = GUID_NULL; if (SUCCEEDED(hr = pDSound->CreateSoundBuffer(&dsPrimaryBufferDesc, &global_pDsSecondaryBuffer, 0))) { OutputDebugString("\nCreate Secondary Sound Buffer successfully!"); } } } 

does anyone have an idea of what the problem might be?
I know there could be many reasons for why this doesn't work but do you have any suggestions? :)

i don't wanna post the code in the "game-loop" cuz i don't wanna bother you with to much code.
but if you would like to look at that aswell. please let me know!

cheers!
Simon Anciaux
1051 posts
[SOLVED] day 008 - squarewave to directsound: DSERR_PRIOLEVELNEEDED
Edited by Simon Anciaux on Reason: link to the doc
I think you are missing the "lpwfxFormat" field of "dsSecondaryBufferDesc". You should set it the address of the WAVEFORMATEX structure for the secondary buffer. Here is a link to the DSBUFFERDESC documentation on MSDN.

lpwfxFormat
Address of a WAVEFORMATEX or WAVEFORMATEXTENSIBLE structure specifying the waveform format for the buffer. This value must be NULL for primary buffers.

 1 2 3 4 5 6 7 ... dsSecondaryBufferDesc.dwSize = sizeof(dsSecondaryBufferDesc); dsSecondaryBufferDesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2; dsSecondaryBufferDesc.dwBufferBytes = secBufferSize; dsSecondaryBufferDesc.guid3DAlgorithm = GUID_NULL; dsSecondaryBufferDesc.lpwfxFormat = &waveFormat; ... 
90 posts
[SOLVED] day 008 - squarewave to directsound: DSERR_PRIOLEVELNEEDED
Edited by C_Worm on
yes that was it, i actually solved by going through it again. but thanks anyway. owl of shame on me! :P