Создаем плагин на ассемблере для популярного плеера AIMP

Очередная статья, посвященная задротству и извращенству. Почему? Да потому что плагины для AIMP гораздо проще создаются на Дельфи, и для этого автор написал SDK (хотя SDK, конечно, громко сказано - всё ограничилось единственным файлом с исходником на дельфи). Тем не менее, в практике ассемблера этот пример будет весьма полезен и необычен.

Начну с API, используемого плеером. Имеется набор COM-интерфейсов, через которые и ведется работа с многочисленными функциями AIMP'а.
Вот, например, один из таких интерфейсов из пресловутого SDK на Delphi:

Теперь можно начинать поэтапно разбирать код простейшего плагина. Этот плагин отслеживает начало воспроизведения песни в AIMP и записывает все названия и исполнителей прослушанных композиций в файл "SONGS.txt" на диске C:.
Сначала идет, как обычно, начальная часть программы на MASM32 - инклюды, директивы. Эта тема затронута в более ранних статьях, и здесь я не буду в нее углубляться.

Теперь - объявления необходимых констант. Для создания плагина нам потребуется набор определенных функций из COM-интерфейса плеера. Как вызвать функцию COM-интерфейса из ассемблера? Этот вызов представляет вызов функции по указателю, причем сначала нужно определить смещение этого указателя относительно начала интерфейса в памяти. Допустим, мы хотим вызвать AIMP_CallBack_SET(). В COM-интерфейсе, представленном выше, эта функция занимает вторую позицию. На первой стоит IsUnicodeVersion(). Относительно начала интерфейса указатель на AIMP_CallBack_SET имеет смещение 4 байта (IsUnicodeVersion(), соответственно, 0 байт). Но до этих явно описанных функций в COM-интерфейсе есть еще три служебные, о которых можно прочитать в статьях, посвященных COM. Поэтому абсолютное смещение от самого начала интерфейса для функции AIMP_CallBack_SET = 4*3 + 4 байта. Высчитываем смещения для всех интересующих нас функций:

Теперь определим некоторые необходимы константы, указываемые в качестве параметров функций:

А также некоторые структуры, необходимые для работы с COM-интерфейсами AIMP'а:

Далее - несколько прототипов функций, которые создадим мы. Об их назначении написано подробнее ниже.

Воспользуемся структурой TAIMPAddonHeader для определения данных о плагине. Первые два поля несущественны, и их можно установить в ноль. Далее идет указатель на функцию, возвращающую указатель на строку с названием плагина, потом - на функцию, возвращающую указатель на строку с именем автора плагина. Затем идут указатели на функции инициализации, конфигурации и выхода, которые описаны ниже.

Наконец, секция кода. Для начала - пустая функция инициализации dll. Впрочем, она вполне может содержать какой-то полезный код.

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

Далее идут простые функции, возвращающие указатели на строки с именем автора плагина и названием плагина.

Процедуру конфигурации я оставил пустой, но здесь может быть, например, код открытия окна с параметрами плагина. Вызывается эта функция при нажатии на кнопку "Настройки" в списке плагинов плеера.

Мы добрались до функции инициализации плагина. Она вызывается сразу после загрузки и получения информации о плагине, и здесь можно размещать полезный код. Передается ей в качестве единственного параметра указатель на главный COM-интерфейс плеера - IAIMP2Controller. Воспользуемся этим и установим callback-функцию на воспроизведение файла.

Теперь рассмотрим функцию, которую мы поставили в качестве callback'а на воспроизведение в плеере.

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

Сохраним код в файл с именем aimp_plugin.asm.
Остается всего лишь создать файл с описанием экспорта dll aimp_plugin.def:

После этого достаточно скомпилировать всё это в dll с помощью подобного bat-файла (подробнее о компиляции проектов masm32 - в более ранних статьях):

Я после компиляции с 64-байтным стабом получил dll размером в 2.5 кб. Эту dll следует копировать в папку PlugIns в каталоге с AIMP, после чего перезапустить плеер или загрузить плагин через меню "Плагины".

Прикладываю все необходимые файлы в одном архиве, в том числе и dll: ZIP

Создаем плагин на ассемблере для популярного плеера AIMP: 6 комментариев

  1. В свое время писал аимповский плагин для Last.fm (когда официального еще не было), на С++. Если кому-нибудь интересно, могу поделиться исходниками.

    1. Приветствую! А можно и мне тоже посмотреть? Хочу на основе написать свой плагин тоже, для тренировки. Спасибо.

  2. Интересная статья! А если чисто теоретически, можно ли написать таким образом плагин в который входила бы возможность управления LPT портом, думаю вполне реально. Просто есть мысль автоматизировать процесс моей работы, есть цветомузыка, точнее несколько их разновидностей в клубе, на данный момент они управляются ручным (т.е. включением каждой в отдельности) способом, назовём тумблерным. А хотелось бы через реле или ключевую связку на силовых деталях. Но суть не в этом, программный путь… Самое важное! Визуальная среда, т.е. трек, его спектрограмма, ниже полосами каналы LPT, выбираем необходимый канал, проводим время включения-выключения определённого прибора, в итоге имеем скрытый файл привязанный к треку, при воспроизведении которого получаем световой оформление зала, ну и автоматический режим с возможностью корректировки))))) короче мысль есть а возможности сделать очень малы!

    1. Я писал для WinAmp'а плагин, который через ком-порт посылает данные о частотах во время воспроизведения песни, а потом это все отображается вот в таком кубике. API AIMP'а совместимо с винамповским, данные по частотам тоже можно получить, так что да, возможно конечно.

Добавить комментарий

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