PlaySound krótka pauza pomiędzy jednym a drugim dźwiękiem

0

Piszę coś w Delphi7.

Używam w swojej aplikacji w kilku miejscach polecenia:

PlaySound('dzwiek.wav', 0, SND_FILENAME or SND_NODEFAULT or SND_NOWAIT); 

odtworzenia dźwięków następują po sobie i w miejscu gdzie następuje jedno po drugim jest ok pół sekundy przerwy pomiędzy odtworzeniem jednego, a drugiego. Czy jest jakiś sposób, aby dźwięki były odtwarzane jeden po drugim bez tej mikro przerwy?

Nie zależy mi na tym, żeby odtwarzanie następowało przez PlaySound, ale odtwarzanie dźwięku to dość poboczna funkcja w programie i nie chcę programu rozbudowywać zanadto z jej powodu, dlatego też nie zdecydowałem się na zastosowanie komponentów, jak choćby MediaPlayer

Z góry dziękuję za odpowiedź.

0

Sprawdź flagę SND_ASYNC wygląda obiecująco, tzn. dźwięk powinien odtwarzać się w tle a program działać dalej (nie testowałem), z MSDN wynika, że flaga SND_NOWAIT jest nieużywana

1

Może pokombinować z bass.dll. Wielkie możliwości, darmowe do zastosowań niekomercyjnych. A do tego bogata dokumentacja i mnóstwo przykładów. Jak widać same plusy. A w razie czego jeżeli chcemy mieć wszystko w jednym exeku, to zawsze można wykorzystać dllloader.pas do załadowania tego z zasobów :)

EDIT: zostałem ubiegnięty. Jednak jakby co polecam, to jako alternatywe o dużych możliwościach.

0

szopenfx, w moim programie występuje to polecenie także z SND_ASYNC. problem, że gdy kod PlaySound występuje jeden za drugim, to w przypadku zastosowania flagi SND_ASYNC pierwszego dźwięku w ogóle nie słychać, bowiem natychmiast jest zastępowany drugim. Ponadto mam w jednym miejscu dźwięk SND_ASYNC i SND_LOOP, czyli odtwarzanie w tle, w kółko do czasu użycia polecenia, w którym występuje następny, inny dźwięk i ta nieduża pauza występuje także przy wywoływaniu tego polecenia.

edit:
Olesio, zaczynam się zapoznawać. Może to być ciekawe rozwiązanie. Ale potrzebuję czasu na poczytanie się z czym to się je i w jaki sposób. Także lekturę na jutro już mam. Dzięki.

Choć jeszcze nadal nie ukrywam, że mniej kłopotliwe byłoby podrasowanie wykorzystanie procedurki PlaySound, jeśli ktoś ma jeszcze jakiś pomysł, chętnie się zapoznam.

Dzięki.

0

A może ta przerwa jest po prostu ciszą na końcu jednego albo początku drugiego dźwięku?

Zresztą odradzam PlaySound w ogóle. Polecam DirectShow a do bardziej skomplikowanej zabawy - DirectSound.
Albo wspomniany już BASS.

Wszystko tylko nie PlaySound.

2

@XT: spoko, to masz ode mnie załącznik na zachęte. Do kombinowania pod VCL z trochę lipnym składniowo moduł bassfile.pas (pisałem to dość dawno i stosowałem teraz traktowane przeze mnie zbędne udziwnienia, jak = True itp). Ale dzięki niemu pojmiesz podstawy, jak odtworzyć dźwięk/mp3ke lub moduł muzyczny (również z zasobów). Dołączony moduł dllloader w wersji VCL. Natomiast w podkatalogu WINAPI, jest sam kod do korzystania dllki z zasobu i moduł dllloader z moim własnym mini_streams (wycięte najważniejsze ze źródeł VCL, po to by tylko skompilować całość). Po to aby użyć całości pod WinAPI, bez angażowania VCL. Całość przewidziana dla oraz testowana z Delphi 7. Jednak myślę, że nowsze IDE też ogarną temat. A dla Lazarusa będą pewnie konieczne niwwielkie zmiany w kodzie.

Mając przykład pod VCL w zasadzie z użyciem funkcji WinAPI do zasobów, a reszty z tej exportowanej dllki, powinieneś dojść co i jak. W razie czego jest dokumentacja i przykłady na stronie biblioteki. Polecam używać raczej opublikowanej ostatniej wersji lub przynajniej bardzo zbliżonej do 2.4. Po to żeby funkcja ładowania exportów z dllki w zasobach się powiodła. Gdyż starsze wersje po prostu nie posiadają wszystkich funkcji, a co za tym idzie takiej funkcjonalności. Lub funkcje te miały inne parametry.

1

Przeklikałem niezbędny kod dla biblioteki Bass.dll. Hula, jak ta lala. Dziękuję. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1