Я переношу приложение из 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();
}
}
}
);
Я уже создаю многоуровневые элементы управления MediaElement - см. Выше фрагмент кода. Я рассмотрю SharpDX, спасибо – swinefeaster
MediaElement позволяет одновременно воспроизводить несколько звуковых дорожек с несколькими экземплярами элемента управления. Может быть, все нужно добавить в дерево пользовательского интерфейса? –
На самом деле, это делает трюк! Странно, что есть требование добавить их к дереву. Будет обновлен мой вопрос выше с помощью кода решения. – swinefeaster