2013-08-29 22 views
0

我移植從WP8需要的是可以重疊的各種聲音的回放的應用程序。我迄今發現它使用MediaElement的唯一方法,但這不允許重疊的聲音。如何在winrt中播放重疊音頻?

問題 - 什麼是用來玩重疊音頻的最簡單,最好的音頻引擎?理想情況下,我需要一個關於如何做到這一點的小例子。

我看着WASAPI(http://code.msdn.microsoft.com/windowsapps/Windows-Audio-Session-22dcab6b),但它並不像它支持簡單的再現?

也許我可以包裝MediaFoundation和WinRT的稱呼呢? (MediaEngine audio playback on WinRT

這是我現在的代碼,但是當我玩一個新的聲音它切斷之前打一個,而不是將它們混合。

ThreadUtility.runOnUiThread(
     async delegate() 
     { 
     // TODO doesn't allow sounds to overlap! 
     Uri uri = new Uri(R.base_uri, R.raw.URI_PREFIX + resourceId); 
     StorageFile storageFile = 
      await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(
      uri); 
     MediaElement element = new MediaElement(); 

     var randomAccessStream = await storageFile.OpenReadAsync(); 

     element.SetSource(randomAccessStream, storageFile.ContentType); 
     element.Volume = volume; 
     element.PlaybackRate = pitch; 
     //TODO element.Pan = pan; 
     element.Play(); 
     } 
    ); 

SOLUTION(根據菲利普的回答):

在頁面類

 var mediaElements = new LinkedList<MediaElement>(); 
     { 
     for (int channel = 0; channel < TeacherSoundGroover.NUM_CHANNELS; channel++) 
     { 
      var mediaElement = new MediaElement(); 
      mediaElements.add(mediaElement); 

      // Must be in the tree otherwise it won't overlap! 
      m_titlePanel.Children.Add(mediaElement); 
     } 
     } 
     m_soundPlayer = new MySoundPlayer(mediaElements); 
    } 
在MySoundPlayer類

ThreadUtility.runOnUiThread(
     async delegate() 
     { 
     Uri uri = new Uri(R.base_uri, R.raw.URI_PREFIX + resourceId); 
     StorageFile storageFile = 
      await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(
      uri); 

     if(m_mediaElements != null) 
     { 
      int count = m_mediaElements.size(); 
      if (count > 0) 
      { 
      int channel = m_nextMediaElementToUse % count; 
      m_nextMediaElementToUse++; 
      MediaElement element = m_mediaElements.get(channel); 

      var randomAccessStream = await storageFile.OpenReadAsync(); 

      element.Stop(); 
      element.DefaultPlaybackRate = rate; 
      element.SetSource(randomAccessStream, storageFile.ContentType); 
      element.Volume = volume; 
      element.Balance = pan; 
      element.Play(); 
      } 
     } 
     } 
    ); 

回答

2

做最簡單的事情是用多個MediaElement控件,儘管這可能不會給你想要的結果。如果您想避免創建C++/CX WinRT組件,最好的方法是直接或通過SharpDX使用XAudio2。

+0

我已經創建multile MediaElement的控制---看到上面的代碼片斷。我會看看SharpDX,謝謝 – swinefeaster

+1

MediaElement允許多個音軌同時播放多個控件實例。也許所有需要被添加到UI樹? –

+0

其實,這是否有竅門!奇怪的是需要將它們添加到樹中。將使用解決方案代碼更新我的問題。 – swinefeaster