AIMP Forum

AIMP for Windows => Skin Editor, Skin Engine => Вопросы / Questions => Topic started by: HyperOne on March 08, 2016, 17:54:15

Title: Shuffle + Repeat в одном переключателе
Post by: HyperOne on March 08, 2016, 17:54:15
Правильно ли я набираю строки в скрипте?:
Code: [Select]
FindObject('acPlayerRepeat').execute; //переключить Repeatи
Code: [Select]
FindObject('acPlayerShuffle').execute; //переключить Shuffle...потому как состояния этих переключателей таким образом не переключаются. И вообще окном отладчика пользоваться не научился. Он у меня всегда пуст.
Title: Re: Команда 'execute'
Post by: Black_AVP on March 08, 2016, 20:11:30
Правильно ли я набираю строки в скрипте?:
Code: [Select]
FindObject('acPlayerRepeat').execute; //переключить Repeatи
Code: [Select]
FindObject('acPlayerShuffle').execute; //переключить Shuffle...потому как состояния этих переключателей таким образом не переключаются.
Правильно, к подобным провайдерам можно обращаться в упрощенном виде. Всё переключается, после каждой команды состояние меняется на противоположное.
Как вы определяете, что переключилось?

...И вообще окном отладчика пользоваться не научился. Он у меня всегда пуст.
Для того, чтобы в отладочном окне что=то отображалось, это что-то надо выводить процедурой
OutputDebugString(IntToStr(State));
Вместо State может быть любая переменная , объявленная в скрипте.
Title: Re: Команда 'execute'
Post by: HyperOne on March 09, 2016, 21:31:21
Вопрос решил. Я связал кнопку со скриптом не добавив Value + ScrollDelta. Теперь другой вопрос, который не описывается в справочнике. Как получить значение с TASELogicalOperatorCommutator, если не следующим методом:
Code: [Select]
case FindObject('NewLogicalOperatorCommutator').Get('Result') of
  0:
    ...
    ...
Просто так он выдаёт ошибку:
Code: [Select]
NewScriptableOperatorCounter: Property Result does not exist
Напрямую к Repeat и Shuffle пытаюсь обратиться, только со State, результат такой же.
Title: Re: Команда 'execute'
Post by: Black_AVP on March 09, 2016, 21:56:22
У коммутаторов нет свойства Result и получить его нельзя, равно как и у acPlayerRepeat нет свойства State, по крайней мере они не являются публичными.
Как вариант, можно подключить к этим выводам обычный счётчик и из скрипта считывать его состояние - это работает.

P.S. Если не секрет, что за задача такая - обращаться к провайдерам acPlayerRepeat, acPlayerShuffle через скрипты?
Title: Re: Команда 'execute'
Post by: HyperOne on March 09, 2016, 22:16:49
Если не секрет, то я сделал одну кнопку-переключатель с тремя состояниями: "По порядку->повтор трека->случайный порядок" вместо двух кнопок, для Трея, для особой компактности.

Классный способ, спасибо!

P.S.: Я случайно ошибся разделом на форуме, у них названия одинаковые.
Title: Re: Команда 'execute'
Post by: Black_AVP on March 09, 2016, 22:32:10
Ну, вообще то, в таком случае должно быть 4 сосотояния:
- всё выключено
- включен Shuffle
- включен Repeat
- влючены оба.
Title: Re: Команда 'execute'
Post by: HyperOne on March 09, 2016, 22:46:50
4-е состояние есть:
Code: [Select]
procedure Execute(var State: Integer);
var
  Rp : TComponent;
  Sf : TComponent;
  Ct : TComponent;
begin
  Rp:= FindObject('acPlayerRepeat');
  Sf:= FindObject('acPlayerShuffle');
  Ct:= FindObject('ShuffpeatCounter');
  case Ct.Get('Position') of
  0:   
      begin
        Rp.Execute
      end;
  1:
      begin
        Rp.Execute;
        Sf.Execute
      end;
  2:
      begin
        Sf.Execute
      end;
  3:
      begin
        Rp.Execute
      end;
  end;
end;
Только он недоступен для такой кнопки. Единственная разница между "включён Repeat" и "включены оба" – в том, какой будет следующий трек при ручном листании. С последнего состояния, при нажатии, прыгает сразу к "2:"
Title: Re: Команда 'execute'
Post by: Black_AVP on March 09, 2016, 22:59:55
Тут ещё может быть неприятный момент - рассинхронизация счётчика, поскольку провайдеры при каждом проходе скрипта просто инвертируют своё состояние, а не привязаны жёстко к позиции счётчика. Если пользователь в главном окне включит обычной кновкой Repeat или Shuffle - то потом в трее алгоритм нарушится.
По ходу, придётся проверять State...
Title: Re: Команда 'execute'
Post by: HyperOne on March 09, 2016, 23:28:18
Тут ещё может быть неприятный момент - рассинхронизация счётчика, поскольку провайдеры при каждом проходе скрипта просто инвертируют своё состояние, а не привязаны жёстко к позиции счётчика. Если пользователь в главном окне включит обычной кнопкой Repeat или Shuffle - то потом в трее алгоритм нарушится.
Всё стабильно, на баги проверено.
acPlayerShuffle и acPlayerRepeat своими state-ами привязаны к коммутатору. То есть они твёрдо зависят от состояния из плеера, не из скина.
В параметрах:
Code: [Select]
If(Value1=0 AND Value2=0,0,If(Value1=0 AND Value2=1,1,If(Value1=1 AND Value2=0,2,3)))Коммутатор связан с счётчиком, с счётчика считывается значение, скриптом выполняются только действия плеера. От скриптов связей нет, только К скриптам от кнопки. Position скрипта в принципе вообще не нужен.
Title: Re: Команда 'execute'
Post by: Black_AVP on March 10, 2016, 08:27:00
В параметрах:
Code: [Select]
If(Value1=0 AND Value2=0,0,If(Value1=0 AND Value2=1,1,If(Value1=1 AND Value2=0,2,3)))
Что эквивалентно: Value1 * 2 + Value2
Title: Re: Shuffle + Repeat в одном переключателе
Post by: HyperOne on March 25, 2016, 22:07:46
Баги всё-таки есть, проявляются при запуске Aimp-а, там же запускается скрипт. Решил проблему таким образом:
Добавил If перед case на проверку State. Кнопка нажимается, State меняется на 1. Если State = 1, то исполняются действия и заодно последней строкой State:=0 заряжается для следующего нажатия. При запуске Aimp-а, действия не работают, так как State по умолчанию 0.
Code: [Select]
procedure Execute(var State: Integer);
var
  Rp : TComponent;
  Sf : TComponent;
  Ct : TComponent;
begin
  Rp:= FindObject('acPlayerRepeat');
  Sf:= FindObject('acPlayerShuffle');
  Ct:= FindObject('ShuffpeatCounter');
  If State Then
  case Ct.Get('Position') of
  0:   
      begin
        Rp.Execute
      end;
  1:
      begin
        Rp.Execute;
        Sf.Execute
      end;
  2:
      begin
        Sf.Execute
      end;
  3:
      begin
        Rp.Execute
      end;
  end;
  State:=0
end;
Один раз баг при этом проявился, но его повторить пока не смог. при смене скина и при его установке.
Title: Re: Shuffle + Repeat в одном переключателе
Post by: Black_AVP on March 25, 2016, 22:13:57
Для MainForm есть ещё  скрипт OnLoaded - он может помочь в установке начальных значений.
Title: Re: Shuffle + Repeat в одном переключателе
Post by: HyperOne on March 25, 2016, 22:31:46
В данной ситуации у меня тормозит счётчик. Он сохраняет последнее значение перед сменой обложки на любую, затем воспроизводит такое же значение (даже не по умолчанию), при смене обратно. Коммутатор, в отличии от счётчика, всё успевает.