public CarenResult IniciarCapturaDados() { //Variavel que vai retornar o resultado. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); //Define o volume de captura do volume. Resultado = myCaptureAudio.AudioCaptureVolume.SetMasterVolume(1.0f, 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 definir o volume de captura do dispositivo. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Cria a task responsável pela captura dos dados do dispositivo. Task_ReadDataDispositivo = new Task(async() => { //Define que está capturando dados. StatusCapturandoDados = true; //Variavies utilizadas. uint OutNextPacketSize = 0; uint SizeInBytesBuffer = 0; uint OutFramesReaded = 0; CA_AUDIOCLIENTE_BUFFERFLAGS FlagsBuffer = CA_AUDIOCLIENTE_BUFFERFLAGS.Zero; ICarenBuffer BufferSilence = new CarenBuffer(); //Define que essa thread deve ter uma latencia menor. WinFuncs._AvSetMmThreadCharacteristicsW(CA_Windows_MMCSS_Multimedia_Name_Tasks.Pro_Audio, out uint OutTaskIndex); //Define a TaskIndex na estrutura myCaptureAudio.TaskIndex = OutTaskIndex; //Abre o laço que vai ficar capturando os dados. while (StatusCapturandoDados) { //Chama o método para recuperar a quantidade de frames do proximo pacote. Resultado = myCaptureAudio.AudioCapture.GetNextPacketSize(out OutNextPacketSize); //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 obter o tamanho do proximo pacote de dados do dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do laço break; } //Abre um laço que vai ler todos os dados disponiveis do pacote atual e enviar para o escritor. while (OutNextPacketSize != 0) { //Chama o método para ler os dados do dispositivo. Resultado = myCaptureAudio.AudioCapture.GetBuffer( out myCaptureAudio.BufferCapturedAudio, out OutFramesReaded, out FlagsBuffer, out _, out _); //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 caturar os dados disponiveis no dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do laço break; } //Define o tamanho do buffer lido do dispositivo. SizeInBytesBuffer = OutFramesReaded * myCaptureAudio.FrameSize; //Verifica os Flags do buffer. if ((FlagsBuffer & CA_AUDIOCLIENTE_BUFFERFLAGS.AUDCLNT_BUFFERFLAGS_SILENT) != 0) { //Cria o buffer do tamanho dos dados capturados. BufferSilence.CreateBuffer(SizeInBytesBuffer); //Preenche o buffer com zeros. BufferSilence.FillBuffer(); //Envia o buffer para o escritor de dados. EnviarAmostra(ref BufferSilence, SizeInBytesBuffer); //Libera a memória utilizada pelo buffer de silencio. BufferSilence.ReleaseBuffer(); } else { //Define as informações no buffer capturado. myCaptureAudio.BufferCapturedAudio.TamanhoValido = SizeInBytesBuffer; myCaptureAudio.BufferCapturedAudio.Tamanho = SizeInBytesBuffer; myCaptureAudio.BufferCapturedAudio.SetPosition(0); //Envia o buffer para o escritor de dados. EnviarAmostra(ref myCaptureAudio.BufferCapturedAudio, SizeInBytesBuffer); } //Chama o método para liberar o buffer. Resultado = myCaptureAudio.AudioCapture.ReleaseBuffer(OutFramesReaded); //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 liberar o buffer capturado anteriormente. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do laço break; } //Incrementa a quantidade de dados capturados. MyHeaderInfoFile.TotalLenghtCaptured += SizeInBytesBuffer; //Chama o método para recuperar a quantidade de frames do proximo pacote. Resultado = myCaptureAudio.AudioCapture.GetNextPacketSize(out OutNextPacketSize); //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 obter o tamanho do proximo pacote de dados do dispositivo de captura. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do laço break; } } //Zera o tamanho do pacote. OutNextPacketSize = 0; //Faz um pequeno delay. await Task.Delay(5); } }); //Define um tempo menor para o delay do sistema. WinFuncs._TimeBeginPeriod(5); //Chama o método para iniciar o dispositivo de captura para obter os dados. Resultado = myCaptureAudio.AudioClientConfig.Start(); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao solicitar que o dispositivo de captura inicie a captura dos dados. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Inicia a task de captura. Task_ReadDataDispositivo.Start(); Done :; //Retorna o resultado. return(Resultado); }