2010-10-21 20 views
12

Fondamentalmente, quello di cui ho bisogno è un modo per attingere all'uscita audio corrente e controllare il livello del suono, cioè devo essere in grado di verificare se c'è qualcosa che sta suonando sul dispositivo audio o meno.Come ottenere a livello di programmazione il livello audio corrente?

Non è necessario controllare l'impostazione del volume, ma il livello sonoro del flusso audio in riproduzione reale.

dispiace, mi è stato chiesto su come farlo in Windows, su Visual Studio 2008.

@mikerobi: che forma una parte del mio ragionamento - se viene visualizzata sul misuratore di volume di sistema, ci deve essere una chiamata di sistema che può riaverla

+0

Non capisco le risposte negative, sicuramente c'è un modo per vedere quale audio viene riprodotto? Non so se sarà facile estrarre e informazioni utili da quel flusso ma questi commenti non puntano il poster nella giusta direzione. –

+0

+1, ora che la piattaforma è menzionata. A partire da Windows Vista/7, abbiamo le [API Core Audio] (http://msdn.microsoft.com/en-us/library/dd370784%28VS.85%29.aspx), ma ho certamente mai usato 'em Proviamo a taggare questo 'windows-api' e vediamo chi disegniamo.:) –

+0

Forse puoi trovare qualcosa qui http://www.dreamincode.net/forums/topic/45693-controlling-sound-volume-in-c%23/#/ – BrunoLM

risposta

2

Questa è una buona domanda. La risposta, per le applicazioni Windows a 32 bit, consiste nel collegarsi a winmm.dll e ad altre DLL di controllo audio di basso livello. In C# mi piacerebbe creare una classe wrapper che contiene il metodo extern prototipi:

public class MyAudioWrapper 
{ 
    [DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")] 
    public extern void GetWaveVolume(IntPtr devicehandle, out int Volume); 

    ... 
} 

Dai un'occhiata alla this link per un elenco di metodi di audio di Windows; puoi usare il mixer, o solo il controller wave-out, per impostare il volume. Quello che vuoi usare determinerà quali librerie importare. Dovrai cercare il modo migliore per definire il prototipo e come ottenere l'handle per il dispositivo audio/mixer.

+1

La migliore risposta per Vista e oltre è quella di aprire un flusso audio in modalità loopback e catturare da esso. –

2

Ecco un link utile per invocazioni di API di Windows, e qui è esattamente quello che stai cercando:

http://www.pinvoke.net/default.aspx/winmm.waveOutGetVolume


Poiché il requisito cambiato e non è necessario il livello audio Suggerisco il seguente potrebbe aiutare:

Penso che sia necessario leggere ciò che viene riprodotto sul flusso di output e analizzando i dati in alcuni algoritmi che si potrebbero decidere in base alle condizioni meteorologiche durante la riproduzione o meno. Per fare questo è necessario l'API MMDevice

http://msdn.microsoft.com/en-us/library/dd316556(v=VS.85).aspx

Io non voglio discorage voi, ma credetemi questo non sarà facile da realizzare se non si ha familiarità con il codice non gestito.

  • Devi riempire molte strutture in ogni chiamata.
  • È necessario eseguire invocazioni in ordine specifico.
  • Riferimenti di marshalling a strutture.

E anche se si ottiene ciò non è possibile anticipare il comportamento di esito del dispositivo. Buona fortuna.

Problemi correlati