NAudio играет 32-битную IEE с плавающей точкой - PullRequest
0 голосов
/ 10 октября 2018

У меня есть приложение, которое генерирует 32-разрядные числа с плавающей точкой (big endian).Если я записываю их в файл, а затем открываю их в Audacity, файл воспроизводится правильно.Я пытаюсь воспроизвести поток с помощью NAudio.Если я создаю WaveFormat из 24 тыс. Сэмплов, 32-битных и 2-х каналов, я слышу шум, хотя, поскольку это неправильный формат, поток, конечно, не рендерится, если я создаю правильный формат (IeeeFloatWave), то ничего не слышу ввсе.Я знаю, что сэмплы поступают правильно, так как я могу сохранить их на диск, но я просто не могу их воспроизвести.Кто-нибудь видит, что я делаю, что не так?

Обновлен и решен - изменение порядка байтов от маленького к большому в процедуре кормления

Преобразователь битов FloatTo16формат до воспроизведения

private bool _streamActive = false;
private BufferedWaveProvider bufferedWaveProvider = null;
private WaveFloatTo16Provider waveFloatTo16Provider = null;
private WaveOut waveOut = null;
private WaveFormat waveFormat=null;

// ProcessSound is fed incoming byte packets
// (28 bytes header plus 1024 bytes audio)
// by background thread
// Data is converted from little to big endian in background thread
public void ProcessSound(byte[] rxData)
{
    // get data length
    int datalen = rxData.Length;

    // check to activate player
    if (_streamActive == true)
    {
        // add samples to buffer ('28' allows for header information)
        bufferedWaveProvider.AddSamples(rxData, 28, datalen - 28);
        return;
    }

    // start it going
    waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(24000, 2);

    // create buffer to allow samples to be added
    bufferedWaveProvider = new BufferedWaveProvider(waveFormat);

    // convert from 32 bit float to 16 bit PCM
    waveFloatTo16Provider = new WaveFloatTo16Provider(bufferedWaveProvider);

    // add samples to buffer
    bufferedWaveProvider.AddSamples(rxData, 28, datalen - 28);

    // create waveOut player
    waveOut = new WaveOut();
    waveOut.Init(waveFloatTo16Provider);
    waveOut.Volume = 0.25f;
    waveOut.Play();

    // mark stream is active
    _streamActive = true;
}
...