Chcąc w prosty sposób odtworzyć dźwięk w programie pod Windows, możemy skorzystać z funkcji WinAPI o nazwie PlaySound
. Wystarczy podać jej nazwę pliku dźwiękowego, by ten został odegrany:
Jak to jednak bywa w przypadku metod najprostszych, nie jest to rozwiązanie doskonałe. Jedną z jego wad jest bowiem to, że próbka dźwiękowa jest tutaj wczytywana z dysku tuż przed jej pierwszym odtworzeniem. W większości przypadków trwa to chwilę, którą da się zauważyć jako krótkie opóźnienie przed usłyszeniem dźwięku.
W grach (i nie tylko) jest to oczywiście niedopuszczalne, więc zwykle najlepszym wyjściem jest użycie wyspecjalizowanych bibliotek dźwiękowych. Jeśli jednak nie chcemy dołączać dodatkowych plików DLL lub wykorzystywać DirectX-a, możemy temu opóźnieniu zaradzić.
Funkcja PlaySound
pozwala bowiem na odtworzenie dźwięku nie tylko z pliku, ale też z pamięci operacyjnej:
W tym celu posłużyć się trzeba flagą SND_MEMORY
i podać wskaźnik do bloku pamięci, w którym znajduje się nasza próbką dźwiękowa. Skąd go wziąć? Ano chociażby wczytać plik dźwiękowy z dysku do pamięci:
“Trik” polega na tym, że operację wczytywania możemy przeprowadzić wcześniej, a więc w trakcie ładowania całej gry, pojedynczego etapu, pokoju, krainy, itp. – czyli wtedy, gdy jej potencjalnie długi czas nie będzie nikomu przeszkadzał. Potem zaś da się ją odtworzyć z pamięci i nie doświadczać żadnych opóźnień.
Trzeba tylko pamiętać, żeby na koniec zwolnić pamięć przeznaczoną na wczytaną próbkę.
Moze nieco odejde od tematu posta, ale…
Po co w ogole stosowac ukosniki w tej postaci “\\” – ani to przenosne ani ladne… :) A “/” Dziala zarowno pod Windowsem jak i kazdym innym systemem czy kompilatorem. ( Przynajmniej pod MSVCPP i GCC )
O ile pamiętam, PlaySound() domyślnie odtwarza dźwięk synchronicznie, tj. funkcja oddaje sterowanie dopiero po zakończeniu odtwarzania dźwięku. Zwykle tego nie chcemy, więc aby odtworzyć dźwięk asynchronicznie należy dodać flagę SND_ASYNC; ostatecznie dostaniemy więc:
PlaySound ((LPCTSTR)pSound, NULL, SND_MEMORY | SND_ASYNC);
TeMPOraL:
Gdy zastosowałem taką kombinację flag, z moich głośników nic nie usłyszałem. Może wiecie dlaczego?
Odtwarzanie dźwięku za pomocą PlaySound jest do bani — nie można odtwarzać jednocześnie kilku dźwięków. Już chyba lepiej użyć MCI ;)
@vashpan: Nie wiem, co ma tu do rzeczy kompilator. Wg mnie liczy się bardziej to, że przekazujemy ścieżkę do funkcji Windows API, wobec czego całkiem rozsądne jest używanie standardowych windowsowych separatorów ścieżki, czyż nie? :)
@revo: Ano oczywiście, że najczęściej używa się bibliotek typu BASS czy DirectSound. Ale o tym pozwoliłem sobie też wspomnieć ;)
@Xion, MCI jest systemowe — pod wieczór może wrzucę notkę o tym u siebie ;)