2012-08-25 5 views
6

Ho un'applicazione che ha il suono. Ho una proprietà globale per silenziare il suono. Il problema è che ci sono così tante cose diverse che possono rendere il suono, odio iterare attraverso diversi tipi di classe e disattivare/riattivare il loro suono. Invece, sto cercando un modo per silenziare il suono a livello di applicazione globale. Non intendo anche smorzare l'intero volume del sistema.Come silenziare il suono della mia applicazione?

Uno scenario: in Windows 7, è possibile aprire il Mixer volume e regolare il volume delle singole applicazioni. Anche se non intendo cambiare questo valore particolare (come so che è specifico per Windows 7), vorrei cambiare il volume di tutto nella mia applicazione tutto in una volta. Avrei anche bisogno della capacità di disattivare completamente il suono di qualsiasi cosa nella mia applicazione. Ho bisogno di questa capacità per essere compatibile con Windows XP e versioni successive. Suppongo che coinvolgerà le chiamate API di Windows, ma non ho idea di quali chiamate effettuare.

+0

Date un'occhiata a questa domanda: http://stackoverflow.com/questions/1092466/windows-xp-mute-unmute-audio-in-programmatically-in-python – Sebi

+3

per quello che mi ricordo, XP non aveva livello sonoro per applicazione. Avresti alcune API di uscita audio centralizzate nell'applicazione e lì potrai attivare o disattivare l'API di Windows o semplicemente ignorare e disporre –

+1

WinXP non dispone di funzionalità di controllo audio per applicazione. Questo è stato aggiunto in Vista e utilizza un'API completamente nuova (nuova) per farlo, con nuove interfacce aggiunte per supportarlo. Larry Osterman (uno dei veterani della SM) aveva una serie sulle nuove API audio sul suo blog; Non ho un link ad esso su questa macchina, ma dovresti essere in grado di trovarlo con Google. Ci sono post su questo su SO in C/C++. Ricordo di aver visto anche un po 'di tempo fa; Vedrò se riesco a trovare un termine di ricerca da utilizzare per trovarli. –

risposta

3

Quello che stai chiedendo non è possibile su XP; il sistema operativo semplicemente non supporta i livelli di volume per applicazione.

È possibile ottenere ciò che si desidera creando una classe di impostazioni che mantenga le cose come SoundActive: Boolean o PlaySounds: Boolean o qualcosa di simile. Inseriscilo nella propria unità e disponi di una sezione di inizializzazione che ne crea un'istanza e una sezione di finalizzazione che la libera (rendendola efficacemente una raccolta di valori globali).

Ogni unità che deve accedere a queste impostazioni utilizza semplicemente l'unità che le contiene e regola il comportamento di conseguenza. Così ciascuna delle vostre classi figlie o forme o qualsiasi altra cosa avrebbe solo bisogno di un controllo aggiunto:

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

La classe impostazioni può anche contenere metodi che tengono traccia del livello di volume corrente (su XP, il livello a livello di sistema), e metodi per aumentare o diminuire il volume usando le funzioni di volume MMSystem (ci sono un sacco di esempi qui e tramite Google di farlo). La tua app può quindi utilizzare gli eventi OnActivate e OnDeactivate per impostare il livello del volume quando l'app diventa attiva e ripristinarla sul volume corretto quando l'app perde il focus.

In Vista e versioni successive, è possibile utilizzare l'interfaccia IAudioEndPointVolume ho menzionato in precedenza e sia le GetMasterVolumeLevel o SetMasterVolumeLevel metodi per controllare un'ampia volume di sistema (ho un esempio di fare questo, insieme con le appropriate MMDevAPI definizioni di interfaccia) o il livello di dispositivo volume (usando IMMDevioce.Activate per selezionare prima il dispositivo appropriato e poi i metodi IAudioEndPointVolume sopra l'interfaccia del dispositivo ricevuti da IMMDevice.Activate nel parametro ppInterface).

per le singole applicazioni, si utilizza l'interfaccia ISimpleAudioVolume, che ha quattro metodi: GetMasterVolume e SetMasterVolume, che controllano il livello di volume per la sessione audio della vostra applicazione, e GetMute e SetMute per consentire di recuperare l'attuale valore del flag mute o impostare rispettivamente. (Larry Osterman of MS, che era uno degli sviluppatori che ha lavorato al nuovo supporto audio in Vista e Win7, ha un ottimo starting point article sul suo blog sui tipi di audio nella nuova API e su quando utilizzare ciascuno di essi.

È concettualmente possibile determinare in fase di esecuzione quale sistema operativo si sta utilizzando e passare da una modalità di programmazione all'altra utilizzando la funzionalità su XP e versioni precedenti e la funzionalità MMDevAPI su Vista e versioni successive. Tuttavia, aspettarsi che qualcuno qui fornisca il codice per farlo è un po 'irragionevole. I link che ho fornito dovrebbero farti iniziare sulla strada giusta, e quando ti imbattono in ostacoli lungo il percorso l'aiuto specifico nel lavorare attraverso quegli ostacoli potrebbe essere una grande domanda.

4

XP non supporta il controllo del volume per applicazione. Questa funzionalità è stata aggiunta in Vista. Quindi quello che stai tentando di fare non può essere fatto in XP con mezzi equi.

C'è un software chiamato IndieVolume retro che si adatta al controllo del volume per-app su XP. Posso solo immaginare che lo faccia per mezzo di hacking di basso livello, l'iniezione di DLL e così via. Dubito che sia davvero un'opzione per te.