/// <summary> /// Método responsável por criar e preparar o arquivo que vai receber os dados capturados do dispositivo de áudio. /// </summary> /// <param name="Param_Url">A url para o arquivo que será criado.</param> /// <returns></returns> public CarenResult CriarArquivoWav(String Param_Url) { //Variavel que vai retornar o resultado. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); //Variaveis ICarenBuffer BufferHeaderZero = null; ulong RefTotalWritten = 0; //Deleta o arquivo se ja existir. File.Delete(Param_Url); //Chama o construtor para criar o arquivo de destino. myCaptureAudio.StreamFile = new CarenStream(Param_Url, CA_STGMs.CA_STGM_READWRITE, CA_FILE_ATTRIBUTES.CA_FILE_ATTRIBUTE_NORMAL, true); //Verifica se não houve erro. if (myCaptureAudio.StreamFile is null) { //Define erro na operação. Resultado.AdicionarCodigo(ResultCode.ER_FAIL, false); //Sai do método. goto Done; } //Cria um buffer que vai conter o tamanho do HEADER do arquivo Wav, mais preenchidos com zero. BufferHeaderZero = new CarenBuffer(); BufferHeaderZero.CreateBuffer(MyHeaderInfoFile.HeaderSize); //Preenche o buffer com Zeros. BufferHeaderZero.FillBuffer(); //Escreve o tamanho do header no inicio do fluxo para poder reservar. Resultado = myCaptureAudio.StreamFile.Write(BufferHeaderZero, MyHeaderInfoFile.HeaderSize, ref RefTotalWritten); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao escrever o HEADER vazio no inicio do fluxo. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define sucesso na operação Resultado.AdicionarCodigo(ResultCode.SS_OK, true); Done :; //Retorna return(Resultado); }
public CarenResult ObterDispositivosCaptura() { //Variavel que vai retornar o resultado. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); //Cria o enumerador de dispositivos. myCaptureAudio.EnumeradorDispositivos = new CarenMMDeviceEnumerator(CA_CLSCTX.CLSCTX_INPROC_SERVER); //Cria a interface que vai conter a coleção de dispositivos. myCaptureAudio.ColecaoDispositivos = new CarenMMDeviceCollection(); //Chama o método para obter todos os dispositivos de captura. Resultado = myCaptureAudio.EnumeradorDispositivos.EnumAudioEndpoints(CA_EDataFlow.eCapture, CA_DEVICE_STATE_XXX.CA_DEVICE_STATE_ACTIVE, myCaptureAudio.ColecaoDispositivos); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao listar os dispositivos de captura disponiveis atualmente. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Obtém a quantidade de dispositivos disponiveis. Resultado = myCaptureAudio.ColecaoDispositivos.GetCount(out uint CountTotalDevices); //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 quantidade de disponiveis de captura obtidos. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define na propriedade na estrutura myCaptureAudio.CountDevicesCaptureCollection = CountTotalDevices; //Define sucesso na operação Resultado.AdicionarCodigo(ResultCode.SS_OK, true); Done :; //Retorna o resultado. return(Resultado); }
public CarenResult PararCapturaDados() { //Variavel que vai retornar o resultado. CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false); //Define para parar de capturar os dados. StatusCapturandoDados = false; //Aguarda um tempo até todos os dados tiverem sido escritos. while (Task_ReadDataDispositivo.Status == TaskStatus.Running) { WinFuncs.SleepNativo(100); } //Chama o método para parar o dispositivo de captura. Resultado = myCaptureAudio.AudioClientConfig.Stop(); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao pedir ao dispostivo de captura que parasse. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Aguarda o escritor de dados terminar de escrever todos os dados. while (ListaBuffersAudio.Count != 0) { WinFuncs.SleepNativo(100); } //Define para parar de escrveer dados. StatusGeral = false; StatusEscritorDados = false; //Faz um delay WinFuncs.SleepNativo(500); //Chama o método para finalizar a criação do arquivo. Resultado = FinalizarArquivoWav(); //Verifica se obteve sucesso if (Resultado.StatusCode != ResultCode.SS_OK) { //A operação falhou. //Mostra uma mensagem de erro. ShowMensagem( "Ocorreu uma falha ao terminar de definir os dados do header do arquivo final. Mensagem de erro -> " + Resultado.ObterMensagem((int)Resultado.HResult), true); //Sai do método goto Done; } //Define sucesso na operação. Resultado.AdicionarCodigo(ResultCode.SS_OK, true); //Reverte todas as informações. WinFuncs._AvRevertMmThreadCharacteristics(myCaptureAudio.HandleTaskPrioridade); WinFuncs._TimeEndPeriod(5); Done :; //Retorna o resultado. return(Resultado); }