Как воспроизвести все музыкальные файлы, хранящиеся в ArrayList - PullRequest
0 голосов
/ 16 декабря 2011

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

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

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

Ответы [ 6 ]

3 голосов
/ 16 декабря 2011

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

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

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

2 голосов
/ 16 декабря 2011

Я копался в каком-то старом коде и реализовал его так (в WP7)

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

player.PlaySync();

Проблема в том, что SoundPlayer.Play () асинхронный, поэтому он не будет блокировать ваш foreach

1 голос
/ 16 декабря 2011

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

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

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

0 голосов
/ 16 декабря 2011

Что такое примечание?Что вы используете, чтобы играть?Что это за файлы?

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

0 голосов
/ 16 декабря 2011

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

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

0 голосов
/ 16 декабря 2011

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

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

PS Посмотрите на идею плейлиста Джейсона, это здорово

...