AIMP Forum
AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: __alex on March 04, 2012, 11:31:31
-
Всем привет!
Вопрос наверно глуповатый, но какой есть) Как использовать те константы из AIMPSDKCore.h: AIMP_MSG_CMD_PLAY и подобные?
Я так понимаю, все должно быть просто: SendMessage(hwnd, AIMP_MSG_CMD_PLAY, 0, 0), или даже PostMessage. Но какому окну это посылать? Пробовал:
FindWindow(L"Winamp v1.x", NULL);
FindWindowA(AIMPRemoteAccessClass, AIMPRemoteAccessClass); // AIMPRemoteAccessClass == "AIMP2_RemoteInfo"
никакого эффекта.
Как правильно то?
-
ок, сработало это:
PostMessage(hwndAimp, WM_AIMP_COMMAND, AIMP_RA_CMD_PLAY, 0);
Но как тогда использовать AIMP_MSG_CMD_PLS_DELETE_NON_EXISTS ? Не нахожу аналога в AIMPSDKRemote.h
Да, пытаюсь это сделать не из плагина, а из внешнего приложения.
-
для Remote использовать нужно только то, что описано в файле AIMPSDKRemote, константы из других юнитов использовать НЕЛЬЗЯ!
-
Ладно... тогда чисто для общего развития - зачем нужны эти константы в AIMPSDKCore.h? Как их использовать из плагина?
-
через IAIMPCoreUnit.MessageSend, а экземпляр IAIMPCoreUnit передается плагину при инициализации
-
через IAIMPCoreUnit.MessageSend, а экземпляр IAIMPCoreUnit передается плагину при инициализации
Объясните, пожалуйста, с чем может быть связана Runtime Error при выполнении процедуры:
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;
}
-
Трейсить пробовали? На каком месте выпадает? Лично меня смущает эта строка:
MessageBox(NULL,(LPCWSTR)sp,L"OK",MB_OK);
а именно прикастовывание HRESULT к строке.
-
Artem, спасибо за ответ. Пока отладкой не занимался.
Ошибка как ни странно, при вызове метода MessageSend(). Пытался передавать и другие сообщения, но тщетно.
Что касается MessageBox() и прикастовывания, то комментирование данной строки на результат не влияет.
---
Разобрался =) Controller был неправильно задан, указывал на пустое место. Но теперь другая проблема...
Я всё пытаюсь сделать так, чтобы при play/pause происходило плавное нарастание/затухание скорости воспроизведения, а не громкости. Итак, к сожалению, после первого запуска плагина, и программного изменения скорости (трогаю Speed effect), при повторных включениях/отключениях плагина ничего не происходит. Кроме того, невозможно уже и через меню изменить значение скорости воспроизведения... Это глюк или я выбрал неправильную стратегию?
-
Я на вскидку не могу сказать, из-за чего так может происходить. Для начала нужно понять из-за чего текущий подход не работает.
-
Попытался изменить свойство SPEED в цикле FOR для постепенного замедления/ускорения.
Результат: После первого запуска плеер полностью перестает реагировать на все команды/нажатия кнопок меню/горячих клавиш.
Как быть? Возможно, цикл работает настолько быстро, что забивает интерфейс плеера запросами?
*Увеличил шаг счетчика цикла - все стало нормально работать.
Далее, хочется поставить колбэк на AIMP_MSG_EVENT_PLAYER_STATE, чтобы скорость менялась только при старте-остановке.
Вопрос: как сделать колбэк? Пользоваться CoreUnit.MessageHook? Не пойму аргументы функции CoreMessage... Можно строчку-пример?
Спасибо заранее.
-
Попытался изменить свойство SPEED в цикле FOR для постепенного замедления/ускорения.
Результат: После первого запуска плеер полностью перестает реагировать на все команды/нажатия кнопок меню/горячих клавиш. Как быть? Возможно, цикл работает настолько быстро, что забивает интерфейс плеера запросами?
Естественно.
*Увеличил шаг счетчика цикла - все стало нормально работать.
Правильнее - менять по таймеру
Далее, хочется поставить колбэк на AIMP_MSG_EVENT_PLAYER_STATE, чтобы скорость менялась только при старте-остановке.
Вопрос: как сделать колбэк? Пользоваться CoreUnit.MessageHook? Не пойму аргументы функции CoreMessage... Можно строчку-пример?
Что не так с аргументами? Ставите хук, в CoreMessage будут приходить все сообщения, а значения оставшихся параметров зависит от конкретного сообщения.
-
Artem, спасибо за помощь, получилось!
Правильно ли я делаю, что колбэк программирую прямо в функции CoreMessage? Создал класс CHook от IAIMPCoreUnitMessageHook, теперь не могу обратиться из него к указателю Controller... Как быть?
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);
};
--- Разобрался =)
Последняя непонятка: как правильно обыграть замедление проигрывания перед остановкой? Я ловлю событие паузы, потом запускаю программно снова на секунду, тут же замедляю, и потом опять ставлю на паузу. По-моему, это не очень себе вариант =)
И кстати, срабатывает и при переходе на другой трек, чего не хотелось бы...((
-
Не обязательно делать реализацию хук-интерфейса в отдельном классе, его может реализовывать сам "CAddon"