Ejemplo n.º 1
0
        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);
        }