C# - NAudio - Как изменить частоту дискретизации на float[] во время чтения?

Я пишу свое первое звуковое приложение и часами пытаюсь изменить частоту кеширования звука. Я использую NAudio, и мне удалось изменить громкость, настроив метод Read() моего ISampleProvider.

Вот класс CachedSound:

public class CachedSound
{
    public float[] AudioData { get; private set; }
    public WaveFormat WaveFormat { get; set; }

    public CachedSound(string audioFileName)
    {
        using (var audioFileReader = new AudioFileReader(audioFileName))
        {
            WaveFormat = audioFileReader.WaveFormat;

            var wholeFile = new List<float>((int)(audioFileReader.Length / 4));
            var readBuffer = new float[audioFileReader.WaveFormat.SampleRate * audioFileReader.WaveFormat.Channels];
            int samplesRead;
            while ((samplesRead = audioFileReader.Read(readBuffer, 0, readBuffer.Length)) > 0)
            {
                wholeFile.AddRange(readBuffer.Take(samplesRead));
            }
            AudioData = wholeFile.ToArray();
        }
    }
}

А вот класс CachedSoundSampleProvider:

using NAudio.Wave;
using System;

public delegate void PlaybackEndedHandler();

public class CachedSoundSampleProvider : ISampleProvider
{
    public event PlaybackEndedHandler PlaybackEnded;
    private CachedSound cachedSound;

    private long _position;
    public long Position {
        get { return _position; }
        set { _position = value; }
    }

    private float _volume;
    public float Volume {
        get { return _volume; }
        set { _volume = value; }
    }

    private float _pitchMultiplicator;
    public float PitchMultiplicator
    {
        get { return _pitchMultiplicator; }
        set { _pitchMultiplicator = value; }
    }

    public WaveFormat OriginalWaveFormat { get; set; }

    public WaveFormat WaveFormat {
        get { return cachedSound.WaveFormat; }
    }

    //Constructeur
    public CachedSoundSampleProvider(CachedSound _cachedSound)
    {
        cachedSound = _cachedSound;
        OriginalWaveFormat = WaveFormat;
    }

    public int Read(float[] destBuffer, int offset, int numBytes)
    {
        long availableSamples = cachedSound.AudioData.Length - Position;
        long samplesToCopy = Math.Min(availableSamples, numBytes);

        //Changing original audio data samplerate
        //Double speed to check if working
        cachedSound.WaveFormat = new WaveFormat(cachedSound.WaveFormat.SampleRate*2, cachedSound.WaveFormat.Channels);
        Array.Copy(cachedSound.AudioData, Position, destBuffer, offset, samplesToCopy);

        //Changing Volume
        for (int i = 0; i < destBuffer.Length; ++i)
            destBuffer[i] *= (Volume > -40) ? (float)Math.Pow(10.0f, Volume * 0.05f) : 0;

        Position += samplesToCopy;
        if (availableSamples == 0) PlaybackEnded();
        return (int)samplesToCopy;
    }
}

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

Именно поэтому я попытался изменить это на оригинальных audioData.

Заранее спасибо за помощь!:)

0 ответов

Другие вопросы по тегам