Фоновая звуковая дорожка готова не работает должным образом Windows Phone 8
Я обнаружил странную проблему и постараюсь объяснить ее как можно короче.
ASSUMTIONS:
Насколько я знаю, когда вы устанавливаете новый AudioTrack в AudioPlayerAgent, две задачи ставятся в очередь: Stop() и TrackReady();. Кажется логичным и в большинстве случаев работает идеально. Но когда я работал с моей программой, я заметил, что иногда это не так хорошо:
ПРОБЛЕМА:
Поэтому я решил написать очень простой пример - вы можете получить его здесь. Есть только одна кнопка, которая вызывает BackgroundAudioPlayer.Instance.Play();. (Вы должны добавить только файл music.mp3 в этом примере - например, 5-6 Мб mp3-файла). В Audio Agent у меня есть:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
player.Track = myMusic.ReturnTrack();
break;
Я запускаю программу в режиме отладки на устройстве (WP8) и нажимаю кнопку воспроизведения. И затем я вижу, что в большинстве случаев OnPlayStateChanged в Audio Agent не запускается, и, глядя на процессы, я вижу, что у меня есть Headless 'Zombie'. Кажется, это тупик. (Кстати: в этом простом примере я не использую мьютексы или другие методы параллелизма). Странно (а может и нет) также то, что Stop () и TrackReady ожидают в очереди - если вы запускаете любой другой метод, который вызывает NotifyComplete(); Вы увидите, что очередь разблокирована.
Я пробовал Realese версию без отладки, и она работает лучше, НО - иногда происходит то же самое.
Если бы я только добавил:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Track = myMusic.ReturnTrack();
Thread.Sleep(100);
}
break;
все работает намного лучше
ЗАКЛЮЧЕНИЕ:
Мне кажется, что загрузка новой дорожки работает асинхронно, и NotifyComplete () вызывается до загрузки дорожки - что создает этот процесс "безголовый зомби". Хуже всего то, что у вас есть ограниченное время на ожидание операции в очереди, после того, как она заканчивается, ваш агент убивается.
По моему мнению, это не должно так работать, так как установка новой дорожки является одной из основных функций.
Кто-нибудь знает что-нибудь об этой проблеме? Это ошибка или неправильное поведение ОС или мое отсутствие знаний?
1 ответ
Вы связали это неправильно - стоит попробовать проверить стандартную реализацию фонового аудиоагента и сравнить с этим. Основная проблема может заключаться в том, что вы пытаетесь изменить трек в OnUserAction.Play
, чего API не ожидают...
Вы должны указать свой трек в:
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.TrackEnded:
player.Track = myMusic.ReturnTrack();
break;
И оставьте OnUserAction как:
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Play();
}
break;