Ĺadny brzuch
Programuję w VC++ i DirectDraw, chciałem dodać do tego DirectSound i tu mam problem. Znalazłem kilka kursów jak zabrać się za DS ale w żadnym nie ma jak załadować dźwięk z pliku do adresu wskaźnika.
Załączam kod źródłowy, jast to funkcja tworząca bufor i ładująca dźwięk:
#include "sound.h" extern HWND Main_Wnd; int SOUND::DSC(int BYTES, char* plik) { DirectSoundCreate(NULL, &(this->DS), NULL); this->DS->SetCooperativeLevel(Main_Wnd, DSSCL_PRIORITY); ZeroMemory(&(this->dsbd), sizeof(this->dsbd)); this->dsbd.dwSize = sizeof(this->dsbd); this->dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; this->DS->CreateSoundBuffer(&(this->dsbd), &(this->lpDSBGlowny), NULL); ZeroMemory(&(this->vfx), sizeof(this->vfx)); this->vfx.wFormatTag = WAVE_FORMAT_PCM; this->vfx.nChannels = 2; this->vfx.nSamplesPerSec = 22050; this->vfx.wBitsPerSample = 16; this->vfx.nBlockAlign = this->vfx.wBitsPerSample / 8 * this->vfx.nChannels; this->vfx.nAvgBytesPerSec = this->vfx.nSamplesPerSec * this->vfx.nBlockAlign; this->lpDSBGlowny->SetFormat(&(this->vfx)); ZeroMemory(&(this->dsbd), sizeof(this->dsbd)); this->dsbd.dwSize = sizeof(this->dsbd); this->dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY; this->dsbd.dwBufferBytes = BYTES; this->dsbd.lpwfxFormat = &(this->vfx); this->DS->CreateSoundBuffer(&(this->dsbd), &(this->lpDSBBufor), NULL); LPVOID pData; DWORD dwBytes; this->lpDSBBufor->Lock(0, NULL, &pData, &dwBytes, NULL, NULL, DSBLOCK_ENTIREBUFFER); //Tutaj muszę załadować plik wav pod adrez wkaźnika LPVOID this->lpDSBBufor->Unlock(pData, dwBytes, NULL, NULL); return true; }
Nie wiem jak to zrobić. Próbowałem ze strumieniami i plikami i nie wyszło. Może jest jakaś funkcja WinApi pozwalająca na załadowanie dźwięku?
Proszę o możliwie szybką pomoc.
I z góry dzięki.
#include <white_hawk>
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Załączam kod źródłowy, jast to funkcja tworząca bufor i ładująca dźwięk:
#include "sound.h" extern HWND Main_Wnd; int SOUND::DSC(int BYTES, char* plik) { DirectSoundCreate(NULL, &(this->DS), NULL); this->DS->SetCooperativeLevel(Main_Wnd, DSSCL_PRIORITY); ZeroMemory(&(this->dsbd), sizeof(this->dsbd)); this->dsbd.dwSize = sizeof(this->dsbd); this->dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; this->DS->CreateSoundBuffer(&(this->dsbd), &(this->lpDSBGlowny), NULL); ZeroMemory(&(this->vfx), sizeof(this->vfx)); this->vfx.wFormatTag = WAVE_FORMAT_PCM; this->vfx.nChannels = 2; this->vfx.nSamplesPerSec = 22050; this->vfx.wBitsPerSample = 16; this->vfx.nBlockAlign = this->vfx.wBitsPerSample / 8 * this->vfx.nChannels; this->vfx.nAvgBytesPerSec = this->vfx.nSamplesPerSec * this->vfx.nBlockAlign; this->lpDSBGlowny->SetFormat(&(this->vfx)); ZeroMemory(&(this->dsbd), sizeof(this->dsbd)); this->dsbd.dwSize = sizeof(this->dsbd); this->dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY; this->dsbd.dwBufferBytes = BYTES; this->dsbd.lpwfxFormat = &(this->vfx); this->DS->CreateSoundBuffer(&(this->dsbd), &(this->lpDSBBufor), NULL); LPVOID pData; DWORD dwBytes; this->lpDSBBufor->Lock(0, NULL, &pData, &dwBytes, NULL, NULL, DSBLOCK_ENTIREBUFFER); //Tutaj muszę załadować plik wav pod adrez wkaźnika LPVOID this->lpDSBBufor->Unlock(pData, dwBytes, NULL, NULL); return true; }
Nie wiem jak to zrobić. Próbowałem ze strumieniami i plikami i nie wyszło. Może jest jakaś funkcja WinApi pozwalająca na załadowanie dźwięku?
Proszę o możliwie szybką pomoc.
I z góry dzięki.
#include <white_hawk>