Пишем плагины для Winamp’а

Совсем недавно я освоил написание плагинов для этого проигрывателя. Следует отметить, что официального SDK от NullSoft нет, и эта компания изредка выдает общественности куски документации по своему плееру. Некоторые описанные возможности не работают или работают неправильно, некоторые совсем плохо прокомментированы, поэтому мне пришлось много экспериментировать, чтобы написать нечто рабочее. Кстати, пример написанного мной плагина вместе с полностью работоспособным сервисом ведения статистики прослушиваний и создания подписей-картинок для форумов можно посмотреть тут: MusicSign.
Существует достаточно всевозможных тонкостей написания плагинов для WinAmp'а, и я постараюсь их описать в этой статье. Примеры буду приводить на ассемблере MASM32 (собственно, сами плагины я на нем и пишу), но примеры будут несложные, поэтому знающим c/c++ и немного Win32 API будет легко их понять.

Для начала я приведу код простейшего плагина общего назначения (существуют еще и другие типы плагинов, например, ввода или вывода, но я их рассматривать не буду), который умеет всего лишь выдавать три MessageBox'а. На одном из сайтов с документацией по созданию плагинов есть похожий код на си (собственно, больше там ничего и нет).

Сохраним этот код под именем gen_test.asm. Префикс gen_ говорит винампу о том, что это плагин общего назначения. Чтобы получить dll, создаем файл gen_test.def следующего содержания:

Теперь все готово для компиляции. Создаем bat-файл с таким содержанием:

Сохраняем его в директорию с нашими файлами gen_test.asm и gen_test.def, далее запускаем командную строку, переходим в директорию с проектом командой cd и вызываем наш бат-файл с параметром, например:

В той же директории получим несколько файлов, среди которых будет и gen_test.dll. Поместим его в директорию плагинов винампа (Plugins). Теперь после запуска винампа будем наблюдать MessageBox с сообщением о загрузке плагина. Потом можно будет зайти в настройки и увидеть сообщение о вызове функции конфигурации плагина при нажатии на кнопку настройки плагина:

После закрытия винампа появится третье сообщение о выгрузке плагина.

Итак, первый плагин написан и работает, теперь я расскажу о некоторых тонкостях. Заодно я рассмотрю такой пример плагина: винамп будет выдавать сообщение с именем исполнителя песни при воспроизведении. Общение с винампом реализовано с помощью оконных сообщений. Чтобы узнавать об изменениях статуса проигрывания, необходимо встроиться в цепочку обработки сообщений главным окном Winamp'а. С этим связана первая тонкость - с некоторой версии винамп стал поддерживать Unicode на современных системах, поэтому необходимо будет обеспечить совместимость со всеми версиями проигрывателя и системами. Для начала необходимо будет определить, юникодовое ли окно у винампа, и затем только встраиваться в цепь обработки. Введем две новые переменные в секцию данных:

Теперь добавим код в функции инициализации и выгрузки плагина, а также пустую функцию обработки сообщений. Сперва, потребуется ее прототип, впишем его после инклюдов:

Теперь - код функции init:

Код функции quit:

Наконец, пустая функция обработки оконных сообщений винампа:

Теперь плагин по сути ничего нового не делает, но добавилась база для написания кода обработки. Сначала необходимо определить, нажата ли кнопка Play, или окну винампа отослано какое-то другое сообщение. Для этого нам потребуется несколько констант из SDK. Сюда же я добавлю константы для получения информации о файлах, подробнее о которых я расскажу дальше.

Для получения информации о файле существует два способа - простые оконные сообщения для получения базовой информации и оконное сообщение для получения различной расширенной информации, в том числе, ID3-тега. Для получения расширенной информации существует специальная структура:

Добавим ее в секцию данных. Заодно, добавим в секцию данных Unicode-строку для получения названия исполнителя (в Unicode):

Теперь есть всё необходимое, чтобы усовершенствовать код процедуры CheckPlaying. Информацию получать и выводить в MessageBox мы будем в Unicode, хотя винамп поддерживает и ANSII.

Вот и все. Компилируем плагин и копируем его в директорию плагинов винампа. Кликаем на любом файле в плейлисте или воспроизводим файл каким-либо другим образом и видим MessageBox:

Остается один вопрос - как же определить, что играет в винампе - видео или аудио? Для решения этой проблемы я перепробовал множество методов, в том числе и сообщение для получения - видео играет или нет, получения разрешения видео, получения типа файла через стркутуру extendedFileInfoStruct, и ни один из них не дал должного результата. В итоге я решил проблему простой проверкой расширения файла.

Скачать весь комплект исходников и dll'ки можно тут: ZIP.

В дальнейшем я могу рассказать о том, как писать плагины к плееру AIMP, если эта тема кого-либо заинтересует.

Пишем плагины для Winamp’а: 5 комментариев

    1. Там недостаточно информации для написания полноценного плагина. Почти все страницы в вики пустые, и есть пример только написания пустого плагина.

  1. спасибо за статью, получившийся плагин работает под аимпом, есть какие-то дополнительные тонкости?

    1. Да, под аимпом работает. Из тонкостей - не поддерживались некоторые сообщения в версии аимпа 2.5 юникодовые (IPC_GET_EXTENDED_FILE_INFOW например), но в версии 2.6 вроде бы как совместимость полная.

Добавить комментарий для Ms-S Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *