Как сделать аудио-визуализацию WaveOut в реальном времени с помощью SampleAggregator в NAudio - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь добавить визуализатор в качестве фона для своей игры, которую я создаю с помощью MonoGame для графики и ввода и NAudio для музыки. MonoGame не имеет визуализации, но я читал, что вы можете сделать это с помощью NAudio. Проблема в том, что, похоже, данные не обновляются регулярно, как должно быть.

Я скопировал SampleAggregator из AudioPlaybackDemo в WPFDemo и реализовал его с помощью функций событий и всего остального. Это выглядит хорошо, за исключением того, что, кажется, он обновляется только около 5 раз в секунду, в то время как остальная часть моей игры работает на скорости 60 кадров в секунду. Здесь - это видео, показывающее его.

Добавлено к событию FFTCalculated SampleAggregator:

private void SampleAggregator_FftCalculated(object sender, FftEventArgs e)
{
    if (done)
    {
        done = false;
        visQueue = (Complex[])e.Result.Clone();
    }
}

А для рисования делаю:

private void DrawVisualizer()
{
    spriteBatch.Begin();
    int count = visQueue.Length;
    for(int i = 0; i < visQueue.Length; i++)
    {
        int height = (int)((visQueue[i].Y + 1) * 25);
        spriteBatch.Draw(pix, new Rectangle((int)(GraphicsDevice.Viewport.Width * ((float)i / (float)count)), GraphicsDevice.Viewport.Height - height, GraphicsDevice.Viewport.Width / count, height), uiColor * 0.5f);
    }
    spriteBatch.End();
    done = true;
}

Переменная done только для того, чтобы убедиться, что список не меняется во время отрисовки. Когда я проверяю время, он говорит, что обновляет каждый кадр. Кроме того, мне нужно было проверить, не отличается ли массив между вызовами SampleAggregator_FftCalculated(), и у него было несколько сообщений об одном и том же.

Я бы ожидал, что он будет работать на скорости 60 кадров в секунду, но это не так. Есть идеи, почему это так?

Спасибо!

...