2011-12-16 2 views
0

У меня есть ArrayList, который содержит множество звуковых файлов в качестве элементов. Цикл foreach выполняет итерацию этой коллекции и воспроизводит каждую ноту.Как играть во все музыкальные файлы, хранящиеся в ArrayList

Проблема в том, что при запуске программы воспроизводится только последняя нота, но при отладке она проходит через все элементы, и каждый из них воспроизводится.

Звук представлен как объект моего класса «MusicNote». Я не могу понять, в чем проблема, так как при отладке она работает отлично.

ответ

3

По http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspxplayer.Play() начинает новую нить, которая означает, что она возвращает задолго до того, воспроизведение файла закончена ...

Используйте player.PlaySync() вместо этого - либо в основном потоке или (так как он блокирует) на отдельном нить.

Примечание: при отладке многопоточных программ иногда ведут себя по-разному - особенно. когда вы проходите ...

+0

Спасибо, в этом была проблема! –

1

кажется, что причина в том, что на каждой итерации цикла вы устанавливаете файл, прежде чем он имеет шанс сыграть. Только последняя итерация имеет возможность загружать и воспроизводить.

Если вы хотите воспроизвести клипы одновременно, я думаю, вам нужно будет сделать это в нескольких потоках, где каждый поток воспроизводит клип.

Если вы хотите играть в нее последовательно, я бы посмотрел на создание плейлиста, а затем на загрузку.

2

Я выкопал через какой-то старый код и я реализовал это так (в WP7)

вы можете попробовать позвонить:

player.PlaySync(); 

Проблема заключается в том, что SoundPlayer.Play() является asynchronic, поэтому он не собирается блокировать ваш foreach.

+0

Спасибо, в этом была проблема! –

0

Вам нужно инициализировать выход, чтобы предотвратить пропущенное начало прогона. Я не уверен, как вы можете это сделать, несмотря на внешнюю среду движка игры. Возможно, вы могли бы добавить фальшивую заметку, чтобы соответствовать пробелу фиксированной длины или длины ошибки.

Надеюсь, это поможет! Я понимаю, что это не отличный ответ, но вы не можете обвинять парня за попытку права;)

P.S. Посмотрите на идею плейлистов-призраков, это хорошо

0

Сколько предметов находится в noteList? Что вы подразумеваете под «при отладке»? Что вы подразумеваете под «когда программа запущена»?

Кроме того, Play() асинхронно, поэтому я думаю, что все звуки воспроизводятся одновременно, поэтому кажется, что только один воспроизводится. Вместо этого вы можете позвонить PlaySync(). Однако он будет блокирован, поэтому вы можете сделать это в отдельном потоке.

+0

Спасибо, это была проблема! –

0

Что такое примечание? Что вы играете? Какие файлы они?

Возможно, вы вызываете игру, и она начинает воспроизводить первую ноту, но она не блокируется, переходит к следующей ноте, а первая заметка отменяется и так далее, пока последняя нота, которая разрешена потому что после него ничего не происходит. Поместите ожидание после игры, чтобы увидеть, если это проблема, если это нужно, вам нужно найти способ дождаться завершения записи, прежде чем переходить к следующему.