Разработка плагинов визуализации к WinAmp.
Современные музыкальные проигрыватели имеют большое количество дополнительных возможностей.
Здесь можно отметить широкий выбор настроек, изменение внешнего вида с помощью скинов,
возможность дистанционного управления и возможность подключения внешних модулей - плагинов,
самыми распространенными из которых являются плагины визуализации. Хорошо известны творения
фирмы WildTanget для WinAmp. Они выводят на экран трехмерные модели, танцующие под музыку.
Принципы программирования плагинов для WinAmp в среде Delphi изложены ниже.
Плагин визуализации для WinAmp представляет собой обычную библиотеку типа dll, в которой
описываются необходимые действия по работе с проигрывателем и непосредственно процедуры
визуализации. Данная библиотека помещается в каталог плагинов проигрывателя. После запуска
WinAmp ищет среди всех плагинов только те, которые содержат специальный заголовок.
Остальные файлы игнорируются. При старте плагина визуализации проигрывателем из dll
вызывается процедура инициализации, назначение которой – подготовка системы к работе плагина.
Во время работы проигрывателя, он через определенные промежутки времени вызывает функцию
рендеринга, которая и осуществляет основные действия по визуализации.
Окно Winamp Preferences/Visualization Plug-ins
Вызов меню визуализации в WinAmp осуществляется путем нажатия на правую кнопку мыши над
окном эквалайзера. При выборе команды Select Plug-in появляется окно Winamp Preferences,
на панели Visualization Plug-ins которого, отображаются имена библиотек визуализации и
выполняемые ими функции. Чтобы WinAmp смог обнаружить DLL она должна содержать структуру
заголовка, следующего вида:
TwinampVisHeader = record
version: Integer;
description: PChar;
getModule: function(i:Integer):PwinampVisModule;cdecl;
end;
Здесь version – версия плагина, description – название плагина, отображаемое в окне
выбора модулей визуализации, getModule функция, возвращающая указатель рабочей переменной
типа TwinampVisModule, через которую происходит обмен данными.
Структура TwinampVisModule имеет следующий вид:
TwinampVisModule = record
description: PChar;
hwndParent: HWND;
hDllInstance: HINST;
sRate,nCh, latencyMs, delayMs, spectrumNch, waveformNch: Integer;
spectrumData: array[0..1,0..575]of char;
waveformData: array[0..1,0..575]of char;
Config: procedure(this_mod:PwinampVisModule);cdecl;
Init: function(this_mod:PwinampVisModule):Integer;cdecl;
Render: function(this_mod:PwinampVisModule):Integer;cdecl;
Quit: procedure(this_mod:PwinampVisModule);cdecl;
userData: Pointer;
end;
Здесь description – описание функции модуля, hwndParent – дескриптор родительского окна,
hDllInstance – указатель на данную DLL, sRate, nCh, - количество каналов, latencyMs –
задержка между командой визуализации и непосредственно визуализацией в миллисекундах,
delayMs – задержка по времени меду вызовами визуализации в миллисекундах, spectrumNch,
waveformNch переменные определяющие режим в котором будет работать плагин (анализатор
спектра или осциллограф), spectrumData – данные анализатора спектра сигнала (используются
в режиме анализатора спектра), waveformData – данные по огибающей сигнала (используются
в режиме осциллографа), userData – данные пользователя.
Init – пользовательская функция инициализации. Вызывается при активации модуля. В ней
необходимо описать действия, которые должны производится при запуске модуля. Должна возвращать
1 если инициализация прошла успешно.
Config – пользовательская процедура конфигурации. Вызывается при нажатии кнопки Configure
в меню плагинов визуализации WinAmp. Должна возвращать 1 если визуализация успешна.
Render – пользовательская функция визуализации. В ней описываются действия, необходимые
для визуализации. WinAmp вызывает данную функцию через заданные отрезки времени.
Должна возвращать 1 если визуализация успешна.
Quit – пользовательская процедура выхода, описывающая действия при деактивации плагина.
Ниже приведен пример простого плагина визуализации, написанного без применения VCL.
Данная программа осуществляет вывод сигналов анализатора спектра или осциллографа в
отдельном окне. Для отрисовки изображения используются функции WinAPI.
Создание плагина начинается с создания нового проекта динамической библиотеки – DLL.
Имя проекта должно соответствовать имени будущего плагина. В описании подключаемых
модулей нужно включить только модуль Windows и будущий программный модуль.
Из описаний процедур следует включить только процедуру передачи заголовка библиотеки.
Основная часть плагина – программный модуль, не содержащий формы,
сохраняемый с произвольным именем, в котором будут описываются все действия по
работе с проигрывателем WinAmp.
В разделе описания типов плагина указываются структуры для работы с проигрывателем и
указатели на соответствующие структуры.
Раздел implementation начинается с определения основных констант модуля. Первая константа
имеет тип TwinampVisHeader и однозначно описывает заголовок модуля. Две констант типа
TwinampVisModule описывают режимы осциллографа и анализатора спектра. Переключение этих
режимов осуществляется в окне Visualization Plug-ins. При этом проигрыватель вызывает
функцию getModule.
Процедура конфигурации config в данном примере осуществляет только вывод информации о
плагине. Функция инициализации модуля создает новое окно, в котором и будут выводится
результаты визуализации.
Функция render1 выводит на экран кривую осциллографа. Данные осциллограммы, передаваемые
от WinAMP, разбиты на две части, лежащие по разные стороны от нулевой оси. Отрицательные
значения идут от 0 в сторону увеличения, положительные от 255 в сторону уменьшения.
Функция render2 выводит данные анализатора спектра.
При компиляции плагина Delphi выводит сообщение об ошибке, заключающейся в невозможности
отладки программы, так как получаемая dll не является таковой. Полученный модуль необходимо
скопировать в подкаталог PLUGINS каталога WinAMP. Далее открывается окно Winamp Preferences
c панелью Visualization Plug-ins, где выбирается нужный плагин и нажимается кнопка Start.
Работоспособность модуля проверялась под операционными системами Windows 98/2000 и версиями
проигрывателя 2.61,2.73 и 5.00
|