2012-08-25 14 views
6

Mam aplikację, która ma dźwięk. Mam globalną właściwość wyciszania dźwięku. Problem polega na tym, że jest tyle różnych rzeczy, które potrafią wydawać dźwięki. Nie chciałbym powtarzać różnych typów klas i wyciszać/wyłączać ich dźwięk. Zamiast tego szukam sposobu na wyciszenie dźwięku na globalnym poziomie aplikacji. Nie mam na myśli wyciszania całego woluminu systemowego.Jak wyciszyć dźwięk mojej aplikacji?

Jeden scenariusz: W systemie Windows 7 można otworzyć mikser głośności i dostosować głośność poszczególnych aplikacji. Chociaż nie zamierzam zmieniać tej konkretnej konkretnej wartości (ponieważ wiem, że jest to specyficzne dla Windows 7), chciałbym zmienić jednocześnie wszystko w mojej aplikacji. Potrzebowałabym też możliwości całkowitego wyciszenia dźwięku wszystkiego w mojej aplikacji. Potrzebuję tej zdolności, aby być kompatybilną z Windows XP i nowszymi. Zakładam, że będzie to dotyczyć wywołań interfejsu Windows API, ale nie mam pojęcia, jakie są wywołania.

+0

Wystarczy popatrzeć na to pytanie: http://stackoverflow.com/questions/1092466/windows-xp-mute-unmute-audio-in-programmatically-in-python – Sebi

+3

dla tego co pamiętam, nie miał XP poziom dźwięku przypadający na aplikację. Będziesz mieć centralne wyjście dźwiękowe API w swojej aplikacji i tam przełączasz, jeśli wypuścisz go do Windows API lub po prostu zignorujesz i zrzekniesz –

+1

WinXP nie ma możliwości sterowania dźwiękiem aplikacji. Zostało to dodane w systemie Vista i wykorzystuje do tego zupełnie osobny (nowy) interfejs API, dodając nowe interfejsy do obsługi tego systemu. Larry Osterman (jeden ze starzy-starzy MS) miał serię nowych API dźwięku na swoim blogu; Nie mam linku do tego na tym komputerze, ale powinieneś być w stanie go znaleźć przez Googling. Na tym są posty na SO w C/C++. Pamiętam, że widziałem jakiś czas temu; Zobaczę, czy mogę znaleźć wyszukiwany termin, którego użyjesz, aby je znaleźć. –

Odpowiedz

3

To, o co prosisz, nie jest możliwe w XP; system operacyjny po prostu nie obsługuje poziomów głośności poszczególnych aplikacji.

Możesz osiągnąć to, co chcesz, tworząc klasę ustawień, która utrzymuje rzeczy takie jak SoundActive: Boolean lub PlaySounds: Boolean lub coś podobnego. Umieść go w swojej jednostce i posiada sekcję inicjalizacji, która tworzy jej instancję i sekcję finalizacji, która uwalnia ją (czyniąc ją skutecznie zbiorem wartości globalnych).

Każda jednostka, która potrzebuje dostępu do tych ustawień, po prostu używa jednostki, która je zawiera i odpowiednio dostosowuje zachowanie. Tak więc każdy z twoich zajęciach dziecko lub formach lub cokolwiek to wystarczy sprawdzenie dodanych:

if CurrentSettings.PlaySounds then 
    // Code that makes sounds, plays music, whatever. 

Klasa ustawienia mogą również zawierać metody, które śledzić aktualny poziom głośności (na XP, poziom całego systemu), oraz metody zwiększania lub zmniejszania głośności za pomocą funkcji głośności MMSystem (istnieje mnóstwo przykładów tutaj i za pośrednictwem Google). Twoja aplikacja może wtedy używać zdarzeń OnActivate i OnDeactivate, aby ustawić poziom głośności, gdy aplikacja zacznie się skupiać, i przywrócić ją do właściwego poziomu głośności, gdy aplikacja utraci ostrość.

W Vista i wyżej, można użyć interfejsu IAudioEndPointVolume wspominałem wcześniej i albo GetMasterVolumeLevel lub SetMasterVolumeLevel metody kontrolowania szeroki woluminu systemowego (mam przykład w ten sposób, wraz z odpowiednimi definicjami interfejsów MMDevAPI) lub poziomu urządzenia głośność (za pomocą IMMDevioce.Activate wybierz najpierw właściwe urządzenie, a następnie powyższe metody IAudioEndPointVolume na interfejsie urządzenia otrzymane od IMMDevice.Activate w parametrze ppInterface).

Dla poszczególnych aplikacji, należy użyć interfejsu ISimpleAudioVolume, który ma cztery metody: GetMasterVolume i SetMasterVolume, które kontrolują poziom głośności sesji audio w aplikacji i GetMute i SetMute co pozwala odzyskać bieżący wyciszenia wartość flagi lub ustawić to odpowiednio. (Larry Osterman ze stwardnienia rozsianego, który był jednym z twórców, którzy pracowali nad nowym wsparciem audio w Vista i Win7, ma świetny starting point article na swoim blogu o rodzajach audio w nowym API i kiedy użyć każdego z nich.)

Można w sposób koncepcyjny określić w czasie wykonywania systemu operacyjnego, którego używasz, i programowo przełączać między używaniem funkcji MMSystem w systemie XP i wcześniejszych, a funkcją MMDevAPI w systemie Vista i nowszych. Oczekiwanie, że ktoś tu przedstawi kod, jest jednak trochę nierozsądne. Linki, które podaję, powinny zacząć od właściwej ścieżki, a kiedy natkniesz się na przeszkodę, konkretna pomoc w pracy z tymi przeszkodami będzie świetnym pytaniem.

4

XP nie obsługuje regulacji głośności na poziomie aplikacji. Ta możliwość została dodana w systemie Vista. Więc to, co próbujesz zrobić, nie może być wykonane w XP w uczciwy sposób.

Istnieje oprogramowanie o nazwie IndieVolume, które retro pasuje do sterowania głośnością w aplikacjach do XP. Mogę sobie tylko wyobrazić, że robi to za pomocą hackowania niskiego poziomu, wtrysku DLL i tak dalej. Wątpię, czy to naprawdę opcja dla ciebie.

Powiązane problemy