Hello everyone! 
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