2015-01-25 9 views
0

xAudio2를 사용하는 방법을 배우고 있습니다.Windows 8 xaudio2 멀티 터치 응용 프로그램에서 wav 파일 재생

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(); 
    } 
간단한 응용 프로그램 윈도우 8 비주얼 스튜디오 2012 익스프레스 윈도우 8 간단한 xAudio2 플레이어 클래스 제작

Windows 8 Simulator에서 테스트되었습니다. 손가락 하나만 누르면 모든 것이 정상입니다. 버튼을 클릭하면 손가락을 놓을 때 소리가납니다. 소리가 멈 춥니 다. 나는 두 손가락으로 클릭하고 두 손가락을 놓아 경우

enter image description here

는 소리가 계속 재생됩니다. 결과는 앨리어싱입니다.

enter image description here

라는 두 개의 이벤트 : btnAPointerPressed과 두 개의 이벤트 : btnAPointerReleased하지만 소리가 계속 재생됩니다. 마치 오디오 스트림이 멈추고 계속해서 재생됩니다. 마치 오디오 스트림이 멈추고 계속해서 재생됩니다. 문제를 이해하고 싶습니다. haudio2? 아니면 내가 제대로 한게 아니야?

답변

1

Play()에 다시 전화 할 때 이전 SourceVoiceSoundEffect에서 새 것으로 바뀌지 만 이전 전화는 중지하지 않습니다. 터치 할 때마다 새 소스 보이스를 만들어야하지만 포인터가 모두 해제 될 때 각 포인터를 중지 할 수 있도록 포인터 ID와 연관된 모든 소스 보이스를 만들어야합니다.