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;
}