Я пытаюсь воспроизвести звук, полученный по сети, который поступает в виде массива шортов. Я пытаюсь сделать эту работу с объектом WaveOut из NAudio, но из того, что я смог найти, это работает только с байтом []. Итак, мои вопросы до сих пор:
- Можно ли воспроизводить звук с короткого [] вместо байта []?
- Если так, как это будет сделано?
Это немного, но сейчас у меня есть следующее (которое, очевидно, воспроизводит звук из байта []):
protected override void Write(VoiceSource source, VoicePacket packet)
{
if (connected)
{
try
{
dispatcher.Invoke((WriteCallback)provider.Write, packet.Data);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
Где WriteCallback
определяется как:
private delegate void WriteCallback(byte[] data);
Поставщик, которому я пишу, является реализацией интерфейса IWaveProvider
.
Редактировать
Я попробовал «хитрость», о которой говорил мне Марк, с моим Интерфейсом, похожим на это:
interface ISampleBuffer {
byte[] Bytes { get; set; }
short[] Shorts { get; set; }
}
И структура буфера выглядит следующим образом:
[StructLayout(LayoutKind.Explicit, Pack = 2)]
public struct SampleBuffer : ISampleBuffer
{
[FieldOffset(0)]
private byte[] bytes;
[FieldOffset(0)]
private short[] shorts;
public byte[] Bytes { get { return bytes; } set { bytes = value; } }
public short[] Shorts { get { return shorts; } set { shorts = value; } }
}
Я реализовал этот буфер следующим образом:
short[] audio = decoder.Decode(packet.Data);
buffer.Bytes = new byte[audio.Length * 2];
buffer.Shorts = audio;
dispatcher.Invoke((WriteCallback)provider.Write, buffer.Bytes);
Однако всякий раз, когда я запускаю эту настройку, в журналах появляется трассировка стека со следующим исключением:
Object of type 'System.Int16[]' cannot be converted to type 'System.Byte[]'.
Что-то не так с тем, как я это реализовал?