Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }