AIMP Forum

AIMP for Windows => Плагины / Plugins => Дополнения / Addons => Плагины-дополнения / Addons => Topic started by: Holo on April 19, 2008, 01:03:00

Title: Дистанционное управление AIMP'ом через SlyControl
Post by: Holo on April 19, 2008, 01:03:00
Предлагаю вашему вниманию моё решение для дистанционного управления AIMP'ом.
Я эту задачу решил при помощи программы SlyControl (http://slydiman.narod.ru/scr/index.htm).
Написав к ней плагин для AIMP'а, скачать который можно здесь (http://slycontrol.ru/scext/aimp.zip).
Эта программа довольно универсальна, поддерживает большое количество схем подключения ик-приемников и в отличие от аналогичных программ занимает не много оперативной памяти (у меня получилось не больше 4 мб), да и еще и написана нашим соотечественником. С её помощью можно управлять любым приложением, для некоторых уже есть готовые скрипты. Она умеет эмулировать winlirc, события клавиатуры и мыши, перехватывает события джойстика и многое другое.
Единственный изъян в этой программе который мне удалось найти, это плохая работа с самой простой DCD схемой, комманды иногда определяются с третьего-четвертого раза. Для решения этой проблемы рекомендуют паять усовершествованный модуль DCD (Super DCD), его схему можно найти здесь (http://slydiman.narod.ru/scr/plugins/dcd.htm).
Если я хоть кого-нибудь заинтересовал, то прилагаю вам свой скрипт для SlyControl'a:
Code: [Select]
Aimp = load( "Apps\Aimp\Aimp.dll" )

Aimp_Always = Group( Enabled ){
  OnGroupEnable(){ WinMon.StartPreset(Aimp) }

  Aimp_Start = Hook( "AUDIO", "Aimp", Enabled, Break ){
h = WinMon.ActionPreset( Aimp )
Skip1(h<>0)
        e = ExecFile( "C:\Program Files\Мультимедиа\Aimp2\Aimp2.exe" )
GroupEnable(Aimp)
  }

  Aimp_Create = Hook( "WINMON", "Aimp_CREATE", Enabled ){
                  GroupEnable( Aimp )
  }

  Aimp_Activate = Hook( "WINMON", "Aimp_ACTIVATE", Enabled ){
                   GroupEnable( Aimp )
  }

  Aimp_Close = Hook( "WINMON", "Aimp_CLOSE", Enabled ){
                GroupDisable( Aimp )
  }

  MediaDisable = Hook( "MMEDIA", "DISABLE", Enabled ){
                 Break( MediaDisable = 101 )
                 GroupDisable( Aimp )
  }
}

#===========================================================

Aimp = Group( Disabled ){
  OnGroupDisable(){
  }

  OnGroupEnable(){
GroupEnable( RemoteTrack2 )
OOSD("AIMP", "P^Image\Apps\aimp.bmp#")
 }
  PowerRemote = Hook( "REMOTE", "POWER", Enabled, Break ){
                Break( PowerRemote <> 0 )
Aimp("QUIT")
                GroupDisable( Aimp )
  }
  OpenRemote = Hook( "REMOTE", "Open", Enabled, Break ){
                Break( OpenRemote <> 0 )
Aimp("SLEEP_TIMER")
  }
  FOpenRemote = Hook( "REMOTE", "FOpen", Enabled, Break ){
                Break( FOpenRemote <> 0 )
Aimp("ADD_DIR")
  }
  PlayRemote  = Hook( "REMOTE", "PLAY", Enabled, Break ){
Break( PlayRemote <> 0 )
Aimp("PLAY")
OOSD.ActionPreset(Play)
  }
  PauseRemote  = Hook( "REMOTE", "PAUSE", Enabled, Break ){
                Break( PauseRemote <> 0 )
Aimp("PAUSE")
                OOSD.ActionPreset(Pause)
  }

  StopRemote  = Hook( "REMOTE", "STOP", Enabled, Break ){
                Break( StopRemote <> 0 )
                AIMP("STOP")
                OOSD.ActionPreset( Stop )
  }

  NextRemote  = Hook( "REMOTE", "NEXT", Enabled, Break ){
                Break( NextRemote <> 0 )
                Aimp( "NEXT" )
                OOSD( "Next","Следующий" )
  } 
 
  PrevRemote  = Hook( "REMOTE", "PREV", Enabled, Break ){
                Break( PrevRemote <> 0 )
                Aimp( "PREV" )
                OOSD("Prev","Предыдущий")
  }
  FfRemote  = Hook( "REMOTE", "Ff", Enabled, Break ){
                Break( FfRemote < 0 )
                Aimp( "FF", 20 )
                OOSD( "Ff","" )
  } 
 
  RevRemote  = Hook( "REMOTE", "Rev", Enabled, Break ){
                Break( RevRemote < 0 )
                Aimp( "REW", 20 )
                OOSD("Rev","")
  }
  MinRemote  = Hook( "REMOTE", "l/r", Enabled, Break ){
                Break( MinRemote <> 0 )
                Aimp( "TO_TRAY" )
  }
 
  Showremote = Hook( "REMOTE", "OSD", Enabled, Break ){
                Break( ShowRemote <> 0 )
                Aimp( "SHOW_CURFILE" )
  }
 
  MuteRemote = Hook( "REMOTE", "Mute", Enabled, Break ){
                Break( MuteRemote <> 0 )
                Aimp( "TOGGLE_MUTE" )
  }
  RepeatRemote = Hook( "REMOTE", "Repeat", Enabled, Break ){
                Break( RepeatRemote <> 0 )
Aimp("TOGGLE_REPEAT")
  }
  ShuffleRemote = Hook( "REMOTE", "Random", Enabled, Break ){
                Break( ShuffleRemote <> 0 )
Aimp("TOGGLE_SHUFFLE")
  }
  VolDRemote = Hook( "REMOTE", "-", Enabled, Break ){
                Break( VolDRemote < 0 )
OOSD( "", "P^Image\VolDown.bmp#" )
Aimp("VOLUMEDOWN")
  }
  VolURemote = Hook( "REMOTE", "+", Enabled, Break ){
                Break( VolURemote < 0 )
OOSD( "", "P^Image\VolUp.bmp#" )
Aimp("VOLUMEUP")
  }
 AotRemote = Hook( "REMOTE", "Digest", Enabled, Break ){
                Break( AotRemote < 0 )
Aimp("TOGGLE_AOT")
  }
 EqRemote = Hook( "REMOTE", "PBC", Enabled, Break ){
                Break( EqRemote < 0 )
Aimp("TOGGLE_EQ")
  }
 SearchRemote = Hook( "REMOTE", "Goto", Enabled, Break ){
                Break( SearchRemote <> 0 )
Aimp("SEARCH")
  }
 QRemote = Hook( "REMOTE", "Resume", Enabled, Break ){
                Break( qRemote <> 0 )
Aimp("SET_EQ_SLDR", 0, 0)
  }
 TitleRemote = Hook( "REMOTE", "Title", Enabled, Break ){
                Break( TitleRemote <> 0 )
Aimp("GET_TITLE_EVENT")
#writelog("%s - %s %s", @1, @2, @3)
  }
 AddBmRemote = Hook( "REMOTE", "STEP", Enabled, Break ){
                Break( AddBmRemote <> 0 )
Aimp("ADD2BOOKMARK")
  }
 OffCurTrackRemote = Hook( "REMOTE", "slow", Enabled, Break ){
                Break( OffCurTrackRemote  <> 0 )
Aimp("OFF_SELECTED")
OOSD("Выключить трек", "P^Image\Apps\aimp.bmp#")
  }
}
RemoteTrack2 = Group( Disabled ) {
  Play_Track = Hook( "RemoteTrack", "tPLAY", Enabled, Break ) {
track = Math.ActionManual( "GET", "Var1")
OOSD( "Play Track - %d" , "P^Image\RemoteTrack.bmp#",track)
track=Math.ActionManual("x-1",track)
Aimp( "SETPLAYLISTPOS" , track )
Math.ActionManual( "SET", "Var1", 0 )
Timer.StopManual( "RemoteTrack" )
  }
  SleepDisplay = Hook( "RemoteTrack", "DISPLAY", Enabled, Break ) {

v = Math.ActionManual( "GET", "Var1" )
bt_number = Math.ActionManual( "GET", "button_number" )

skip( 1, v>1 )
            Math.ActionManual( "SET", "Var1", bt_number )
skip(2,v=0)
zz= math ("x*10+y",v,bt_number)
            Math.ActionManual( "SET", "Var1", zz )

v = Math.ActionManual( "GET", "Var1" )
          OOSD.ActionManual( "Track = %d", "T^30000#P^Image\RemoteTrack.bmp#", v )
All_track_number = Aimp( "GET_LIST_LENGTH" )
All_track_number2 = Math.ActionManual( "x+1", All_track_number )

skip(4,v<All_track_number2)
          OOSD.ActionManual( "Track = %d not found, last track Nr = %d", "P^Image\RemoteTrack.bmp#" , v,All_track_number)
Math.ActionManual( "SET", "Var1", 0 )
Timer.StopManual( "RemoteTrack" )
break()
Math( "SET", "Play_Time", 1 )
Timer.StartManual( "RemoteTrack", "TIMER", 2 ) 
}

    Math1 = Hook( "REMOTE", "1", true, false ){
Break( Math1 <> 0 )
Math.ActionManual( "SET", "button_number",1 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math2 = Hook( "REMOTE", "2", true, false ){
Break( Math2 <> 0 )
Math.ActionManual( "SET", "button_number",2 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math3 = Hook( "REMOTE", "3", true, false ){
Break( Math3 <> 0 )
Math.ActionManual( "SET", "button_number",3 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math4 = Hook( "REMOTE", "4", true, false ){
Break( Math4 <> 0 )
Math.ActionManual( "SET", "button_number",4 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math5 = Hook( "REMOTE", "5", true, false ){
Break( Math5 <> 0 )
Math.ActionManual( "SET", "button_number",5 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math6 = Hook( "REMOTE", "6", true, false ){
Break( Math6 <> 0 )
Math.ActionManual( "SET", "button_number",6 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math7 = Hook( "REMOTE", "7", true, false ){
Break( Math7 <> 0 )
Math.ActionManual( "SET", "button_number",7 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math8 = Hook( "REMOTE", "8", true, false ){
Break( Math8 <> 0 )
Math.ActionManual( "SET", "button_number",8 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math9 = Hook( "REMOTE", "9", true, false ){
Break( Math9 <> 0 )
Math.ActionManual( "SET", "button_number",9 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math0 = Hook( "REMOTE", "0", true, false ){
Break( Math0 <> 0 )
track = Math.ActionManual( "GET", "Var1")
skip(2,track<1)
Math.ActionManual( "SET", "button_number",0 )
EventSend("RemoteTrack","DISPLAY")
    }

    Math10 = Hook( "REMOTE", "10+", true, false ){
Break( Math10 <> 0 )
track = Math.ActionManual( "GET", "Var1")
Math.ActionManual( "SET", "button_number",10 )
EventSend("RemoteTrack","DISPLAY")
    }

  DisplayTime = Hook( "TIMER", "RemoteTrack", Enabled, Break, 2 ) {
          z = Math( "GET", "Play_Time" )
          z = Math( "x-1", z )
          Math( "SET", "Play_Time", z )

skip ( 1 , z>1 )
EventSend("RemoteTrack","tPLAY")
   }
}

Выкладываю его лишь для примера, чтобы он у вас заработал в большинстве случаев придется изменить названия кнопок и либо скачать и разобраться с плагином OOSD, либо удалить все строчки из скрипта содержащие обращение к нему. Да, плагин распаковывайте в папку SlyControl2/Plugins/Apps/Aimp/, а скрипт сохраняете в SlyControl/Data/Apps/ в формате scs.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: Holo on September 07, 2008, 14:31:25
Наконец-то поступила первая просьба о помощи по использованием моего плагина :)
Возможно никто не мог разобраться с ним, поэтому и не было никаких отзывов. Ну что же, эта тема предназначалась для более менее продвинутых пользователей SlyControl'a, по этому о некоторых моментах я не упомянул. Сейчас же постараюсь описать подробнее процесс добавления и использования скрипта. Прежде всего надо удостовериться в том, что SlyControl у нас работает и распознаёт кнопки с пульта, для этого надо указать требуемый модуль для ДУ в настройке SlyControl'a и настроить все кнопки. Я не буду подробно останавливаться на этом пункте, в справке SlyControl'a всё довольно неплохо описано, да и для разных схем требуется разная настройка. Я полагаю, что у вас всё уже настроено, неработает только скрипт для aimp'a. Итак, после того как скрипт был скопирован в папку SlyControl/Data/Apps/ в главный скрипт (main.scs) нужно добавить строчку
Code: [Select]
include( "Apps\Aimp.scs" ) Сделать это можно четыремя разными способами:
1) Остановив скрипты, в главном окне программы выбрать закладку "Скрипты", в ней выбрать скрипт "main.scs" и просто вставить эту строчку, желательно рядом с подобными строчками.
2) Остановив скрипты, в главном окне программы выбрать закладку"Структура", нажать на кнопку справа "Новый скрипт" и в диалоговом окне выбрать требуемый скрипт.
3) В любом текстовом редакотре, например в блокноте, открыть скрипт main.scs (SlyControl/Data/main.scs), и так же просто добавить в него нашу строчку.
4) В мастере настройки поставить галочку напротив скрипта aimp на 4 шаге настройки.
  После этого нужно будет перезагрузить/запустить скрипты. На закладке скрипты появится наш скрипт.
SlyControl очень не любит когда скрипты объявляют дважды (а именно объявлением мы сейчас и занимались, чтобы SlyControl знал о существовании aimp'a), поэтому очень строго за этим следите. Существует один подводный камень, когда наш скрипт объявлен, но новая закладка с ним не появляется в программе на закладке "Скрипты". В таком случае нужно удостоверится в том, что в нашем скрипте первая строчка отлична от
Code: [Select]
$DISABLED, во встроенном в программу редакторе её не увидишь, поэтому придется открыть наш скрипт во внешнем редакторе и там её удалить. Пугаться не стоит, такая ситуация может возникнуть только в результате невнимательности или бездумных действий.
К текущему моменту SlyControl у нас знает о существовании такой программы как Aimp, знает как обрабатывать кнопки д.у., но пока не знает когда вызывать ловушки описанные в скрипте. Можно сказать ему чтобы он всегда их обрабатывал, изменив строчку
Code: [Select]
Aimp = Group( Disabled ){ на
Code: [Select]
Aimp = Group( Enabled ){Эта строчка влючит группу ловушек, отвечающих за управление Aimp'ом.
Можно пойти и чуть дальше - включать эту группу только тогда, когда у нас запущен Aimp. Скрипт подразумевает использование последнего случая. Для этого нужно будет настроить модуль WinMon. В главном окне программы выбираем закладку "Модули", в ней выбираем модуль WinMon, справа появится список доступных конфигов, настроенных на распознование определенных программ. Чтобы там появился Aimp, нужно создать пустой текстовый файл в папке SlyControl\Plugins\System\WinMon c названием например Aimp.cfg и перезапустить скрипты, можно так же выбрать уже существующий конфиг и перенастроить его. Дальше нажимаем кнопку "Настройка событий", предварительно выбрав конфиг.
В диалоговом окне "Windows monitoring", должно стоять "Window detect method" как Find Window, Event ID: AIMP. Class name оставляем пустым, потому что в разных состояниях плеера у окна разные классы. В поле "window text" вписываем AIMP2. Если у вас Win NT, то можно определять запуск Аимпа не по тексту окна, а по запущенному процессу, в таком случае меняем "Window detect method" на "Advanced" и ставим галку на поле "Check process" и вписываем AIMP2.exe. Понять что конфиг для модуля WinMon правильно настроен нам может помочь сторонний плагин OOSD, который настроен в скрипте, но для этого вам придется его установить, скачать его можно например здесь (http://wapdata.narod.ru/OOSD.htm). Разобраться с ним предлагаю вам самим. Помимо этого плагина так же может помочь и встроенный в программу журнал, для этого нужно убедится, что в главном скрипте есть незакоментированная строчка
Code: [Select]
WriteLog       = Load( "System\WriteLog\WriteLog.dll" ) И следует добавить строчку
Code: [Select]
Writelog("aimp") в событие включения группы Aimp в скрипте, получиться должно что-то похожее на это:
Code: [Select]
...
OnGroupEnable(){
GroupEnable( RemoteTrack2 )
OOSD("AIMP", "P^Image\Apps\aimp.bmp#")
        Writelog("aimp")
 }
...
Если при запущенных скриптах, при включении Aimp'a в журнале появляется строчка aimp или появляется такая же OSD строчка, значит всё в порядке и можно переходить к перенастройке кнопок для ловушек (о том что такое ловушки и как их настраивать подробнее читайте в справке SlyControl'a). Желательно чтобы вы написали свой скрипт на основе моего примера, чтобы была понятна каждая строчка этого скрипта. Поскольку на многие ловушки у меня назначены специфичные кнопки, так же спецефично настроен OOSD плагин, плюс многие функции вам могут просто не понадобиться, благо список всех доступных функций плагина хорошо описаны в файле readme к нему. Если начнете писать свой скрипт, то обратите внимание на группу Aimp_Always, созданной специально для модуля WinMon. Если же захотите всё таки использовать мой скрипт, то во-первых придётся либо установить плагин OOSD, либо удалить все строчки в скрипте его упоминающие. Во-вторых придется либо настроить модуль WinMon, либо всегда держать включенной группу Aimp, как сделать и то, и другое описано выше. В-третьих изменить кнопки на ловушках. Например возьмём ловушку, которая ставит плеер на паузу:
Code: [Select]
  PauseRemote  = Hook( "REMOTE", "PAUSE", Enabled, Break ){
                Break( PauseRemote <> 0 )
Aimp("PAUSE")
                OOSD.ActionPreset(Pause)
  }
В данном случае ловушка называется PauseRemote, и вызывается кнопкой Pause настроенной в SlyControl'e. Ключевое слово "Remote" даёт понять SlyControl'у, что это кнопка д.у., а не какая-нибудь другая. Соответственно следует изменить pause, на свою кнопку, чтобы ловушка заработала. Повторюсь, подробнее о настройке читайте в справке. Удачи.
 
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: qzzz on October 03, 2008, 12:05:26
А можно вместо ИК приёмника ДУ пульта использовать напремер ресивер подключённый к компу с его ИК и ДУ.
У меня на пример AV ресивер SONY STR-DE400  ???

Извеняюсь если не совсем по теме.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: Holo on October 05, 2008, 16:46:47
Вопрос скорее к разработчику SlyControl'a, а не ко мне. Если этот ресивер создает какие-то события на компьютере при нажатии кнопок ДУ, значит можно будет написать специальный плагин под него для SlyControl'а. Но сдается мне, что пульт здесь предназначен только для управления самим ресивером.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: qzzz on October 06, 2008, 10:43:15
Не вопрос в другом можноли упровлять через ресивер, использовать ИК ресивера ну короче какнибуть связать его с компом?
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: anman on January 08, 2009, 05:21:26
qzzz,
Ответ Holo дал.

Holo,
Спасибо, пользуюсь)))))
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: mobimo on January 17, 2009, 22:25:08
А не проще написать плагин к Аимпу который эмулирует поведение Winampa, а Слайконтрол уже будет думать что работает винамп и управлять ним. Я так делаю с Light Alloy, в его настройках есть такая эмуляция.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: anman on January 27, 2009, 17:18:46
mobimo,
Проще. Но, есть и другие плееры, которые решили пойти по этому простому пути. В итоге, если настроить горячую клавишу для управления винампом, все остальные проги тоже на неё среагируют. Это ппц тупо.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: proskill on April 02, 2009, 10:11:38
возникла такая проблема: вообщем если с окна аимпа спадает фокус то нажатие на кнопку AUDIO  обратно фокус на окно аимпа не возвращает (под словом фокус имеется в виду активное в данный момент окно)... хотя внизу в панели задач аимповская вкладка моргает (что свидетельствует о каком то произошедшем событии) но аимп ни на что не реагирует (кнопки пауза плей итд итп)... если аимп запускается нажатием на кнопку AUDIO, то все нормально все кнопки работают (аимп управляется). в чем может быть затык?
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: leovitiaz on July 18, 2009, 18:51:39
1. Как с помощью пульта включить визуализацию?
2. Как с помощью пульта переключаться с закладки на закладку плейлиста?

Какие команды slycontrol за это отвечают? Или сочитание клавиш.
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: avkurshin on September 01, 2009, 20:58:21
У меня вопрос - будет ли этот плагин работать с WinLIRC?
Title: Re: Дистанционное управление AIMP'ом через SlyControl
Post by: vetall10 on August 19, 2010, 09:34:47
У меня такая проблема
Aimp вобще не запускается потому что h = WinMon.ActionPreset(aimp ) у меня всегда не 0 даже если плеер не запущен.
что я делаю не так?

Aimp = load( "Apps\Aimp\Aimp.dll" )

AIMP_Always = Group( Enabled ){
  OnGroupEnable(){ WinMon.StartPreset( AIMP ) }

  AIMP_Start = Hook( "AUDIO", "AIMP", Enabled, Break,10 ){
                 h = WinMon.ActionPreset(aimp )
                OSD.ActionManual( " count=%d",  h)              
                      Skip( 2, h = 0 )
                      WinCtrl( "ACTIVATE", h )
                      Skip( 2 )
                 e = ExecFile( "C:\Program Files\aimp2\aimp2.exe" )
                     Break( e = 0 )
                     GroupEnable( Aimp )
  }