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

Posted

技术标签:

【中文标题】Windows 8 xaudio2 在多点触控应用程序中播放 wav 文件【英文标题】:Windows 8 xaudio2 playing wav file in multitouch app 【发布时间】:2015-03-23 22:27:19 【问题描述】:

我正在学习如何使用 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" />

和:

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 模拟器中测试。 如果我按一根手指,那么一切都很好。 当我点击按钮时 - 当我松开手指时会播放声音 - 声音会停止。

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

调用了两个事件:btnAPointerPressed 和两个事件:btnAPointerReleased,但声音继续播放。好像音频流冻结并继续播放。好像音频流冻结并继续播放。 我想了解问题 hadio2?还是我做的不对?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Windows 8 xaudio2 在多点触控应用程序中播放 wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

gtkmm 多点触控设备无法识别 (Windows)

多点触控与多鼠标支持

USB HID多点触控串行报告

WPF学习第十八章 多点触控输入

Linux 上 Java 中的多点触控事件:来自操作系统的事件还是在应用程序中识别?

2021-09-20 WPF上位机 36-多点触控事件