Дайте музыку. Секретные материалы

    Когда несколько дней назад я начал подготовку к написанию новой статьи к обучающей серии, мне захотелось написать простой урок по воспроизведению мультимедиа-файлов. Взяв за основу материал MSDN, я перевел его (он не слишком сложный), но хотелось чего-то поинтереснее. И тут на глаза мне попадается статья Windows Phone tip of the day: MediaLibrary can be tested in the emulator with built-in songs, которая привлекла мое внимание.
    При попытке воспроизвести музыку описанным способом, я столкнулся с неработающим примером. Случайным образом мне удалось заставить пример работать. Ниже представлен вольный перевод статьи с решением моей проблемы.

    Вероятно, не все разработчики знают, что в системе, поставляемой в эмуляторе Windows 7, кроме картинок есть также несколько встроенных файлов с музыкой. Точнее их три:

    • Another Melody Song (00:00:31.3930000) by Windows Phone Artist [Pop]
    • Melody Song (00:00:30.4640000) by Windows Phone Artist [Rock]
    • Rhythm Variation (00:00:15.3710000) by Windows Phone Artist [R&B]


    Небольшое отступление

    Так как я пользуюсь разлоченным вариантом эмулятора, то мне не составляет труда убедиться в справедливости данного утверждения. Достаточно выбрать хаб Music + Video и прослушать все мелодии. У меня в планах подготовить статью о возможностях, которые предоставляет разлоченный вариант, включая навигацию по папкам и реестру системы.

    Получить список песен

    Но вернемся к музыке. Мы можем самостоятельно получить список музыки, которая находится в библиотеке, а также дополнительную информацию (продолжительность песни, автор и т.п.). Для этого сначала добавим ссылку на Microsoft.Xna.Framework и затем пишем следующий код:
    <code>
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Media;
    
    private void buttonGetSongs_Click(object sender, RoutedEventArgs e)
    {
         FrameworkDispatcher.Update();
         MediaLibrary lib = new MediaLibrary();
    
         foreach (Song s in lib.Songs)
         {
             Debug.WriteLine(s.Name + " " + s.Duration + " " + s.Artist);
         }
    }
    </code>


    Запустив проект и нажав кнопку, мы получаем список песен, содержащихся в библиотеке, который приведен выше. Тут проблем не возникло. Идем дальше.

    Воспроизведение

    Просто получить список музыки не интересно, хочется ее послушать. Воспользуемся экземпляром класса MediaPlayer
    <code>
    // 1 вариант
    // Фоновая музыка
    MediaPlayer.Play(lib.Songs[0]);
    </code>


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

    Воспроизведение. Способ второй

    Автор оригинальной статьи также привел полные пути к файлам, которые находятся в библиотеке.
    • My Documents\Zune\Content\0100\00\11.wma (Melody Song)
    • My Documents\Zune\Content\0100\00\15.wma (Another Melody Song)
    • My Documents\Zune\Content\0100\00\17.wma (Rhythm Variation)


    Дальше я решил провести самостоятельные исследования и воспроизвести музыку по именам файлов. Вот тут меня поджидали другие неожиданности. Сначала код, который выглядел правильно для меня.
    <code>
    // 2 вариант
    // Список доступной музыки
    //My Documents\Zune\Content\0100\00\11.wma (Melody Song)
    //My Documents\Zune\Content\0100\00\15.wma (Another Melody Song)
    //My Documents\Zune\Content\0100\00\17.wma (Rhythm Variation) 
    MediaPlayerLauncher playerlauncher = new MediaPlayerLauncher();
    playerlauncher.Media = new Uri(@"\My Documents\Zune\Content\0100\00\17.wma",   UriKind.RelativeOrAbsolute);
    playerlauncher.Location = MediaLocationType.Install;
    playerlauncher.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop;
    playerlauncher.Show();
    </code>


    Пример очень простой. Я хотел вызвать встроенный плеер через MediaPlayerLauncheer (о задачах выполнения писал здесь) и передать ему готовый путь к файлу. Первое, что меня смутило, отсутствие обратного слэша в начале пути у автора статьи. Имея опыт разработки под Windows Mobile, я помнил, что все пути начинались с символа слэша (\). Моя догадка оказалась верной. Без слэша программа вываливалась с ошибкой. Впрочем, со слэшем ситуация выглядела не намного лучше. Ошибка не появлялась, но музыка не воспроизводилась. Немного расстроившись, я вышел из программы и стал просто щелкать по значкам программ, установленных в эмуляторе. И случайно нажал на значок своей программы, а затем и на кнопку воспроизведения. И, о чудо, музыка зазвучала! Таким образом, я впервые встретился с ситуацией разного поведения программы, запущенного с Visual Studio или с эмулятора.

    Тогда я вернулся к первому примеру и попробовал тот же способ. Сначала я запустил программу через Visual Studio и сразу его закрыл. А затем в эмуляторе запустил свою программу еще раз. Все работало.

    Напоследок, я хотел еще попробовать вариант воспроизведения музыки через MediaElement. Увы, безрезультатно. Привожу код на всякий случай. Может кто-то из профессионалов сможет разобраться в этой проблеме.
    <code>
    //Uri u = new Uri(@"\My Documents\Zune\Content\0100\00\15.wma");
    //MediaElement mymedia = new MediaElement();
    //mymedia.Source = u;
    //mymedia.Play();
    </code>


    Удачного вам программирования!

    P.S. Картинок не будет, так как нечего показывать.
    Поделиться публикацией
    Похожие публикации
    Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

    Зачем оно вам?
    Реклама
    Комментарии 5
    • 0
      На данный момент в WP7 есть недоработки связанный с синхронизацией с zune — одна из них это то что в режиме синхронизации с zune попытка проигрывания аудиофайлов выкидывают ошибку. В частности с этим связана невозможно отлаживать приложение связанные с проигрыванием звука — для корректной работы приложения в режиме синхронизации надо перехватывать и обрабатывать эту ошибку.
      • –1
        так вроде про синхронизацию здесь речи нет.
        • 0
          А разве студия не через zune синхронизуется с эмулятором/устройством для заливки и запуска приложения?
          • 0
            У меня нет никакого Zune.
            • 0
              Нет, для пользования эмулятором zune не нужен. Насколько мне известно, далеко не один разработчик столкнулся с тем, что его приложение вылетело из маркетплейса из-за UnauthorizedAccessException :)

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