C# 是否可以在UWP应用程序中提供原始音频(字节流)数据?

C# 是否可以在UWP应用程序中提供原始音频(字节流)数据?,c#,xamarin,audio,uwp,pcm,C#,Xamarin,Audio,Uwp,Pcm,我有一个自定义音频DAC设备。它内部有自己的控制器,知道如何处理特定的字节流。我正在尝试使用一个库: . 我在内存中生成一些数据,并按如下方式发送: private unsafe AudioFrame GenerateAudioData(byte[] data) { uint bufferSize = 7000000; AudioFrame frame = new Windows.Media.AudioFrame(bufferSize); using (AudioBuff

我有一个自定义音频DAC设备。它内部有自己的控制器,知道如何处理特定的字节流。我正在尝试使用一个库: . 我在内存中生成一些数据,并按如下方式发送:

private unsafe AudioFrame GenerateAudioData(byte[] data)
{
    uint bufferSize = 7000000;
    AudioFrame frame = new Windows.Media.AudioFrame(bufferSize);
    using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
    using (IMemoryBufferReference reference = buffer.CreateReference())
    {
        byte* dataInBytes;
        uint capacityInBytes;
        ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);
        for (int i = 0; i < bufferSize; i += 4)
        {
            dataInBytes[i] = data[i];
            dataInBytes[i + 1] = data[i + 1];
            dataInBytes[i + 2] = data[i + 2];
            dataInBytes[i + 3] = data[i + 3];
        }
    }
    return frame;
}
问题是我的流和物理设备接收到的数据并不完全相同。在声音上,它不明显,但我需要将相同的字节发送到端点设备。使用我没有这样的问题。另外,如果我能以独占方式访问我的设备会更好。系统声音/警报/通知与我的音频流混合是非常不可取的


提前谢谢

我注意到您的音频数据使用44.1 kHz采样率。许多音频设备支持48 kHz,这是用作设备混合格式的采样率。在这种情况下,AudioGraph将重新采样您的音频数据,以匹配混合格式,以便您的数据可以与系统声音和其他应用程序的声音混合

AudioGraph无法按原样将数据发送到音频设备,因为这需要以独占模式打开音频设备,这将阻止任何系统声音,干扰Cortana等。AudioGraph不支持以独占模式打开音频设备

作为一种可能的解决方法,如果您可以强制您的音频设备仅支持44.1 kHz,那么这将成为新的混合格式,并且AudioGraph不会对音频进行重新采样。某些音频设备通过控制低级音频设置的属性页支持此功能。
另一个解决方法是使用IAudioClient API WASAPI以独占模式打开音频设备。

您可以使用WASAPI吗?UWP支持它,但可能不是100%您需要的功能?@PeterTorr MSFT我没有找到任何用于WASAPI的.NET包装器。这就是为什么我要用听力描记器。谢谢你们的重播。我安装了NAudio,它包含WASAPI的包装器API。它在UWP中正常工作。你知道如何让这样的东西将数据按原样发送到Android/iOS的音频设备吗?
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Other)
{
   EncodingProperties = AudioEncodingProperties.CreatePcm(44100, 2, 16),
   AudioRenderCategory = AudioRenderCategory.Other,
   DesiredRenderDeviceAudioProcessing = AudioProcessing.Raw
};