Obter o volume do som master em c #

Eu preciso para obter o volume atual da saída para a placa de som.

Alguma idéia de como?

Você pode obter esses valores usando IAudioMeterInformation nas APIs CoreAudio no Vista e no Win 7.

Os wrappers gerenciados estão disponíveis no NAudio (obtenha o AudioMeterInformation no MMDevice).

static int PlayerVolume() { RecordPlayer rp = new RecordPlayer(); rp.PlayerID = -1; int playerVolume = rp.PlayerVolume; return playerVolume; } 

do volume do microfone modificado no artigo c #

Procure nas informações do MSDN por:

  • IMMDeviceCollection, IMMDevice e IAudioEndpointVolume (somente Windows Vista, Windows 7).
  • mixerGetNumDevs, mixerGetLineControls, …

Esta é uma informação “comum”. É possível que o C # tenha formas mais convenientes (não sei).

Eu resolvi isso quando estava trabalhando em um aplicativo (ainda a ser lançado …) que inicia algum tipo de “música de elevador” quando nenhum outro som está presente.

Seguindo as dicas shinys de Mark Heath, consegui o que queria:

  using NAudio.CoreAudioApi; MMDeviceEnumerator devEnum = new MMDeviceEnumerator(); MMDevice defaultDevice = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); string currVolume = "MasterPeakVolume : " + defaultDevice.AudioMeterInformation.MasterPeakValue.ToString(); 

Talvez o winmm.dll possa ajudá-lo:

De EDDYKT (VB):

 Private Const HIGHEST_VOLUME_SETTING = 100 '% Private Const AUX_MAPPER = -1& Private Const MAXPNAMELEN = 32 Private Const AUXCAPS_CDAUDIO = 1 ' audio from internal CD-ROM drive Private Const AUXCAPS_AUXIN = 2 ' audio from auxiliary input jacks Private Const AUXCAPS_VOLUME = &H1 ' supports volume control Private Const AUXCAPS_LRVOLUME = &H2 ' separate left-right volume control Private Const MMSYSERR_NOERROR = 0 Private Const MMSYSERR_BASE = 0 Private Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2) Private Type AUXCAPS wMid As Integer wPid As Integer vDriverVersion As Long szPname As String * MAXPNAMELEN wTechnology As Integer dwSupport As Long End Type Private Type VolumeSetting LeftVol As Integer RightVol As Integer End Type Private Declare Function auxGetNumDevs Lib "winmm.dll" () As Long Private Declare Function auxGetDevCaps Lib "winmm.dll" Alias "auxGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As AUXCAPS, ByVal uSize As Long) As Long Private Declare Function auxSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long Private Declare Function auxGetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByRef lpdwVolume As VolumeSetting) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) Private Function nSigned(ByVal lUnsignedInt As Long) As Integer Dim nReturnVal As Integer ' Return value from Function If lUnsignedInt > 65535 Or lUnsignedInt < 0 Then MsgBox "Error in conversion from Unsigned to nSigned Integer" nSignedInt = 0 Exit Function End If If lUnsignedInt > 32767 Then nReturnVal = lUnsignedInt - 65536 Else nReturnVal = lUnsignedInt End If nSigned = nReturnVal End Function Private Function lUnsigned(ByVal nSignedInt As Integer) As Long Dim lReturnVal As Long ' Return value from Function If nSignedInt < 0 Then lReturnVal = nSignedInt + 65536 Else lReturnVal = nSignedInt End If If lReturnVal > 65535 Or lReturnVal < 0 Then MsgBox "Error in conversion from nSigned to Unsigned Integer" lReturnVal = 0 End If lUnsigned = lReturnVal End Function Private Function lSetVolume(ByRef lLeftVol As Long, ByRef lRightVol As Long, lDeviceID As Long) As Long Dim Volume As VolumeSetting, lBothVolumes As Long Volume.LeftVol = nSigned(lLeftVol * 65535 / HIGHEST_VOLUME_SETTING) Volume.RightVol = nSigned(lRightVol * 65535 / HIGHEST_VOLUME_SETTING) 'copy our Volume-variable to a long CopyMemory lBothVolumes, Volume.LeftVol, Len(Volume) 'call the SetVolume-function lSetVolume = auxSetVolume(lDeviceID, lBothVolumes) End Function Private Sub Form_Load() 'KPD-Team 2000 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net Dim Volume As VolumeSetting, Cnt As Long, AC As AUXCAPS 'set the output to a persistent graphic Me.AutoRedraw = True 'loop through all the devices For Cnt = 0 To auxGetNumDevs - 1 'auxGetNumDevs is zero-based 'get the volume auxGetVolume Cnt, Volume 'get the device capabilities auxGetDevCaps Cnt, AC, Len(AC) 'print the name on the form Me.Print "Device #" + Str$(Cnt + 1) + ": " + Left(AC.szPname, InStr(AC.szPname, vbNullChar) - 1) 'print the left- and right volume on the form Me.Print "Left volume:" + Str$(HIGHEST_VOLUME_SETTING * lUnsigned(Volume.LeftVol) / 65535) Me.Print "Right volume:" + Str$(HIGHEST_VOLUME_SETTING * lUnsigned(Volume.RightVol) / 65535) 'set the left- and right-volume to 50% lSetVolume 50, 50, Cnt Me.Print "Both volumes now set to 50%" 'empty line Me.Print Next End Sub 

Ou talvez isso: http://blackbeltvb.com/index.htm?free/mcisamp.htm

Verifique este código do projeto de código: Medidor de volume de estilo de LED usando o DirectX

Este artigo serve como um manual de uso para um UserControl que criei chamado AnalogSignalMeter. Esse controle usa o Direct3D para pintar o controle e o DirectSound para amostrar o sinal de áudio.

Tem um object AnalogSignalMeter, que é triggersdo um evento que relatará o nível atual de alto-falante esquerdo e direito.

Eu não acredito que haja uma maneira fácil de obter o pico atual no XP. MIXERCONTROL_CONTROLTYPE_PEAKMETER está presente, mas acredito que não seja suportado (está na minha máquina atual). Eu estou supondo que você terá criado seu próprio método de analisar a saída de áudio atual, dê uma olhada na seção DSP aqui .

Você pode apenas decidir em tempo de execução qual método você gostaria de usar, XP e Vista / 7 têm methods muito diferentes de lidar com o áudio. Algumas informações possivelmente úteis sobre esse assunto que escrevi anteriormente podem estar aqui.

A documentação do MSDN e o blog de Larry Osterman (ele também é membro do SO) são provavelmente as duas fonts mais úteis para a atual infraestrutura de áudio do Windows, na minha opinião.