AIMP Forum

AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: __alex on March 04, 2012, 11:31:31

Title: AIMP_MSG_CMD_PLAY и другие константы из
Post by: __alex on March 04, 2012, 11:31:31
Всем привет!

Вопрос наверно глуповатый, но какой есть) Как использовать те константы из AIMPSDKCore.h: AIMP_MSG_CMD_PLAY и подобные?
Я так понимаю, все должно быть просто: SendMessage(hwnd, AIMP_MSG_CMD_PLAY, 0, 0), или даже PostMessage. Но какому окну это посылать? Пробовал:
Code: [Select]
FindWindow(L"Winamp v1.x", NULL);
FindWindowA(AIMPRemoteAccessClass, AIMPRemoteAccessClass);   // AIMPRemoteAccessClass == "AIMP2_RemoteInfo"
никакого эффекта.

Как правильно то?
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: __alex on March 04, 2012, 12:04:42
ок, сработало это:
Code: [Select]
PostMessage(hwndAimp, WM_AIMP_COMMAND, AIMP_RA_CMD_PLAY, 0);
Но как тогда использовать AIMP_MSG_CMD_PLS_DELETE_NON_EXISTS ?  Не нахожу аналога в AIMPSDKRemote.h

Да, пытаюсь это сделать не из плагина, а из внешнего приложения.
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on March 04, 2012, 14:17:03
для Remote использовать нужно только то, что описано в файле AIMPSDKRemote, константы из других юнитов использовать НЕЛЬЗЯ!
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: __alex on March 04, 2012, 18:10:59
Ладно... тогда чисто для общего развития - зачем нужны эти константы в AIMPSDKCore.h? Как их использовать из плагина?
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on March 04, 2012, 19:48:09
через IAIMPCoreUnit.MessageSend, а экземпляр IAIMPCoreUnit передается плагину при инициализации
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: 5hev on May 03, 2012, 22:10:58
через IAIMPCoreUnit.MessageSend, а экземпляр IAIMPCoreUnit передается плагину при инициализации
Объясните, пожалуйста, с чем может быть связана Runtime Error при выполнении процедуры:
Code: [Select]
HRESULT WINAPI CAddon::Initialize(IAIMPCoreUnit *AController)
{
float obj = 1.5;
float* pnt = &obj;
 Controller = AController;
  HRESULT sp = Controller->MessageSend(AIMP_MSG_PROPERTY_SPEED,AIMP_MSG_PROPVALUE_SET,pnt);
  MessageBox(NULL,(LPCWSTR)sp,L"OK",MB_OK);
 return 1;
}
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on May 04, 2012, 08:37:59
Трейсить пробовали? На каком месте выпадает? Лично меня смущает эта строка:

MessageBox(NULL,(LPCWSTR)sp,L"OK",MB_OK);

а именно прикастовывание HRESULT к строке.

Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: 5hev on May 04, 2012, 09:34:40
Artem, спасибо за ответ. Пока отладкой не занимался.
Ошибка как ни странно, при вызове метода MessageSend(). Пытался передавать и другие сообщения, но тщетно.
Что касается MessageBox() и прикастовывания, то комментирование данной строки на результат не влияет.
---
Разобрался =) Controller был неправильно задан, указывал на пустое место. Но теперь другая проблема...

Я всё пытаюсь сделать так, чтобы при play/pause происходило плавное нарастание/затухание скорости воспроизведения, а не громкости. Итак, к сожалению, после первого запуска плагина, и программного изменения скорости (трогаю Speed effect), при повторных включениях/отключениях плагина ничего не происходит. Кроме того, невозможно уже и через меню изменить значение скорости воспроизведения... Это глюк или я выбрал неправильную стратегию?
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on May 04, 2012, 20:54:09
Я на вскидку не могу сказать, из-за чего так может происходить. Для начала нужно понять из-за чего текущий подход не работает.
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: 5hev on May 04, 2012, 23:06:15
Попытался изменить свойство SPEED в цикле FOR для постепенного замедления/ускорения.
Результат: После первого запуска плеер полностью перестает реагировать на все команды/нажатия кнопок меню/горячих клавиш.
Как быть? Возможно, цикл работает настолько быстро, что забивает интерфейс плеера запросами?
*Увеличил шаг счетчика цикла - все стало нормально работать.

Далее, хочется поставить колбэк на AIMP_MSG_EVENT_PLAYER_STATE, чтобы скорость менялась только при старте-остановке.
Вопрос: как сделать колбэк? Пользоваться CoreUnit.MessageHook? Не пойму аргументы функции CoreMessage... Можно строчку-пример?
Спасибо заранее.
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on May 05, 2012, 08:30:35
Попытался изменить свойство SPEED в цикле FOR для постепенного замедления/ускорения.
Результат: После первого запуска плеер полностью перестает реагировать на все команды/нажатия кнопок меню/горячих клавиш. Как быть? Возможно, цикл работает настолько быстро, что забивает интерфейс плеера запросами?

Естественно.

*Увеличил шаг счетчика цикла - все стало нормально работать.

Правильнее - менять по таймеру

Далее, хочется поставить колбэк на AIMP_MSG_EVENT_PLAYER_STATE, чтобы скорость менялась только при старте-остановке.
Вопрос: как сделать колбэк? Пользоваться CoreUnit.MessageHook? Не пойму аргументы функции CoreMessage... Можно строчку-пример?

Что не так с аргументами? Ставите хук, в CoreMessage будут приходить все сообщения, а значения оставшихся параметров зависит от конкретного сообщения.
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: 5hev on May 05, 2012, 20:16:56
Artem, спасибо за помощь, получилось!

Правильно ли я делаю, что колбэк программирую прямо в функции CoreMessage? Создал класс CHook от IAIMPCoreUnitMessageHook, теперь не могу обратиться из него к указателю Controller... Как быть?

Code: [Select]
void WINAPI CHook::CoreMessage(DWORD AMessage, int AParam1, void *AParam2, HRESULT *AResult)
{
if (AMessage == AIMP_MSG_EVENT_PLAYER_STATE)
{
switch (AParam1) {
case 1:
for(float i = 1.0; i>=0.5;i-=0.05) {
pnt = &i;
Controller->MessageSend(AIMP_MSG_PROPERTY_SPEED,AIMP_MSG_PROPVALUE_SET,pnt);
Sleep(100);
};
break;
case 2:
for(float i = 0.5; i<=1.0;i+=0.05) {
pnt = &i;
Controller->MessageSend(AIMP_MSG_PROPERTY_SPEED,AIMP_MSG_PROPVALUE_SET,pnt);
Sleep(100);
};
break;
};
};
Controller->MessageSend(AIMP_MSG_PROPERTY_SPEED,AIMP_MSG_PROPVALUE_SET,fine);
};

--- Разобрался =)
Последняя непонятка: как правильно обыграть замедление проигрывания перед остановкой? Я ловлю событие паузы, потом запускаю программно снова на секунду, тут же замедляю, и потом опять ставлю на паузу. По-моему, это не очень себе вариант =)
И кстати, срабатывает и при переходе на другой трек, чего не хотелось бы...((
Title: Re: AIMP_MSG_CMD_PLAY и другие константы из
Post by: Artem on May 05, 2012, 22:02:27
Не обязательно делать реализацию хук-интерфейса в отдельном классе, его может реализовывать сам "CAddon"