gpt4 book ai didi

c# - Windows 8 xaudio2 在多点触控应用程序中播放 wav 文件

转载 作者:行者123 更新时间:2023-12-03 00:45:08 25 4
gpt4 key购买 nike

我正在学习如何使用 xAudio2。在 Visual Studio 2012 Express For Windows 8 中制作了一个简单的应用程序 Windows 8。
简单的 xAudio2 播放器类:

public class SoundEffect 
{
readonly XAudio2 _xaudio;
readonly WaveFormat _waveFormat;
readonly AudioBuffer _buffer;
readonly SoundStream _soundstream;
SourceVoice sourceVoice;

public SoundEffect(string soundFxPath)
{
_xaudio = new XAudio2();
var masteringsound = new MasteringVoice(_xaudio);

var nativefilestream = new NativeFileStream(
soundFxPath,
NativeFileMode.Open,
NativeFileAccess.Read,
NativeFileShare.Read);

_soundstream = new SoundStream(nativefilestream);
_waveFormat = _soundstream.Format;
_buffer = new AudioBuffer
{
Stream = _soundstream.ToDataStream(),
AudioBytes = (int)_soundstream.Length,
Flags = BufferFlags.EndOfStream
};
//sourceVoice = null;


}

public void Play()
{
sourceVoice = new SourceVoice(_xaudio, _waveFormat, true);

if (sourceVoice != null)
{
sourceVoice.FlushSourceBuffers();
sourceVoice.SubmitSourceBuffer(_buffer, _soundstream.DecodedPacketsInfo);

sourceVoice.Start();
}
}
public void Stop()
{
sourceVoice.Stop();
}
}

和 Xaml:
<Border Background="Gray" MinHeight="150" MinWidth="150" Margin="10,10,0,0" x:Name="A"  PointerPressed="btnAPointerPressed" PointerReleased="btnAPointerReleased" />

enter image description here

和:
private SoundEffect shotEffect = new SoundEffect(@"sounds\mywav.wav");
private void btnAPointerPressed(object sender, PointerRoutedEventArgs e)
{
bool _hasCapture = ((Border)sender).CapturePointer(e.Pointer);
shotEffect.Play();
}

private void btnAPointerReleased(object sender, PointerRoutedEventArgs e)
{
((Border)sender).ReleasePointerCapture(e.Pointer);
shotEffect.Stop();
}

在 Windows 8 模拟器中测试。
如果我按一根手指,那么一切都很好。
当我点击按钮时——放开手指时会播放声音——声音停止。

enter image description here

如果我用两根手指单击并松开两根手指,声音会继续播放。结果是混叠。

enter image description here

调用了两个事件:btnAPointerPressed 和两个事件:btnAPointerReleased 但声音继续播放。好像音频流卡住并继续播放。好像音频流卡住并继续播放。
我想了解问题 hadio2?或者我没有正确地做某事?

最佳答案

当您调用 Play()再次 - 上一个 SourceVoice在您的 SoundEffect 中被替换为新的,但你永远不会停止旧的。您应该为每次触摸创建一个新的 SourceVoice,但要让它们都与指针 ID 相关联,以便我们可以在释放关联的指针时停止它们中的每一个。

关于c# - Windows 8 xaudio2 在多点触控应用程序中播放 wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28134359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com