Фоновая звуковая дорожка готова не работает должным образом 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;
Другие вопросы по тегам