Jak wyłączyć/wyciszyć dźwięk w programie?

0

witam!

jak zrobić aby dźwięki w moim programie były zawsze wyciszone? ..robie teraz program do otwierania stron www tylko chce żeby nie było w ogóle głosu w programie..że np jak otworze link z filmem w YouTube to żeby głosu tam nie było..czy da się dla poszczególnych aplikacji wyłączyć głos albo go wyciszyć do zera? albo jak zrobie w programie jakie koilwiek odtwarzanie dźwięków to żeby były one nie słyszalne. ma ktoś jakiś pomysł? szukam i szukam po necie i nie moge znaleźć ;/

0

jak znajdziesz odp na moje pytanie w tym linku co mi sam podałeś to będziesz geniuszem... ;/

0

W pierwszym wyniku w wątku na Stack Overflow, w zatwierdzonej odpowiedzi jest wyjaśnione wszystko co potrzeba. Potrzebny moduł z interface'ami pod Delphi również da się znaleźć i to na MSDnie. Jest tam funkcja GetSimpleAudioVolumeFromPid to z nią musisz pokombinować. Ewentualnie sobie tak przerobić aby podawać od razu PID, a nie wyszukiwać po nazwie exeka.

Ponieważ wiadomo, że aplikacja o podobnej nazwie może się powtarzać. I wtedy zostanie wyszukana pierwsza z nich. chyba, że sobie podasz własny PId aktualnego procesu. Jest też funkcja wyszukująca po HWND okien. Jednak najważniejsze, to zdecyduj się w końcu, w jakim języku potrzebujesz tego, bo jeśli jak wspomniałeś w C++ to powinieneś pisać w odpowiednim dziale, a nie tutaj.

Ewentulnie na bazie kodu z Delphi przetłumacz to sobie do C++ czy czego tam wolisz.

0

dzięki za jaką kolwiek odp. moze coś wykombinuje z tego... ja to chce w delphi zrobić..nie rozumiem o co biega wam z tym c++ ..chyba ze przez przypadek zamiast w dziale z delphi to założyłem temat w dziale z c++ i nie zauważyłem..sam nie wiem

0

Wszystkie funkcje WinAPI są dostępne w delphi.
Na stronie msdn niestety opisane tylko dla C++, C#, VBA.
Po tym jak znajdziesz odpowiednią funkcje to wpisujesz ją w delphi zaś delphi podpowie typy parametrów.

1

Przyznam się, że to ja tak odczytałem komentarz pytającego. Nie widząć kodu Dragona czy tam odnośnika, bo panował taki bajzel przez wielokrotne wysyłanie. Toteż zrozumiałem, że chcesz w C++. Nieważne, trochę kombinowałem sam. I wyciszenie całkowite to pestka. Jednak skorzystanie z gotowego kodu i próba użycia funkcji GetSimpleAudioVolumeFromPid dla Pid'u pobranego przez GetCurrentProcessId nie przechodzi linijki:

    hr := SessionManager.QueryInterface(IID_IAudioSessionQuery, SessionQuery);

Jeśli komuś udało by się faktycznie ogarnąć dlaczego i jak to zrobić. Bo z pobieraniem Device kombinowałem na różne sposoby, również tak jak w przykładach dostępnych na sieci. To mógłby się podzielić. Celowo pobrałem SDK microsoftu z przykładami w C++, ale tam widzę też tylko przykłady operowania globalnego. Oczywiście testowa aplikacja w Delphi odgrywa mi cały czas w pętli dźwięk z użyciem bass.dll. Bo tylko odgrywające aktualnie dźwięk pokażą się z możliwością regulacji głośności w mikserze pod Windows 7 z ikoną danej aplikacji.

Dołączam odpowiednie moduły.

2
olesio napisał(a):

Bo tylko odgrywające aktualnie dźwięk pokażą się z możliwością regulacji głośności w mikserze pod Windows 7 z ikoną danej aplikacji.

Nie wiem dlaczego tamto nie działa ale nieprawda że aplikacja tylko podczas odtwarzania dźwięku znajduje się w mikserze bo można ją samemu dodać w dowolnym momencie:

var
  DefaultDevice: IMMDevice;
  DeviceEnumerator: IMMDeviceEnumerator;
  SessionManager : IAudioSessionManager;
  SessionControl : IAudioSessionControl;
  SimpleAudio: ISimpleAudioVolume;
  hr: Integer;
  VolumeLevel: Single;
begin
  VolumeLevel:= 0.5; //moze być od 0.0 do 1.0
  hr:= CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
  if Succeeded(hr) then
  begin
    hr:=  DeviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, DefaultDevice);
    if Succeeded(hr) then
    begin
      hr:= DefaultDevice.Activate(IID_IAudioSessionManager, CLSCTX_ALL, nil, IUnknown(SessionManager));
      if Succeeded(hr) then
      begin
        hr:= SessionManager.GetAudioSessionControl(@GUID_NULL, 0, SessionControl);
        if Succeeded(hr) then
        begin
          hr:= SessionControl.SetDisplayName('Test :)', nil);
          if Succeeded(hr) then
          begin
            hr:= SessionControl.QueryInterface(IID_ISimpleAudioVolume, SimpleAudio);
            if Succeeded(hr) then
            begin
              SimpleAudio.SetMasterVolume(VolumeLevel, nil);
              SimpleAudio.GetMasterVolume(VolumeLevel);
              Caption:= FloatToStr(VolumeLevel);
              //SimpleAudio.SetMute(True, nil);
            end;
          end;
        end;
      end;
    end;
  end;
end;
0

Fajnie, przetestuje to później, kiedy będę w domu. A umiałbyś to ewentualnie dodatkowo przerobić pod kątem ustawiania dla konkretnego PId'u? Przyszłościowo by się przydało za pewne. A nie wiem czy zapożyczenia z kodu tamtej funkcji się powiodą.

Poza tym jestem ciekaw jak będzie pod Windowsem XP. Bo mam kod pod niego na globalne regulowanie dźwięku, jednak googlując sporo za przykładami kodów, widziałem jakiś moduł z dwoma klasami podczepioną pod dziediczącą z nich i sprawdzającą czy użyć kodu dla XP czy nowszych systemów.

0

kAzek to wiesz mozę jak wyciszyć dźwięk w "mojej" aplikacji?..bo już sił do tego nie mam.. zaznaczam że mam WindowsaXP..

1

@olesio z tego co wiem pod XP chyba nie da się zrobić osobnej regulacji dla danej aplikacji a co do konkretnego PID nie jestem pewien ale chyba trzeba by się dobrać do IAudioSessionControl2 (jak będę miał wolną chwilę to się pobawię ale nie gwarantuję że się uda).
@Piga na Vista+ to mój przykład jest praktycznie gotowcem tylko trzeba SetMute a na XP to jak napisałem wyżej chyba nie można dla aplikacji.

0

@kAzek: ok, dzięki. Jak coś jeszcze wykombinujesz to daj znać. Póki co zatwierdzam Twoją odpowiedź, ponieważ robi to co chciał pytający. A da się to zrobić jak oboje podejrzewamy tylko pod nowsze OS'y.

@Piga: może czegoś nie doczytałem, ale nie wiedziałem, że cały czas chodzi o XP. Według mnie też się nie da. Bo wystarczy porównać jak wyglądają standardowe ustawienia głośności pod oboma systemami. Pod XP regulujesz globalnie. Według mnie też się nie da nic zrobić dla konkretnej aplikacji.

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