2012-08-25 16 views
6

Tengo una aplicación que tiene sonido. Tengo una propiedad global para silenciar el sonido. El problema es que hay muchas cosas diferentes que pueden hacer que el sonido, me gustaría iterar a través de diferentes tipos de clase y silenciar/activar el sonido. En cambio, estoy buscando una manera de silenciar el sonido en un nivel de aplicación global. No me refiero a silenciar todo el volumen del sistema tampoco.¿Cómo silenciar el sonido de mi aplicación?

Un escenario: en Windows 7, puede abrir el Mezclador de volumen y ajustar el volumen de las aplicaciones individuales. Si bien no pretendo cambiar este valor particular real (ya que sé que es específico de Windows 7), me gustaría cambiar el volumen de todo en mi aplicación de una sola vez. También necesitaría la capacidad de silenciar por completo el sonido de todo en mi aplicación. Necesito esta capacidad para ser compatible con Windows XP y superior. Supongo que implicará llamadas a la API de Windows, pero no tengo idea de qué llamadas hacer.

+0

Tener un vistazo a esta pregunta: http://stackoverflow.com/questions/1092466/windows-xp-mute-unmute-audio-in-programmatically-in-python – Sebi

+3

por lo que recuerdo, XP no tenía nivel de sonido por aplicación. Tendrás una API de salida de sonido central en tu aplicación y alternarás si la dejas salir a la API de Windows o si simplemente ignoras y eliminas –

+1

WinXP no tiene capacidades de control de sonido por aplicación. Esto se agregó en Vista, y usa una API totalmente nueva (nueva) para hacerlo, con nuevas interfaces agregadas para admitirlo. Larry Osterman (uno de los veteranos de MS) tenía una serie sobre las nuevas API de sonido en su blog; No tengo un enlace en esta máquina, pero debería poder encontrarlo buscando en Google. Hay publicaciones sobre esto en SO en C/C++ Recuerdo haberlo visto hace un tiempo; Veré si puedo encontrar un término de búsqueda para que lo use para encontrarlos. –

Respuesta

3

Lo que estás pidiendo no es posible en XP; el sistema operativo simplemente no admite niveles de volumen por aplicación.

Puede lograr lo que desea creando una clase de configuración que guarde cosas como SoundActive: Boolean o PlaySounds: Boolean o algo similar. Colóquelo en su propia unidad, y tenga una sección de inicialización que cree una instancia de la misma y una sección de finalización que la libere (convirtiéndola efectivamente en una colección de valores globales).

Cada unidad que necesita acceso a estos ajustes simplemente usa la unidad que los contiene y ajusta el comportamiento en consecuencia. Así que cada una de sus clases hijas o formas o lo que sea solo necesitaría un cheque añadido:

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

La clase ajustes también pueden contener métodos que hacen un seguimiento del nivel de volumen actual (en XP, el nivel de todo el sistema), y métodos para aumentar o disminuir el volumen utilizando las funciones de volumen MMSystem (hay muchos ejemplos aquí y a través de Google de hacerlo). Luego, su aplicación puede usar los eventos OnActivate y OnDeactivate para establecer el nivel de volumen cuando su aplicación se enfoca y restaurarlo al volumen adecuado cuando la aplicación pierde el foco.

En Vista y superior, puede utilizar la interfaz de IAudioEndPointVolume he mencionado anteriormente y cualquiera de los GetMasterVolumeLevel o SetMasterVolumeLevel métodos para controlar todo el sistema de volumen (Tengo un ejemplo de hacer esto, junto con los MMDevAPI definiciones de interfaz apropiados) o nivel de dispositivo volumen (usando IMMDevioce.Activate para seleccionar primero el dispositivo adecuado y luego los métodos IAudioEndPointVolume de arriba en la interfaz del dispositivo recibidos de IMMDevice.Activate en el parámetro ppInterface).

Para aplicaciones individuales, se utiliza la interfaz ISimpleAudioVolume, que tiene cuatro métodos: GetMasterVolume y SetMasterVolume, que controlan el nivel de volumen para la sesión de audio de su aplicación, y GetMute y SetMute que le permite recuperar el valor del indicador de silencio actual o establecer es respectivamente (Larry Osterman de MS, que fue uno de los desarrolladores que trabajó en el nuevo soporte de audio en Vista y Win7, tiene un gran starting point article en su blog sobre los tipos de audio en la nueva API y cuándo usar cada uno de ellos.)

Es conceptualmente posible determinar en tiempo de ejecución del sistema operativo que esté utilizando y para cambiar mediante programación entre el uso de la funcionalidad MMSystem en XP y anteriores, y la funcionalidad MMDevAPI en Vista y superior. Sin embargo, esperar que alguien aquí proporcione el código para hacerlo es un poco irracional. Los enlaces que he proporcionado deberían ayudarlo a comenzar por el camino correcto, y cuando se topa con inconvenientes en el camino, la ayuda específica para resolver esos inconvenientes sería una gran pregunta.

4

XP no es compatible con el control de volumen por aplicación. Esa capacidad se agregó en Vista. Entonces, lo que estás intentando hacer no se puede hacer en XP de manera justa.

Hay un software llamado IndieVolume que retro ajusta el control de volumen por aplicación a XP. Solo puedo imaginar que lo hace por medio de pirateo de bajo nivel, inyección de DLL, etc. Dudo que sea realmente una opción para ti.

Cuestiones relacionadas