Захват аудиовхода с микрофона с помощью SlimDX - PullRequest
1 голос
/ 29 августа 2009

VS 2008 SlimDX март 2009

Я использую SlimDX для захвата входного аудио и отображения его в индикаторе выполнения. У меня есть фоновый работник, который будет делать захват в фоновом потоке и обновлять индикатор выполнения.

Однако я сталкиваюсь с проблемой того, какое значение использовать в качестве значения для обновления индикатора выполнения.

Все работает нормально, и начинается захват. Однако приложение не будет работать, когда я попытаюсь обновить индикатор выполнения.

РЕДАКТИРОВАТЬ ==== Я отредактировал мой код в DoWork. На этот раз, используя Int16, которые дают круглое число. Однако проблема, с которой я сталкиваюсь сейчас, состоит в том, что буфер переполнится. Есть ли в любом случае создать буфер контроллера, который, как только он дойдет до конца, запустится снова?

Есть предложения?

Большое спасибо,

 private DirectSoundCapture soundCapture;
        private WaveFormat wavFormat;
        private CaptureBufferDescription captureBufDescription;
        private CaptureBuffer captureBuff;

        // stopCapturing - flag to stop capturing
        bool stopCapturing = false;

        private void AudioCapture_Load(object sender, EventArgs e)
        {
            this.FillProperties();   
        }

        // Fill wave format properties
        private void FillProperties()
        {
            // Declare a wave audio format to use in getting the input.
            soundCapture = new DirectSoundCapture();

            // Wave Format
            wavFormat = new WaveFormat();
            // 
            wavFormat.FormatTag = SlimDX.WaveFormatTag.IeeeFloat;
            wavFormat.BitsPerSample = 32;
            wavFormat.BlockAlignment = (short)(wavFormat.BitsPerSample / 8);
            wavFormat.Channels = 1;
            wavFormat.SamplesPerSecond = 44100;
            wavFormat.AverageBytesPerSecond =
                wavFormat.SamplesPerSecond * wavFormat.BlockAlignment * wavFormat.Channels;

            // Capture buffer description
            captureBufDescription = new CaptureBufferDescription();
            // 
            captureBufDescription.ControlEffects = true;
            captureBufDescription.WaveMapped = true;
            captureBufDescription.BufferBytes = 8192;
            captureBufDescription.Format = wavFormat;

            captureBuff = new CaptureBuffer(soundCapture, captureBufDescription);   
        }

        // Run capture in background thread to keep the form active
        private void bgwAudioInput_DoWork(object sender, DoWorkEventArgs e)
        {
        Int16[] samples = new Int16[8192 / sizeof(Int16)];
        Int16 audioValue = 0;
        int i = 0;

        captureBuff.Start(true);

        while (captureAudio)
        {
            if (!this.bgwAudioInput.CancellationPending)
            {
                captureBuff.Read(samples, 0, true);
                audioValue = Math.Abs(samples[captureBuff.CurrentReadPosition]);
                this.bgwAudioInput.ReportProgress(audioValue);
            }
        }
        }

        // Start capturing the input audio from the microphone
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            btnStop.Enabled = true;

            this.bgwAudioInput.RunWorkerAsync();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            captureBuff.Stop();
            // Exit while loop
            this.bgwAudioInput.CancelAsync();
            stopCapturing = false;

            btnStop.Enabled = false;
            btnStart.Enabled = true;
        }

1 Ответ

0 голосов
/ 24 ноября 2010

Посмотрите на этот пример , может быть, он вам поможет.

...