我正在将一些 C# Windows Phone 7 应用程序移植到 Windows 8。
手机应用程序使用 XNA音效从缓冲区播放任意声音。在最简单的情况下,我只需创建所需持续时间和频率的正弦波。持续时间和频率都可能有很大差异,因此我不想依赖 MediaElements(除非有某种方法可以改变基本文件的频率,但这只会帮助我生成单频)。
WinRT 中 XNA SoundEffectInstance 的等效项是什么?
我假设我需要使用 DirectX 来实现此目的,但我不确定如何从其他 C#/XAML 应用程序中实现此目的。我看过SharpDX,但它似乎没有我认为需要使用的 DirectSound、SecondaryBuffer、SecondaryBuffer 类。
我在上面做了一些假设。可能是我正在寻找错误的类,或者有一种完全独立的方法可以从 Windows 8 应用程序生成任意声音。
I found 使用 SharpDX 的 XAudio2 通过 AudioBuffer 播放 wav 文件的示例。这看起来很有希望,我只需要用生成的音频缓冲区替换本机文件流即可。
PM> 安装包 SharpDX
PM> 安装包 SharpDX.XAudio2
public void PlaySound()
{
XAudio2 xaudio;
MasteringVoice masteringVoice;
xaudio = new XAudio2();
masteringVoice = new MasteringVoice(xaudio);
var nativefilestream = new NativeFileStream(
@"Assets\SpeechOn.wav",
NativeFileMode.Open,
NativeFileAccess.Read,
NativeFileShare.Read);
var soundstream = new SoundStream(nativefilestream);
var waveFormat = soundstream.Format;
var buffer = new AudioBuffer
{
Stream = soundstream.ToDataStream(),
AudioBytes = (int)soundstream.Length,
Flags = BufferFlags.EndOfStream
};
var sourceVoice = new SourceVoice(xaudio, waveFormat, true);
// There is also support for shifting the frequency.
sourceVoice.SetFrequencyRatio(0.5f);
sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo);
sourceVoice.Start();
}