|
Пишем софт - итерация 1
Я и Microsoft
Судьба проекта Freestyle, который, похоже, будет иметь название Windows XP Media Center Edition - XP MCE становится все более ясной. MS не хочет замыкаться на один тип платформ, но в то же самое время, не хочет сразу бросать его на растерзание самоделкиным вроде меня. Стратегия вырисовывается такая: сначала XP MCE будет поставляться предустановленым в устройствах, которые будут продаваться в массовых количествах и иметь совместимое железо (HP делает первый вариант, который будет стоить порядка $1500). Позже можно будет ожидать поставку XP MCE в составе TV tuner карточек, или другого совместимого железа, обладающего пультами ДУ. Далее, может быть XP MCE обрастет достаточным количеством драйверов, чтобы попасть в свободный доступ. Возможно, в MSDN будет какой-нибудь SDK еще раньше.
![[Image]](../../images/xp_mce_photo1.jpg)
Такой расклад не меняет моих планов написать свой софт, поскольку он проще и менее амбициозен. Да и нужен уже сейчас. А если XP MCE будет такой, какой ее хотелось бы видеть, то я легко откажусь от своего софта.
Постановка задачи
Общая задача выглядит так:
Создать программу, позволяющую проигрывать музыкальные файлы (MP3, WMA), просматривать видеодиски в формате MPEG4, VideoCD (и, возможно, DVD), просматривать фотографии. UI должен быть таким, чтобы им можно было пользоваться при использовании PAL телевизора в качестве устройства вывода и находясь в 3-х метрах от телевизора. Основным устройством управления будет пульт ДУ - то есть, можно ожидать, что обьем возможных команд будет достаточно ограниченным - клавиши навигации, ENTER, стандартные кнопки плеера и цифровые клавиши.
Поскольку все сразу разработать не получится, будем работать итерациями. Я воспользуюсь принципами экстремального программирования (XP) - разобью задачи на User Story, упорядочу из по важности для Заказчика (для меня то есть) и буду реализовывать одну за другой, стараясь иметь работающую систему в любой момент.
Итак - истории в порядке убывания важности:
-
Проигрывание MP3 и WMA файлов. Просмотр по артистам, затем по альбомам, затем просмотр и проигрывание альбома.
-
Просмотр обложек дисков в режиме списка альбомов и просмотра альбома.
-
Просмотр фотографий в папке в режиме слайд-шоу. Навигация по папкам.
-
Просмотр видео файлов с HDD
-
Просмотр видео файлов с CD
-
Поддержка команд управления проигрыванием (Play, Stop, Pause, FF, Rew и т.п.)
-
Конфигуратор для мапирования команд на клавиши (или в будущем, другие события)
На чем писать
У меня был реальный выбор - Visual Studio .NET (C#) или Delphi. Немного попробовав и то и другое, остановился все-таки на Delphi. Для нее побольше всего наработано уже, хотя на C# писать поприятнее.
Пишем проигрыватель музыки.
Чем играть музыку? Реальных вариантов два - Windows Media Player и WinAmp. С точки зрения программирования, WMP вне конкуренции - у него есть нормальные COM интерфейсы. Кроме того, он сразу же может и видео играть.
Как реализовывать музыкальный каталог? Чем проще, тем лучше. Видны два варианта - использовать встроенный в WMP и написать свой. Поскольку впереди маячит перспектива перехода на решение MS, уж лучше сразу иметь стандартное хранилище - Media Library от WMP.
Начинаем разбираться. Media Library поддерживается только в интерфейсе 7.1. Пробую поработать с ним из Delphi - нет эффекта. Что-то не так... И что вы думаете? В MSDN черным по-белому написано:
Note that Windows Media Player 7 does not support embedding the control in any applications that use Microsoft Visual Basic or Visual C++ through IDispatch.
Ну ладно, не нужен мне ваш IDispatch - я и IDL могу заимпортить - какие проблемы? Пробуем... Не работает. Никакой ошибки не выдается, но ничего и не происходит. То есть OCX 6.4 играет музыку, а 7.1 - не играет. Ни через IDispatch, ни через статически связанные вызовы.
Итак, полезли снова мудрость искать. Ньюсы Borland завалены вопросами аналогичными моему и ни одного ответа отличного от "попробуйте версию 6.4". По C# ответы такие же. Вообще - как вам такой диалог: "Я покрасил вашей краской стены, и вся краска слезла", и в ответ - "попробуйте оклеить стены обоями". Так и тут - "у меня 7.1 player не работает", ответ: "используйте 6.4". И это инженер поддержки отвечает!
Любопытен тот факт, что если вставить контрол 7.1 на Web страничку, то все работает здорово. Надо будет порыться в недрах - как же это IE обращается с контролом? Может какие волшебные заклинания сначала производит?
Ладно, пока я забью на 7.1 и поработаю через 6.4. Благо что музыку он играет, а информацию о файлах (типа ID3) можно и другими способами получить.
Итак, каталог музыки надо реализовывать своими средствами. Так как в User Story написано, что Заказчик хочет каталог артистов, в нем список альбомов, а там - список песен, то мы можем обойтись простой файловой системой, благо многие MP3 грабберы, да и сам WMP при копировании дисков создают именно такую структуру папок - артист / альбом / песни.
Я написал несложную систему классов - TMusicLibrary, TArtist, TAlbum. Для интерфейса я написал простейшие контролы - TTVButton. Брошенные на форму они могут иметь только один из них выделенным. Выделение меняется клавишами навигации. В принципе и все. Окно делаем со стилем Topmost, без рамки и размером на весь экран. Я добавил фоновую картинку, чтобы было красивее (как в XP MCE).
Далее стоит задача работы с картинками обложки. WMP когда срезает альбом, делает так, что (по крайней мере в WinXP) папка в режиме Thumbnails украшена обложкой альбома. Выяснилось, что сделать это просто - достаточно положить файл с именем folder.jpg в папку. Не будем изобретать велосипед, и воспользуемся этим способом.
Еще немного кодирования и получаем вот что:
Главное меню
Список альбомов
![[Image]](../../images/tvjb3.jpg)
Альбом
Я пока зашил фиксированное разрешение 800x600 - его поддерживают практически все TV-out карты. С форматом 16:9 будем возиться позже. Таким образом, на настоящий момент я имею игралку музыки, которая выглядит вот так:
Слева вы видите сам музыкальный компьютер (надо ему имя придумать, что ли). Вот он же увеличенный:
![[Image]](../../images/box.jpg)
Видна беспроводная карточка Linksys и ИК приемник, включенный между отсутствующей клавиатурой и клавиатурным разьемом.
Результат первой итерации лежит здесь.
|