DirectSound CreateSoundBuffer gibt immer E_INVALIDARGS zurück



  • Guten Tag,
    in folgendem Code initialisiere ich DirectSound und versuche einen secondary buffer zu erzeugen:

    typedef struct win32_soundbufferformat
    {
    	WAVEFORMAT WaveFormat;
    	DSBUFFERDESC BufferDescription;
    }win32_soundbufferformat;
    
    typedef struct win32_directsoundinfo
    {
    	LPDIRECTSOUND DirectSound;
    	LPDIRECTSOUNDBUFFER PrimaryBuffer;
    	win32_soundbufferformat DefaultFormat;
    }win32_directsoundinfo;
    
    typedef struct win32_directsoundbuffer
    {
    	LPDIRECTSOUNDBUFFER DirectSoundBuffer;
    }win32_directsoundbuffer;
    
    internal error Win32_InitializeDirectSound(HWND WindowHandle, win32_directsoundinfo *DirectSoundInfo)
    {
    	HMODULE DSoundLib = LoadLibrary("dsound.dll");
    	if (DSoundLib)
    	{
    		direct_sound_create *DirectSoundCreate = (direct_sound_create *)GetProcAddress(DSoundLib, "DirectSoundCreate");
    		if (DirectSoundCreate)
    		{
    			DirectSoundInfo->DefaultFormat.WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nBlockAlign = 4;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nChannels = 2;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nSamplesPerSec = 48000;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nAvgBytesPerSec = DirectSoundInfo->DefaultFormat.WaveFormat.nBlockAlign*DirectSoundInfo->DefaultFormat.WaveFormat.nSamplesPerSec;
    
    			DirectSoundInfo->DefaultFormat.BufferDescription.dwBufferBytes = 2*DirectSoundInfo->DefaultFormat.WaveFormat.nSamplesPerSec*DirectSoundInfo->DefaultFormat.WaveFormat.nChannels*DirectSoundInfo->DefaultFormat.WaveFormat.nBlockAlign;
    			DirectSoundInfo->DefaultFormat.BufferDescription.dwFlags = 0;
    			DirectSoundInfo->DefaultFormat.BufferDescription.dwReserved = 0;
    			DirectSoundInfo->DefaultFormat.BufferDescription.guid3DAlgorithm = DS3DALG_DEFAULT; //TODO: other flags end up in linker error 2001
    			DirectSoundInfo->DefaultFormat.BufferDescription.lpwfxFormat = 0;//&DirectSoundInfo->DefaultFormat.WaveFormat;
    			DirectSoundInfo->DefaultFormat.BufferDescription.dwSize = sizeof(DirectSoundInfo->DefaultFormat.BufferDescription);
    			if (DirectSoundCreate(NULL, &DirectSoundInfo->DirectSound, NULL)==DS_OK)
    			{
    				if (DirectSoundInfo->DirectSound->lpVtbl->SetCooperativeLevel(DirectSoundInfo->DirectSound, WindowHandle, DSSCL_PRIORITY)==DS_OK)
    				{
    					DSBUFFERDESC PrimaryBufferDescription = { 0 };
    					PrimaryBufferDescription.dwBufferBytes = 0;
    					PrimaryBufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER;
    					PrimaryBufferDescription.dwReserved = 0;
    					PrimaryBufferDescription.guid3DAlgorithm = DS3DALG_DEFAULT; //TODO: other flags end up in linker error 2001
    					PrimaryBufferDescription.lpwfxFormat = NULL;
    					PrimaryBufferDescription.dwSize = sizeof(PrimaryBufferDescription);
    
    					if (DirectSoundInfo->DirectSound->lpVtbl->CreateSoundBuffer(DirectSoundInfo->DirectSound,&PrimaryBufferDescription,&DirectSoundInfo->PrimaryBuffer,NULL)!=DS_OK)
    					{
    						return(XERROR_INVALID_ARGUMENTS);
    					}
    				}
    			}
    		}else
    		{
    			return(XERROR_FUNCTION_NOT_FOUND);
    		}
    	}	else
    	{
    		return(XERROR_LIB_NOT_FOUND);
    	}
    	return(XERROR_EXIT_SUCCESS);
    }
    
    internal error Win32_CreateSoundBuffer(win32_directsoundbuffer *TargetSoundBuffer, win32_directsoundinfo *DirectSoundInfo)
    {
    	if (SoundBufferFormat == NULL)
    	{
    		SoundBufferFormat = &DirectSoundInfo->DefaultFormat;
    	}
    
    	DSBUFFERDESC BufferDescription;
    	LPDIRECTSOUNDBUFFER SoundBuffer = { 0 };
    	WAVEFORMAT WaveFormat;
    
    	WaveFormat.nAvgBytesPerSec = 4*48000;
    	WaveFormat.nBlockAlign = 4;
    	WaveFormat.nChannels = 2;
    	WaveFormat.nSamplesPerSec = 48000;
    	WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
    
    	BufferDescription.dwBufferBytes =48000*4*2;
    	BufferDescription.dwFlags = 0;
    	BufferDescription.dwReserved = 0;
    	BufferDescription.dwSize = sizeof(BufferDescription);
    	BufferDescription.guid3DAlgorithm = DS3DALG_DEFAULT;
    	BufferDescription.lpwfxFormat = &WaveFormat;
    
    	HRESULT Error = DirectSoundInfo->DirectSound->lpVtbl->CreateSoundBuffer(DirectSoundInfo->DirectSound, &BufferDescription, &SoundBuffer, NULL);
    	return(XERROR_INVALID_ARGUMENTS);
    }
    

    Die function CreateSoundBuffer gibt allerdings immer den fehler E_INVALIDARGS zurück.

    Wo könnte das Problem liegen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum Gaming-Corner verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Gaming-Corner in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Ups, ins falsche Forum verschoben.



  • Kann passieren, ich wusste selber nicht, wohin damit 🙂



  • * nimm WAVEFORMATEX statt nur WAVEFORMAT
    * initialisiere alle structs mit 0 (Mit = {0}; bzw. memset ) bevor du die Member setzt
    * setze auch wBitsPerSample im Wave-Format
    * das if am Anfang von Win32_CreateSoundBuffer hat keinen erkennbaren Sinn



  • Ich habe WAVEFORMAT durch WAVEFORMATEX ausgetauscht und wBitsPerSample auf 16 gesetzt, alle structs mit {0} initialisiert und den if Block entfernt, immer noch der selbe Fehler 😕

    DirectSoundInfo->DefaultFormat.WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nBlockAlign = 4;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nChannels = 2;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nSamplesPerSec = 48000;
    			DirectSoundInfo->DefaultFormat.WaveFormat.nAvgBytesPerSec = DirectSoundInfo->DefaultFormat.WaveFormat.nBlockAlign*DirectSoundInfo->DefaultFormat.WaveFormat.nSamplesPerSec;
    			DirectSoundInfo->DefaultFormat.WaveFormat.cbSize = 0;
    			DirectSoundInfo->DefaultFormat.WaveFormat.wBitsPerSample = 16;
    
    typedef struct win32_soundbufferformat
    {
    	WAVEFORMATEX WaveFormat;
    	DSBUFFERDESC BufferDescription;
    }win32_soundbufferformat;
    

    Der Rest ist gleich



  • Abgesehen davon, gibt es irgendeine Möglichkeit, herauszufinden, welcher Parameter ungültig ist?



  • Jetzt funktioniert alles.
    Ich habe vergessen, den Member lpwfxFormat meines Sound Buffers mit einem Zeiger auf mein Waveformat zu initialisieren.
    (Hatte ich zwar vorher so gemacht, hat jedoch auch nicht funktioniert)

    Vielen Dank, hat mir sehr geholfen, scheint wohl aus irgendeinem Grund nur mit WAVEFORMATEX zu funktionieren.



  • lulle2007200 schrieb:

    Vielen Dank, hat mir sehr geholfen, scheint wohl aus irgendeinem Grund nur mit WAVEFORMATEX zu funktionieren.

    Was vermutlich auch der Grund dafür sein dürfte dass der Zeiger in der struct ein LPWAVEFORMATEX und kein LPWAVEFORMAT ist 😉



  • Das sollte es wohl sein 😉
    Nächstes mal sollte ich die Dokumentation der Windows APIs genauer lesen



  • Mal ne doofe Frage eines C++ Programmierers der schon lange nix mehr mit C gemacht hat...
    Wieso kann man das mit ner WAVEFORMAT struct überhaupt compilieren?
    Sollte das nicht nen Fehler geben?



  • Nur mal rein prinzipiell: Was ist denn der konkrete Grund, aus dem du im Jahr 2016 noch mit DirectSound arbeiten musst? Das ist nämlich sowas von deprecated, da wirkt Direct3D 9 noch wie frisch aus dem Kindergarten...und wieso in C? 😮



  • Was willste denn statt dessen nehmen?

    Laut hier
    https://msdn.microsoft.com/en-us/library/windows/desktop/dd370784(v=vs.85).aspx
    gibt's folgende Windows Sound APIs:

    * DirectSound
    * DirectMusic
    * Windows multimedia waveXxx and mixerXxx functions
    * Media Foundation

    Bis auf Media Foundation ist da alles noch viel mehr "deprecated" als DirectSound.

    WASAPI wäre noch eine Möglichkeit, aber das is halt sehr krass low-level. Vor allem der Umstand dass man selbst resampeln muss ist ... ein wenig krass.



  • hustbaer schrieb:

    Was willste denn statt dessen nehmen?

    XAudio2 oder WASAPI



  • Ah, richtig, XAudio2.
    Jetzt frag' ich mich bloss wieso das in der Liste fehlt. Das wird doch genau so wie die anderen auf Core Audio basieren... oder etwa doch nicht?



  • Ja, XAudio2 is effektiv wohl kaum mehr als ein hauchdünner Layer auf WASAPI oben drauf (wenn man sich beide APIs mal nebeneinander anschaut, kann man sich iirc sogar direkt ausmalen, was das eine unter der Haube genau tun wird). Ist in der Liste vermutlich nicht drinnen, weil es sich als Teil von DirectX halt hauptsächlich an Games richtet (auch XBox und so) und DirectX ja historisch eher sein eigenes Ding und für "normale" Anwendungen weniger interessant war. XAudio2 ist aber eigentlich genauso eine Systemkomponente wie der Rest von DirectX...


Log in to reply