2013-08-29 4 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(); 
     } 
    ); 

РЕШЕНИЕ (в соответствии с ответом Filip в):

в классе страницы:

 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, хотя это может не дать желаемых результатов. Лучший способ - использовать XAudio2 либо напрямую, либо через SharpDX, если вы хотите избежать создания компонента C++/CX WinRT.

+0

Я уже создаю многоуровневые элементы управления MediaElement - см. Выше фрагмент кода. Я рассмотрю SharpDX, спасибо – swinefeaster

+1

MediaElement позволяет одновременно воспроизводить несколько звуковых дорожек с несколькими экземплярами элемента управления. Может быть, все нужно добавить в дерево пользовательского интерфейса? –

+0

На самом деле, это делает трюк! Странно, что есть требование добавить их к дереву. Будет обновлен мой вопрос выше с помощью кода решения. – swinefeaster

Смежные вопросы