DirectSound CreateSoundBuffer gibt immer E_INVALIDARGS zurück
-
Ups, ins falsche Forum verschoben.
-
Kann passieren, ich wusste selber nicht, wohin damit
-
* nimm
WAVEFORMATEX
statt nurWAVEFORMAT
* initialisiere alle structs mit 0 (Mit= {0};
bzw.memset
) bevor du die Member setzt
* setze auchwBitsPerSample
im Wave-Format
* dasif
am Anfang vonWin32_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 keinLPWAVEFORMAT
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 nerWAVEFORMAT
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 FoundationBis 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...