I'm a bit late to the Handmade Hero GameDev but I made my way up to Day 7 in one go. But now I ran into a problem with the Win32InitSound function which it seems I can't figure out myself. More specific it's the WaveFormat.wFormatTag which i cannot set without getting the [E_INVALIDARG One or more arguments are invalid - unrecognized token] error. If it is not set the PrimaryBuffer->SetFormat(&WaveFormat) returns S_OK. Is there a way to find out why it is not working? My code for the DirectSound Implementation:
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <dsound.h> #define DIRECT_SOUND_CREATE(name) HRESULT WINAPI name(LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter) typedef DIRECT_SOUND_CREATE(direct_sound_create); internal void Win32InitDirectSound(HWND Window, int32 SamplesPerSecond, int32 BufferSize) { // note: load the library HMODULE DirectSoundLibrary = LoadLibrary("dsound.dll"); if (DirectSoundLibrary) { // note: Get a DirectSound Object - cooperative direct_sound_create *DirectSoundCreate = (direct_sound_create *) GetProcAddress(DirectSoundLibrary, "DirectSoundCreate"); // todo: doublecheck that this works on windows xp - directsound8 or 7? LPDIRECTSOUND DirectSound; if (DirectSoundCreate && SUCCEEDED(DirectSoundCreate(0, &DirectSound, 0))) { // note: waveformat für die buffer vorbereiten // typedef struct { // WORD wFormatTag; // WORD nChannels; // DWORD nSamplesPerSec; // DWORD nAvgBytesPerSec; // WORD nBlockAlign; // WORD wBitsPerSample; // WORD cbSize; // } WAVEFORMATEX; WAVEFORMATEX WaveFormat = {}; WaveFormat.cbSize = 0; WaveFormat.wFormatTag = WAVE_FORMAT_PCM; // -> E_INVALIDARG One or more arguments are invalid. WaveFormat.nChannels = 2; WaveFormat.wBitsPerSample = 16; WaveFormat.nSamplesPerSec = SamplesPerSecond; WaveFormat.nBlockAlign = (WaveFormat.nChannels * WaveFormat.wBitsPerSample) / 8; WaveFormat.nAvgBytesPerSec = WaveFormat.nChannels * WaveFormat.nBlockAlign; if (SUCCEEDED(DirectSound->SetCooperativeLevel(Window, DSSCL_PRIORITY))) { // note: primären buffer anlegen // todo: DSBCAPS_GLOBALFOCUS? // typedef struct DSBUFFERDESC { // DWORD dwSize; // DWORD dwFlags; // DWORD dwBufferBytes; // DWORD dwReserved; // LPWAVEFORMATEX lpwfxFormat; // GUID guid3DAlgorithm; // } DSBUFFERDESC; DSBUFFERDESC BufferDescription = {}; BufferDescription.dwSize = sizeof(BufferDescription); BufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; LPDIRECTSOUNDBUFFER PrimaryBuffer; if (SUCCEEDED(DirectSound->CreateSoundBuffer(&BufferDescription, &PrimaryBuffer, 0))) { // HRESULT error = PrimaryBuffer->SetFormat(&WaveFormat); // if (SUCCEEDED(error)) { if (SUCCEEDED(PrimaryBuffer->SetFormat(&WaveFormat))) { OutputDebugStringA("PrimaryBuffer format was set\n"); } else { // todo: error log } } else { // todo: error log } } else { // todo: error log } // note: sekundären buffer anlegen // todo: DSBCAPS_GETCURRENTPOSITION2? DSBUFFERDESC BufferDescription = {}; BufferDescription.dwSize = sizeof(BufferDescription); BufferDescription.dwFlags = 0; BufferDescription.dwBufferBytes = BufferSize; BufferDescription.lpwfxFormat = &WaveFormat; LPDIRECTSOUNDBUFFER SecondaryBuffer; // HRESULT error = DirectSound->CreateSoundBuffer(&BufferDescription, &SecondaryBuffer, 0); // if (SUCCEEDED(error)) { if (SUCCEEDED(DirectSound->CreateSoundBuffer(&BufferDescription, &SecondaryBuffer, 0))) { OutputDebugStringA("SecondaryBuffer created successfully\n"); } else { // todo: error log } } else { // todo: error log } } } |
PS: I'm developing on Windows 10 with VS2017 if that has anything to do with it