Почему Byte [] передается в чтение (Buffer [] Buffer, Int Offset, Int Count) в моей реализации iSampleProvider?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему Byte [] передается в чтение (Buffer [] Buffer, Int Offset, Int Count) в моей реализации iSampleProvider?

Сообщение Anonymous »

Я использую Naudio для реализации системы воспроизведения звука, кэшированной в памяти, основанной на оригинальном CachedSound и CachedSoundSoundSoundSoundSoundSoundSoundSoundSoundSoundSamplePovider. Все работает, как и ожидалось при использовании 32-разрядных файлов IEEE Float WAV. public int Read(float[] buffer, int offset, int count)< /code>
Похоже, что вместо получения плавания [] метод неожиданно проходит байт [], что приводит к исключению времени выполнения. < /p>
Это код, который я попробовал: < /p>
CachedSound smallNowCached2 = new CachedSound(@"short녹음12.wav");
CachedSoundSampleProvider CachedsampleProvider = new CachedSoundSampleProvider(smallNowCached2);
CachedSound bigNowCached2 = new CachedSound(@"20241201120000_녹음12.wav");
CachedSoundSampleProvider CachedsampleProvider3 = new CachedSoundSampleProvider(bigNowCached2);

var concat2 = new myConcatenatingSampleProvider(new[] { CachedsampleProvider, CachedsampleProvider3 });

WasapiOut wasapiOut = new WasapiOut();
wasapiOut.Init(concat2);
wasapiOut.Play();
< /code>
Оригинальный CachedSound CachedSoundSampleProvider: < /p>
public class CachedSound
{
public float[] AudioData { get; private set; }
public WaveFormat WaveFormat { get; private set; }
public CachedSound(string audioFileName)
{
using (var audioFileReader = new AudioFileReader(audioFileName))
{
// TODO: could add resampling in here if required
WaveFormat = audioFileReader.WaveFormat;
var wholeFile = new List((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();
}
}
}

public class CachedSoundSampleProvider : ISampleProvider
{
private readonly CachedSound cachedSound;
private long position;

public CachedSoundSampleProvider(CachedSound cachedSound)
{
this.cachedSound = cachedSound;
}

public int Read(float[] buffer, int offset, int count)
{
var availableSamples = cachedSound.AudioData.Length - position;
var samplesToCopy = Math.Min(availableSamples, count);
Array.Copy(cachedSound.AudioData, position, buffer, offset, samplesToCopy);
position += samplesToCopy;
return (int)samplesToCopy;
}

public WaveFormat WaveFormat { get { return cachedSound.WaveFormat; } }
}
< /code>
Эта реализация отлично работает для аудиофайлов на основе плавучих, но сбой при использовании 16-битных WAVS.public class MyCachedSound
{
public float[] AudioData { get; }
public WaveFormat WaveFormat { get; }

public MyCachedSound(string audioFileName)
{
using (var reader = new AudioFileReader(audioFileName))
{
WaveFormat = reader.WaveFormat;
var buffer = new float[reader.WaveFormat.SampleRate * reader.WaveFormat.Channels];
var audioData = new List();
int read;
while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
for (int i = 0; i < read; i++)
audioData.Add(buffer);
}
AudioData = audioData.ToArray();
}
}
}

public class MyCachedSoundSampleProvider : ISampleProvider
{
private readonly MyCachedSound cachedSound;
private long position;

public WaveFormat WaveFormat => cachedSound.WaveFormat;

public int Read(float[] buffer, int offset, int count)
{
var samplesToCopy = Math.Min(cachedSound.AudioData.Length - position, count);
for (int i = 0; i < samplesToCopy; i++)
buffer[offset + i] = cachedSound.AudioData[position + i];
position += samplesToCopy;
return (int)samplesToCopy;
}
}
< /code>
Эта версия работает даже с 16-битными входными файлами PCM. < /p>
Мои вопросы:
Почему Byte [] передается в чтение (Buffer [], ...) в исходной реализации при использовании файлов PCM? Я ожидал, что только плавает [] на основе подписи метода. < /P>
Является ли мой обходной путь безопасен и формат-алкоголь? Будет ли он продолжать работать правильно для других глубин битов, таких как 24-битный PCM или 32-битный поплавок, или есть кромки, которые мне нужно знать?

Подробнее здесь: https://stackoverflow.com/questions/796 ... in-my-isam
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему оба Convert.ToInt32(Byte) и Convert.ToInt32(Byte[]) компилируются, но Convert.ToInt32(byte[]) выдает исключение в
    Anonymous » » в форуме C#
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать список[int, int, int] в кортеж[int, int, int], а не в кортеж[int, ...]
    Anonymous » » в форуме Python
    0 Ответы
    288 Просмотры
    Последнее сообщение Anonymous
  • Buffer Buffer Opengl Buffic
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Buffer Buffer Opengl Buffic
    Anonymous » » в форуме Linux
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Buffer Buffer Opengl Buffic
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»