AIMP Forum

AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: cherrybeach on February 19, 2010, 22:47:49

Title: Загрузить трек/плейлист в из другого процесса
Post by: cherrybeach on February 19, 2010, 22:47:49
Вопрос состоит в следующем: как передать путь\список путей к треку\трекам
из другого процесса для их проигрывания в AIMP?

Я, имея опыт такого решения для Winamp и изучив примеры в AIPM SDK,
решил делать так:

1. Создаю file mapping (ну там как обычно через винодовские функции OpenFileMapping и MapViewOfFile)
2. заполняю этот mapping null-terminated строками - путями к файлу\файлам
3. мой AIPM-плагин читает из этого мапинга эти строки и грузит в AIPM
примерно как я видел в одном из примеров типа такова:

Code: [Select]
// это все чисто схематически конечно
AAIMPClassic.AIMP_NewStrings(AStrings);

for i:= 0 to N do begin
  AStrings.AddFile(pWideChar(WideString(тут типа указатель на строку из мапинга
end;

APlsID := AAIMPClassic.AIMP_PLS_New('Default');
AAIMPClassic.AIMP_PLS_Clear(APlsID);
AAIMPClassic.AIMP_PLS_AddFiles(APlsID, AStrings);
APlayer.PlayTrack(APlsID, 0); //Начинаем играть с первого трека


НО!
Изучив далее примеры из SDK я обнаружил пример проекта AIMP_RemInfo (в файле sdk_remote_info.zip)
где передается информация о треке из процесса AIPM в процесс примера через мапинг.


Вот я и подумал - может я изобретаю вилосипед ???
Может AIPM уже имеет специальный маппинг для загрузки треков\плейлистов ???
Т.е. анагоичный как в примере AIMP_RemInfo только в другую сторону?
В примерах я таково не нашел.

А может есть другие механизмы? Не через мапинг?

Что посоветуете ???
Заранее спасибо.
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: Artem on February 19, 2010, 23:22:29
Боюсь, что никак.
Разве что сгенерировать плейлист и передать его через командную строку (ключи см. в справке).

Вопрос - зачем нужно передавать из другого процесса плейлист? Какая именно цель приследуется?
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: cherrybeach on February 20, 2010, 11:20:26
Дело в том что я хочу сделать поддержку AIMP  для вот этой вот штуки http://www.cherryware.org/mg/ (http://www.cherryware.org/mg/) (я являюсь ее разработчиком).
Неужели нельзя сделать как я описал - через плагин и file mapping?
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: Artem on February 20, 2010, 14:32:03
Через плагин, естественно, можно сделать, но это лишняя прослойка.

Про маппинг - на данный момент ничего не скажу, возможно, в будущем сделаю...
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: cherrybeach on February 24, 2010, 22:46:14
Ну вобщем я проблему решил.
С использованием плагина, конечно, но не через маппинг!.
Т.е. без доп. прослойки.

Если кому интересно, сегодня-завтра сделаю пример и выложу здесь.
Хотелось бы услышать мнение народа. Vox populi так сказать.
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: bescheidener on February 25, 2010, 01:53:10
Очень интересно. Выкладывай ))
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: cherrybeach on February 25, 2010, 15:43:47
Всем привет!
Как и обещал, привожу пример.
Пример - рабочий!


Проект плагина называется aimp_addon.dpr
Проект клиента называется aimp_client.dpr

Для передачи данных (в нашем случае строк) между процессами можно использовать
механизм сообщений WIndows. А именно сообщение WM_COPYDATA.

Суть в том, что Windows копирует данные из одного процесса в адресное пространство
другого процесса и передает указатель на скопированные данные Посредством SendMessage.
Вернее не указатель, а указатель на дескриптор, в котором содержится указатель
на скопированные данные. Но это не принципиально. Главное - мы можем получить валидный указатель.

Нашему процессу (в примере это плагин к AIMP-у) достаточно лишь получить такое
сообщение и прочитать из него все что нужно.

Чтобы наш плагин AIMP получал интересующее нас сообщение, я использовал хук.
Распространяццо не буду - Смотрите пример. Там все просто.



Узкое место в примере - это идентификация "наших" данных.
Как показали лабороторные опыты, AIMP кроме нашего сообщения WM_COPYDATA получает
и другие такие же сообщение WM_COPYDATA. И нам необходимо их как то фильтровать.
Я использовал уникальный идентификатор при передачи сообщения (параметр wParam),
который затем проверялся в плагине

В приложении:
EXAMPLE_MESSAGE_ID = $ABCDEF; // - уникальный идентификатор
SendMessage(AIMPInstance, WM_COPYDATA, EXAMPLE_MESSAGE_ID, Cardinal(@Data));

в плагине
if (hookStruct.wParam = EXAMPLE_MESSAGE_ID) ...

Интересно было б узнать мнение разработчиков AIMP касательно такова метода идентификации.
Насколько он надежен? Какие значения можно использовать в качестве EXAMPLE_MESSAGE_ID
штоб не пересечься c AIMP?


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



Приглашаю пипл к обсуждению!
Консруктивная критика приветствуется!
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: Artem on February 25, 2010, 16:10:57
Главное замечание:
Не надо вешать хуки на окна АИМП - это стремно.
Лучше создайте "свое" окошко и шлите сообщения ему, он легким образом их получит, даже проще, чем вешать хук.

EXAMPLE_MESSAGE_ID
Лучше его зарегистрировать через специальную функцию: RegisterWindowMessage()
Соответственно, и клиент, и сервер получат один и тот же ID
Title: Re: Загрузить трек/плейлист в из другого процесса
Post by: cherrybeach on February 25, 2010, 22:05:40
Спасибо. Учту.