我正在将一些 C# Windows Phone 7 应用程序移植到 Windows 8。
手机应用程序使用 XNA SoundEffect从缓冲区播放任意声音。在最简单的情况下,我只需创建所需持续时间和频率的正弦波。持续时间和频率都可能有很大差异,所以我不想依赖 MediaElements(除非有办法改变基本文件的频率,但这只会帮助我生成单一频率)。
WinRT 中的 XNA SoundEffectInstance 等价物是什么?
我假设我需要为此使用 DirectX,但我不确定如何从其他 C#/XAML 应用程序中解决这个问题。我看过SharpDX,但它似乎没有我认为我需要使用的 DirectSound、SecondaryBuffer、SecondaryBuffer 类。
我在上面做了一些假设。可能是我正在寻找错误的类,或者有一种完全独立的方法可以从 Windows 8 应用程序生成任意声音。
我找到了一个使用 SharpDX 中的 XAudio2 通过 AudioBuffer 播放 wav 文件的示例。这似乎很有希望,我只需要用我生成的音频缓冲区替换本机文件流。
PM> 安装包SharpDX
PM> Install-Package 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();
}