0x666 napisał(a)
Zasadniczo, buffory powinny mieć rozmiar, który jest wielokrotnością nBlockAlign lub nChannels*wBitsPerSample>>3.
Ok cenna uwaga...
0x666 napisał(a)
Zamiast:
if(FileHead.RIFF.RIFF[0]!='R'||FileHead.RIFF.RIFF[1]!='I'||
FileHead.RIFF.RIFF[2]!='F'||FileHead.RIFF.RIFF[3]!='F') return 2;
możesz:
if(memcmp(FileHead.RIFF.RIFF,"RIFF",4))return 2;
//lub
if(strncmp(FileHead.RIFF.RIFF,"RIFF",4))return 2;
Oj tam... kwestia zapisu
0x666 napisał(a)
Zawsze sprawdzaj, co zawiera WAVEFORMATEX::wFormatTag. Musi być WAVE_FORMAT_PCM lub WAVE_FORMAT_IEEE_FLOAT. Inne formaty na ogół są skompresowane.
Ok
0x666 napisał(a)
DWORD CopyData[3];
ZeroMemory(&CopyData,12); //<--- pewny jesteś tego '&' ???
Hehe... tak z przyzwyczajenia jakoś napisałem :D, dobrze że zwróciłeś uwagę, kto wie co by było za tym wskaźnikiem...
0x666 napisał(a)
Dlaczego wypełniasz bufor, który przed chwilą wysłałeś do odtwarzania? I dlaczego jest tylko jedna struktura WAVEHDR? Ma być ich tyle, ile jest buforów.
No rzeczywiście wypełniam bufor, który wysłałem xd
Aha, 3xWAVEHDR to całkiem zmienia postać rzeczy... wiesz moja niewiedza spora, bo przeczytałem tu artykuł o niskopoziomowym odtwarzaniu i próbuję coś tworzyć, jakiś odtwarzacz, co prawda przejrzałem msdn i z grubsza przejrzałem funkcje waveOut..., ale w odtwarzaniu buforami w ogóle nie mam wiedzy, dlatego się pytam xd
Na początku po przeczytaniu artykułu w pierwszej wersji kodu, napisałem to tak: 2 bufory, wypełniam 1, wysyłam, wypełniam drugi, czekam na komunikat zakończenia, wysyłam drugi, wypełniam pierwszy, itd. myślałem, że nie można kolejkować buforów i można wysłać tylko raz waveOutWrite i dopiero po zakończeniu odtwarzania, mogę wysłać następny, już sporo się od ciebie dowiedizałem i wielkie dzięki ci za to...
0x666 napisał(a)
Podsumowując, źle czytasz pliki wav (to czysty przypadek, że to działa). Nie wiem jak chcesz czytać inne formaty, jeżeli mieszasz "strumienie" plikowe ze strumieniami audio.
Jak już powiedziałem nie mam wiedzy na temat plików audio, tyle co przeczytałem z artykułu, w ogóle na razie to skupię się na poprawnym odtwarzaniu, a poprawność ładowanego pliku i obsługa różnych formatów potem, testowy wave się ładuje i odtwarza jakoś, na razie wystarczy, teraz biorę się za poprawianie błędów, podsumowując:
- robię 3 bufory
- wypełniam wszystkie
- wysyłam wszystkie do urządzenia
- i teraz czekam na komunikat zakończenia odtwarzania pierwszego buforu
- w nim wypełniam buffor i wysyłam go, a numer buforu teraz wezmę z parametru, więc nie będę musiał ręcznie zapamiętywać, który bufor ostatnio był wypełniony(NumBuffer)</quote>
EDIT**********
Oke kod poprawiony, działa całkiem przyzwoicie, dopóki nic nie robię z oknem, bo już samo ruszanie myszką na nim, powoduje drobniusie przycięcia, ale to zapewne przez zawalenie kolejki komunikatami WM_MOUSEMOVE itp.
Coś wykombinuję, spróbuję z tą funkcją lub coś z kolejką...
0x666 jeszcze jakbyś mógł rzucić raz okiem na kod i sprawdzić czy znowu czegoś nie spie.. źle zrobiłem :-), adres ftp ten sam co w poprzednim poście...
Wielkie dzięki za pomoc, pozdrawiam...