public CarenResult AtivarDispositivoCapturaByIndex(uint Param_IdDevice) { //Variavel que vai retornar o resultado. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); //Tenta recuperar o dispositivo de captura indicado pelo id. Resultado = myCaptureAudio.ColecaoDispositivos.Item(Param_IdDevice, out ICarenMMDevice OutDeviceCapture); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter o dispositivo de captura indicado pelo Id. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define o dispositivo de captura no membro da estrutura. myCaptureAudio.DispositivoCaptura = OutDeviceCapture; //Cria a interface que vai ser ativada. myCaptureAudio.AudioClientConfig = new CarenAudioClient(); //Tenta ativar o dispositivo. Resultado = OutDeviceCapture.Activate(GUIDs_InterfacesWASAPI.IID_IAudioClient, CA_CLSCTX.CLSCTX_INPROC_SERVER, null, myCaptureAudio.AudioClientConfig); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao tentar ativar o dispositivo selecionado. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Obtém o formato que o dispostivo de captura suporta Resultado = myCaptureAudio.AudioClientConfig.GetMixFormat(out CA_WAVEFORMATEXEXTENSIBLE OutWaveFormatCapture); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter o tipo de dados suportado pelo dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define na estrutura. myCaptureAudio.WavFormatCapture = OutWaveFormatCapture; //Calcula os dados do formato do áudio e define nas estruturas. myCaptureAudio.FrameSize = (uint)(OutWaveFormatCapture.Format.wBitsPerSample * OutWaveFormatCapture.Format.nChannels / 8); MyHeaderInfoFile.Canais = OutWaveFormatCapture.Format.nChannels; MyHeaderInfoFile.BitsPerSample = OutWaveFormatCapture.Format.wBitsPerSample; MyHeaderInfoFile.SampleRate = OutWaveFormatCapture.Format.nSamplesPerSec; MyHeaderInfoFile.BytesPerSec = OutWaveFormatCapture.Format.nSamplesPerSec * OutWaveFormatCapture.Format.wBitsPerSample * OutWaveFormatCapture.Format.nChannels / 8; MyHeaderInfoFile.BlockAlign = OutWaveFormatCapture.Format.nBlockAlign; MyHeaderInfoFile.FormatAudioData = (ushort)(OutWaveFormatCapture.SubFormato == GUIDs_MF_AUDIO_SUBTYPES.MFAudioFormat_PCM ? 0x0 : 0x0003); //0x0003 é o formato IEEE Float //Inicializa o dispositivo de captura. Resultado = myCaptureAudio.AudioClientConfig.Initialize( CA_AUDIOCLIENTE_SHAREMODE.AUDCLNT_SHAREMODE_SHARED, 0, REFTIMES_PER_SEC, 0, ref OutWaveFormatCapture, GUID_SESSION_AUDIO); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao tentar inicializar o dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Obtém o tamanho do buffer selecionado pelo dispositivo. Resultado = myCaptureAudio.AudioClientConfig.GetBufferSize(out uint OutBufferInFrames); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter o tamanho do buffer selecionado pelo dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define na estrutura, myCaptureAudio.BufferSizeInFames = OutBufferInFrames; //Inicializa a interface de captura que vai ser criada. myCaptureAudio.AudioCapture = new CarenAudioCaptureClient(); //Chama o método para obter a interface de captura de áudio. Resultado = myCaptureAudio.AudioClientConfig.GetService(GUIDs_InterfacesWASAPI.IID_IAudioCaptureClient, myCaptureAudio.AudioCapture); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter a interface responsável pela captura dos dados de áudio do dispositivo. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Inicializa a interface de controle de volume myCaptureAudio.AudioCaptureVolume = new CarenSimpleAudioVolume(); //Obtém a interface que controla o volume do áudio. Resultado = myCaptureAudio.AudioClientConfig.GetService(GUIDs_InterfacesWASAPI.IID_ISimpleAudioVolume, myCaptureAudio.AudioCaptureVolume); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter a interface de controle de volume do áudio. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } Done :; //Retorna o resultado. return(Resultado); }
public String ObterNomeDispositivoByIndex(uint Param_IdDevice) { //Variavel que vai retornar o resultado. String NomeDispositivo = string.Empty; //Variaveis utilizadas. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); CA_PROPERTYKEY PropKey = new CA_PROPERTYKEY() { GUIDProp = GUIDs_CoreAudio_Propriedades.PKEY_Device_FriendlyName, PID = GUIDs_CoreAudio_Propriedades.PID_Device_FriendlyName }; //Tenta recuperar o dispositivo de captura indicado pelo id. Resultado = myCaptureAudio.ColecaoDispositivos.Item(Param_IdDevice, out ICarenMMDevice OutDeviceCapture); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter o dispositivo de captura indicado pelo Id. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Chama o método para obter a loja de propriedades do dispositivo. Resultado = OutDeviceCapture.OpenPropertyStore(CA_STGMs.CA_STGM_READ, out ICarenPropertyStore OutPropStore); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Libera a referencia para o dispositivo de captura. OutDeviceCapture.LiberarReferencia(); OutDeviceCapture.Finalizar(); OutDeviceCapture = null; //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter a interface de propriedades do dispositivo. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Chama o método para obter o nome do dispositivo de captura. Resultado = OutPropStore.GetValue(ref PropKey, out CA_PROPVARIANT OutPropValor); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Libera a referencia para o dispositivo de captura. OutDeviceCapture.LiberarReferencia(); OutPropStore.LiberarReferencia(); OutDeviceCapture.Finalizar(); OutPropStore.Finalizar(); OutDeviceCapture = null; OutPropStore = null; //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao obter o nome do dispositivo.. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define o nome do dispositivo na variavel de retorno. NomeDispositivo = OutPropValor.pwszVal; //Libera as interfaces e dados. OutDeviceCapture.LiberarReferencia(); OutPropStore.LiberarReferencia(); OutDeviceCapture.Finalizar(); OutPropStore.Finalizar(); OutDeviceCapture = null; OutPropStore = null; OutPropValor = null; //Chama o GC. GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Done :; //Retorna o resultado. return(NomeDispositivo); }