Audio 如何在winrt中播放重叠音频?

Audio 如何在winrt中播放重叠音频?,audio,windows-8,windows-runtime,Audio,Windows 8,Windows Runtime,我正在从wp8移植一个应用程序,它需要播放各种可能重叠的声音。到目前为止,我找到的唯一方法是使用MediaElement,但这不允许声音重叠 问题-播放重叠音频最简单和最好的音频引擎是什么?理想情况下,我需要一个如何做到这一点的小例子 我已经研究了WASAPI(),但它看起来不支持简单的播放 也许我可以把MediaFoundation打包,然后从winrt调用它?() 这是我现在的代码,但当我播放一个新的声音时,它会切断以前播放的声音,而不是混合它们 ThreadUtility.runO

我正在从wp8移植一个应用程序,它需要播放各种可能重叠的声音。到目前为止,我找到的唯一方法是使用MediaElement,但这不允许声音重叠

问题-播放重叠音频最简单和最好的音频引擎是什么?理想情况下,我需要一个如何做到这一点的小例子

我已经研究了WASAPI(),但它看起来不支持简单的播放

也许我可以把MediaFoundation打包,然后从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();
      }
    );
解决方案(根据菲利普的回答):

在page类中:

      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);
    }

最简单的方法是使用多个MediaElement控件,尽管这可能不会提供所需的结果。如果要避免创建C++/CX WinRT组件,最好的方法是直接或通过SharpDX使用XAudio2。

我已经在创建multile MediaElement控件了--请参阅上面的代码片段。我将看一看SharpDX,thanksMediaElement确实允许使用多个控件实例同时播放多个音频曲目。也许所有的都需要添加到UI树中?事实上,这确实可以做到!奇怪的是,需要将它们添加到树中。将用解决方案代码更新我上面的问题。
    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();
          }
        }
      }
    );