Как стать автором
Обновить

Комментарии 17

Жаль, что это реализация всего лишь GUI :(
Осильте VCS для хранения кода.
Спасибо за комментарий.
Теперь можно сразу посмотреть код.
Да что ж такое, откуда опять пошла популярность недохостинга ipicture :( Повезёт, если загрузится хоть одна картинка. Из-за рубежа вообще ни одна не грузится.
PS. Пользуйтесь, пожалуйста, по возможности habrastorage.org/
Спасибо за комментарий. Ваше пожелание учтено, картинки перезалиты.
Этот подход не решает одной проблемы: Если пользователь переключает «Вперед/назад» не с помощью вашего плеера, а с помощью стандартного UVC (который вызывается кнопками регулировки звука), то как отобразить в нашем плеере, что что-то изменилось?
Когда вы находитесь в самом приложение, и переключаете с помощью UVC, то благодаря методу Instance_PlayStateChanged и секции PlayState.Playing при переключение треков, выделение в списке будет менять на нужный трэк.

Но тут есть одна действительно не решенная задача, если мы переключили трэк когда приложение было в фоне.
То, чтобы корректно отобразить текущий трэк при возобновление приложения, надо просто в метод
OnNavigatedTo(который срабатывает при переходе на страницу) вставить такой же switch, что и в Instance_PlayStateChanged.
Я имел ввиду, что прямой связи между AudioPlaybackAgent и нашим приложением нет. Мы можем использовать только промежуточный BackgroundPlayer.

В случае с событием PlayStateChanged мы не можем быть уверены, что изменилась песня (к примеру пользователь сначала приостановил песню Pause, потом снова воспроизвел или началась буферизация в случае со стримингом), нужно хранить её где-то в памяти и сравнивать Track. Более того, как чаще бывает в самом приложении мы не храним Track, он представлен в виде модели другой сущности и есть только три способа (которые знаю я) как передать данные из агента в наше приложение:
1. Использовать свойство Tag у трека. (т.е. некие meta-данные, используя которые можно преобразовать в необходимые модели)
2. Изолированное хранилище (используя серилизацию/дессириализацию хранить текущую песню)
3. База данных

У меня сейчас как раз встал вопрос «как используя mvvm-патерн обновить view из viewmodel когда пользователь перемещается вперед/назад используя UVC».

Еще одно странное решение:
(playlist.IndexOf(BackgroundAudioPlayer.Instance.Track.Source.OriginalString) + 1)
У нас BackgroundAudioPlayer.Instance.Track может быть равен null, соответственно это упадает. Да и вообще искать в массиве по строке, не самое удачное решение, если массив неизеняется, лучше держать индекс.

Второе, сам по себе agent может быть убит системой, точнее он пересоздается бекграундом, когда это надо, я столкнулся с этим, когда держал также массив музыки в плеере.
Очень ценный комментарий.
Действительно если начать работать с плеером не с выбора трэка, а с кнопок, то плеер падает.

Для того, чтобы он корректно работал необходимо в классе AudioPlayer в методе OnUserAction в самом начале его добавить такую строчку:
if (track.Source == null) player.Track = new AudioTrack(new Uri(playlist[0], UriKind.Relative), null, null, null, null);

Она определит первый трек текущим, если еще не был выбран трэк.
Данное решение добавлю в статью в ближайшее время.

А по поводу того, как хранить список музыки, считать индекс или нет, зависит от конкретной задачи. В данном случае, я думаю, что это не принципиально.
Небольшое уточнение. вместо проверки if (track.Source == null) лучше if (player.track == null)

Спасибо, так на самом деле понятнее и правильнее.
НЛО прилетело и опубликовало эту надпись здесь
Microsoft на данный момент запрещает использовать нативный код в приложениях под WP7. Нет, использовать его конечно можно, но тогда приложение в маркет не пропустят.
НЛО прилетело и опубликовало эту надпись здесь
Вероятно используют XNA и управляемый код. NDK для WP7 не выпускали и пока что о ней никаких новостей.
Так же вполне возможно, что для крупных студий (вроде Gameloft) Microsoft дает добро на использование нативных сборок.
Например игра Tentacles — хорошая графика и производительность, довелось отрефлексить ее код — там все управляемое.
Капец, ну нафига так сложно то (претензия к авторам долбанных агентов и прочего API)?..
Отдельный проект с передачей данных в него через файловое хранилище… капец жопа…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории