1 (изменено: Alectric, 2019-02-06 18:15:28)

Тема: AHK: Аудио компрессор для windows 7,8,10

Вот скрипт аудио-компрессора для Windows 7 на основе VA.ahk.
Подумал что кому-нибудь пригодится.

Компрессор нужен для выравнивания громкости.
Т.е. если воспроизводится тихий звук в плеере или еще где-либо - компрессор повысит громкость; если звук слишком громкий, то соответственно понизит.
Уровни срабатывания и задержка выставляются в "GUI", как и другие настройки.

Наведите курсор на элемент управления чтобы увидеть описание.

Подробнее.

#NoEnv
#SingleInstance,off
AutoTrim,Off
CoordMode,Mouse,Screen
;CoordMode,ToolTip
Menu,Tray,UseErrorLevel
process,priority,,high
;SendMode,Input
SetBatchLines,-1
SetControlDelay,0
;SetKeyDelay,0
SetWinDelay,-1
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On
DetectHiddenWindows,On
#Include VA.ahk
#NoTrayIcon
IID_IASM2:="{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
IID_IASC2:="{bfb7ff88-7239-4fc9-8fa2-07c950be9c6d}"
IID_ISAV:="{87CE5498-68D6-44E5-9215-6DA47EF883D8}"
IID_AM:="{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
global Message, wP, lP, MainNotExist, borderX, App, guiid, AppCount, MainWeight:=175
, Weight:=186, WM_HSCROLL:=0x114, guiexist, exit, ListWin, List, AppEXE, WheelVol
OnMessage(0x1002,"Message")
if !winexist("Compressor Win 7 Main")
  MainNotExist=1
onexit,exit

App=%0%
Appexe=%1%
AppPID=%2%
AppTurnOn=%3%

WinGet,ActiveWin,id,A
Menu,Tray,NoStandard
if !App
{
  if !MainNotExist
  {
    msgbox,Программа уже открыта.
    alreadyexit:=1
    exitapp
  }
  OnMessage(WM_HSCROLL, "WM_HSCROLL")
  Menu,Tray,Icon
  Menu,Tray,Icon,%A_ScriptDir%\va.ico
}
else if MainNotExist
{
  Menu,Tray,Icon
  Menu,Tray,Icon,%A_ScriptDir%\va.ico
}
Menu,Tray,add,Нормализация громкости,ShowWin
Menu,Tray,add,Exit,Exit
Menu,Tray,default,Нормализация громкости

if !App
  Settingspath:="SOFTWARE\AlectricSoft\Compressor"
else
  Settingspath:="SOFTWARE\AlectricSoft\Compressor\" appexe
if !App
  SettingsDefault=
(
dovol=40
dovoltime=0
FadeIn=1
FadeInSpeed=0.7
FadeOut=0
FadeOutSpeed=0.7
flatdown=2
flatup=3
gain=1
GuiX=0
GuiY=0
Hide=0
Impulse=1
Impulsesettime=300
linearity=1
Mixer=0
multiplier=30
notebook=0
otvol=0
otvoltime=300
resettimeset=100
ResetToNull=0
smoothdo=0
smoothot=1
timerflatset=150
TurnOn=1
WheelVol=0
work=1
)
else
  SettingsDefault=
(
dovol=35
dovoltime=0
FadeIn=1
FadeInSpeed=0.7
FadeOut=0
FadeOutSpeed=0.7
flatdown=2
flatup=3
gain=0.75
GuiX=0
GuiY=0
Hide=0
Impulse=1
Impulsesettime=300
linearity=1.0
Mixer=0
multiplier=30
notebook=1
otvol=0
otvoltime=300
resettimeset=100
ResetToNull=0
smoothdo=0
smoothot=1
timerflatset=150
TurnOn=1
WheelVol=0
work=0
)
gosub,loadSettings
if (App and !work and TurnOn and AppTurnOn)
{
  TurnOn:=0
  work:=1
}
process,exist
CompressorPID:=errorlevel
ListWin.= CompressorPID "`,"

if (GuiX>a_screenwidth)
  GuiX-=(GuiX-a_screenwidth+200)
if (GuiY>a_screenheight)
  GuiY-=(GuiY-a_screenheight+200)

if !App
{
  audioMeter:=VA_GetAudioMeter()
  vol:=newvol:=newvolset:=multiplier
  returnvol:=VA_GetMasterVolume()
  VA_SetMasterVolume(newvol,"","")
}
else
{
  if winexist("Compressor for " . AppPID)
  {
    winclose,% "Compressor for " . AppPID
    sleep,300
  }
  gosub,GetVolumeObject
  VA_ISimpleAudioVolume_GetMasterVolume(AppVol,vol)
  vol*=100
  newvol:=newvolset:=vol
}
VA_GetDevicePeriod("capture", devicePeriod)
VarSetCapacity(involValues, 8)

linearityS:=linearity*10
Gui,2:font,s8,Tahoma
Gui,2:+hwndhlinearity +ToolWindow +AlwaysOnTop
Gui,2:Add,Slider,+hwndS_0 xm  ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_0
Gui,2:Add,Slider,+hwndS_1 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_1
Gui,2:Add,Slider,+hwndS_2 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_2
Gui,2:Add,Slider,+hwndS_3 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_3
Gui,2:Add,Slider,+hwndS_4 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_4
Gui,2:Add,Slider,+hwndS_5 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_5
Gui,2:Add,Slider,+hwndS_6 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_6
Gui,2:Add,Slider,+hwndS_7 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_7
Gui,2:Add,Slider,+hwndS_8 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_8
Gui,2:Add,Slider,+hwndS_9 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_9
Gui,2:Add,Slider,+hwndS_10 x+1 ym w20 h200 Vertical Invert Center NoTicks Range0-100 vlinty_10
Gui,2:Add,text,+hwndS_20 xm y+5 w20 Center,0
Gui,2:Add,text,+hwndS_21 x+1 yp w20 Center,10
Gui,2:Add,text,+hwndS_22 x+1 yp w20 Center,20
Gui,2:Add,text,+hwndS_23 x+1 yp w20 Center,30
Gui,2:Add,text,+hwndS_24 x+1 yp w20 Center,40
Gui,2:Add,text,+hwndS_25 x+1 yp w20 Center,50
Gui,2:Add,text,+hwndS_26 x+1 yp w20 Center,60
Gui,2:Add,text,+hwndS_27 x+1 yp w20 Center,70
Gui,2:Add,text,+hwndS_28 x+1 yp w20 Center,80
Gui,2:Add,text,+hwndS_29 x+1 yp w20 Center,90
Gui,2:Add,text,+hwndS_30 x+1 yp w20 Center,100
Gui,2:Add,text,+hwndS_31 xm y+5 w20 Center,0
Gui,2:Add,text,+hwndS_32 x+1 yp w20 Center,10
Gui,2:Add,text,+hwndS_33 x+1 yp w20 Center,20
Gui,2:Add,text,+hwndS_34 x+1 yp w20 Center,30
Gui,2:Add,text,+hwndS_35 x+1 yp w20 Center,40
Gui,2:Add,text,+hwndS_36 x+1 yp w20 Center,50
Gui,2:Add,text,+hwndS_37 x+1 yp w20 Center,60
Gui,2:Add,text,+hwndS_38 x+1 yp w20 Center,70
Gui,2:Add,text,+hwndS_39 x+1 yp w20 Center,80
Gui,2:Add,text,+hwndS_40 x+1 yp w20 Center,90
Gui,2:Add,text,+hwndS_41 x+1 yp w20 Center,100
Gui,2:Add,Slider,+hwndS_11 xm y+10 w230 Center NoTicks Range1-100 vlinearityS AltSubmit gChangelinearity,% linearity*10
Gui,2:Add,text,+hwndS_12 xm+10 y+20,10.00000
Gui,2:Add,button,+hwndS_13 x+10 yp-4 gDefaultlinty gDefaultlinty,Поумолчанию ;
control,disable,,,ahk_id %S_0%
control,disable,,,ahk_id %S_1%
control,disable,,,ahk_id %S_2%
control,disable,,,ahk_id %S_3%
control,disable,,,ahk_id %S_4%
control,disable,,,ahk_id %S_5%
control,disable,,,ahk_id %S_6%
control,disable,,,ahk_id %S_7%
control,disable,,,ahk_id %S_8%
control,disable,,,ahk_id %S_9%
control,disable,,,ahk_id %S_10%

Gui,1:font,s8,Tahoma
Gui,1:Margin,0,4

Gui,1:Add,Button,+hwndE_1 x0 y0 w%MainWeight% h0 BackgroundGray
ControlGetPos,Left,,MainWeight,,,ahk_id %E_1%

Gui,1:+owner -sysmenu +ToolWindow +hwndguiid
if (!App or MainNotExist)
{
  if !App
    Gui,1:+resize
  Gui,1:+alwaysontop
}
else
{
  Gui,1:+0x40000000 -0x80000000
  Gui,1:add,groupbox,x0 y0 w170 h470,%appexe%
}
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Button,+hwndE_2 x54 y0 h7 w31 GReloadSettings
Gui,1:Add,Button,+hwndE_46 x130 y240  GlinearitySettings,_/
Gui,1:Add,Slider,+hwndE_3 x10 y12 w20 h210 Vertical Invert Center NoTicks Range0-100 vmultiplier,%multiplier%
Gui,1:Add,Slider,+hwndE_4 x+2 yp w20 h210 Vertical Invert NoTicks votvol,%otvol%
Gui,1:Add,Progress,+hwndE_5 x+2 yp+6 w6 h198 Vertical cGray vVolumein
Gui,1:Add,Progress,+hwndE_6 x+0 yp w20 h198 Vertical cBlue vVolumeout
Gui,1:Add,Progress,+hwndE_7 x+0 yp w6 h198 Vertical cGray vVolumein2
Gui,1:Add,Slider,+hwndE_8 x+2 yp-6 w20 h210 Vertical Invert Left NoTicks vdovol,%dovol%
Gui,1:Add,Slider,+hwndE_9 x+2 yp-2 h214 Backgroundyelow Vertical Thick20 Invert Center NoTicks vnewvolset,%newvol%
Gui,1:Add,Slider,+hwndE_10 x+2 yp h214 Range0-200 Vertical Thick20 Invert Center NoTicks vSetgain,% tmpgain:=round(gain*100)
;-------------------------------------------------------------------------------------------------
Gui,1:Add,text,+hwndE_11 x8 y+1 w20 vmultipliertext Center
Gui,1:Add,text,+hwndE_12 x+3 yp w20 votvoltext Center
Gui,1:Add,text,+hwndE_13 x+9 yp w20 vOutvoltext Center
Gui,1:Add,text,+hwndE_14 x+7 yp w20 vdovoltext Center
Gui,1:Add,text,+hwndE_15 x+5 yp w20 vvolnow Center
Gui,1:Add,text,+hwndE_16 x+7 yp w20 vgainset Center
;-------------------------------------------------------------------------------------------------
Gui,1:Add,CheckBox,+hwndE_17 x33 y+5 Checked%smoothot% vsmoothot,smooth
Gui,1:Add,CheckBox,+hwndE_18 x+6 yp Checked%smoothdo% vsmoothdo
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Edit,+hwndE_19 x23 y+6 w35 -Multi Center votvoltime,%otvoltime%
Gui,1:Add,text,+hwndE_20 x+1 yp+3 w24 Center,ms
Gui,1:Add,Edit,+hwndE_21 x+1 yp-3 w35 -Multi Center vdovoltime,%dovoltime%
Gui,1:Add,text,+hwndE_22 x+1 yp+3 w40 vnewvolsettext Center
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Edit,+hwndE_23 x23 y+10 w35 -Multi Center vflatup,%flatup%
Gui,1:Add,text,+hwndE_24 x+1 yp+3 w24 Center vdevicePeriodtext
Gui,1:Add,Edit,+hwndE_25 x+1 yp-3 w35 -Multi Center vflatdown,%flatdown%
Gui,1:Add,Edit,+hwndE_26 x+1 yp w35 -Multi Center vtimerflatset,%timerflatset%
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Progress,x5 y+6 w159 h2 BackgroundGray ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Edit,+hwndE_27 x5 y+6 w50 -Multi Center vresettimeset,%resettimeset%
Gui,1:Add,CheckBox,+hwndE_28 x+6 yp+3 w60 Checked%FadeIn% vFadeIn,Fade In
Gui,1:Add,Edit,+hwndE_29 x+3 yp-3 w40 -Multi Center vFadeInSpeed,%FadeInSpeed%
Gui,1:Add,CheckBox,+hwndE_30 x61 y+1 w61 Checked%FadeOut% vFadeOut,Fade Out
Gui,1:Add,Edit,+hwndE_31 x+2 yp+3 w40 -Multi Center vFadeOutSpeed,%FadeOutSpeed%
Gui,1:Add,CheckBox,+hwndE_32 x10 y+3 w150 Checked%ResetToNull% vResetToNull,Сбрасывать до нуля ;
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Progress,x5 y+6 w159 h2 BackgroundGray ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,1:Add,CheckBox,+hwndE_34 x10 y+10 w57 Checked%Impulse% vImpulse,Impulse
Gui,1:Add,Edit,+hwndE_35 x+1 w50 yp-3 -Multi Center vImpulsesettime,%Impulsesettime%
Gui,1:Add,text,+hwndE_36 x+1 yp+3 w20 Center,ms
Gui,1:Add,text,+hwndE_37 x+1 yp w30 left vLastImpulse
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Progress,x5 y+10 w159 h2 BackgroundGray ;------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,1:Add,CheckBox,+hwndE_39 x10 y+10 w150 +multi Checked%work% vwork,Нормализация включена
if !App
{
  Gui,1:Add,CheckBox,+hwndE_40 x10 w150 +multi Checked%Hide% vHide,Скрывать при переходе на другое окно ;
  Gui,1:Add,CheckBox,+hwndE_41 x10 w70 +multi Checked%notebook% gNotebooke vnotebook,Ноутбук ;
  Gui,1:Add,CheckBox,+hwndE_43 x10 y+9 w160 +multi Checked%Mixer% gMixer vMixer,Микшер ;
  Gui,1:Add,CheckBox,+hwndE_38 x10 y+5 w160 +multi Checked%WheelVol% vWheelVol,Регулировать громкость роликом мыши ;
  Gui,1:Add,Progress,x170 y4 w3 h550 BackgroundBlue Vertical ;------------------------------------------------------
  Gui,1:Add,Button,+hwndE_44 x187 y472 w70 h30 GRefrash,Обновить ;
  Gui,1:Add,CheckBox,+hwndE_45 xp y+3 w160 +multi Checked%TurnOn% vTurnOn,Всегда включать нормализацию для новых приложений ;
}
else
  Gui,1:Add,Progress,x167 y7 w3 h460 BackgroundBlue Vertical ;------------------------------------------------------
;-------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,1:Add,Button,+hwndE_42 x165 y0 h5 w5 GExit,-
;-------------------------------------------------------------------------------------------------
if !App
{
  Gui,1:+0x100000
  Gui,1:Show,NA x%GuiX% y%GuiY% w170 h552,Compressor Win 7 Main
  gosub,mixer
  UpdateScrollBar(guiid,MainWeight+MainWeight*AppCount,E_1)
}
else
{
  if hwndP:=winexist("Compressor Win 7 Main")
  {
    Notebook:=1
    Gui,1:-border
    guiexist:=0
;    if !isWindowFullScreen(AppPID)
;    {
      SetParent(guiid,hwndP,,(Left+MainWeight+MainWeight))
      Gui,1:Show,NA w170 h460,Compressor for %AppPID%
;      winactivate,ahk_id %ActiveWin%
      guiexist:=1
;    }
;    else
;      lategui:=1
  }
  else
    Gui,1:Show,NA x%GuiX% y%GuiY% w170 h521,Compressor for %AppPID%
}

control,disable,,,ahk_id %E_9%

GuiControl,,multipliertext,%multiplier%
GuiControl,,otvoltext,%otvol%
GuiControl,,dovoltext,%dovol%
GuiControl,,devicePeriodtext,%devicePeriod%
GuiControl,,Setgain,% tmpgain


if (!App and hide)
  Gui,1:hide
if !lategui
  guiexist:=!hide

if !App
{
  gosub,guiexisttoapps
  Gui,5:+hwndInfoWinHWND -Caption +ToolWindow +AlwaysOnTop +E0x08000020
  Gui,5:Color,Gray
  Gui,5:Margin,0,0
  Gui,5:font,s60,Castellar
  Gui,5:add,text,x30 y180 w180 center vInfoVolume,123
  Gui,5:Add,Progress,x55 y5 w180 h170 cwhite BackgroundGray vInfoVolumep2
  Gui,5:Add,Progress,x55 y10 w180 h160 cBlack BackgroundGray vInfoVolumep
  WinSet,Transparent,255,ahk_id %InfoWinHWND%
  Gui,5:Show,center NoActivate,Volume
  WinSet,TransColor,Gray,ahk_id %InfoWinHWND%
  Gui,5:hide
  ;------------------------------------------------------------------------
  Gui,4:+hwndImageHWND -Caption +ToolWindow +E0x08000020
  Gui,4:Color,white
  Gui,4:Margin,0,0
  SetParent(ImageHWND,InfoWinHWND,0,0)
  WinSet,Region,0-60 20-60 40-0 50-0 50-180 40-180 20-120 0-120 ,ahk_id %ImageHWND%
  Gui,4:Show, w300 h300 NoActivate,Image
  WinSet,Transparent,255,ahk_id %ImageHWND%
  WinMove,ahk_id %ImageHWND%,,0,0
  ;------------------------------------------------------------------------
  Gui,3:+hwndImage2HWND -Caption +ToolWindow +E0x08000020
  Gui,3:Color,black
  Gui,3:Margin,0,0
  SetParent(Image2HWND,ImageHWND,0,0)
  WinSet,Region,2-62 22-62 42-2 48-2 48-178 42-178 22-118 2-118 ,ahk_id %Image2HWND%
  Gui,3:Show, w300 h300 NoActivate,Image
  WinSet,Transparent,255,ahk_id %Image2HWND%
  WinMove,ahk_id %Image2HWND%,,0,0
}

loop:
loop
{
  if Message
  {
    Message:=
    if wP=1
      exit:=1
    else if wP=2
      guiexist:=lP
    else if wP=3
    {
      winmove,ahk_id %guiid%,,% MainWeight+(MainWeight-11)*(lP-1),0
      WinSet,redraw,,ahk_id %guiid%
    }
;    else if wP=4
;      ListWin.=lP "`,"
  }
  if (App and exit)
    goto,exit
  if !notebook
    savegain:=gain, gain:=1
  if Fail
  {
    sleep,1000
    if !App
    {
      ObjRelease(AudioMeter)
      audioMeter:=VA_GetAudioMeter()
      if audioMeter
        Fail:=0
    }
    else
    {
      gosub,GetVolumeObject
      if AppVol
        Fail:=0
      else
        exit:=1
    }
    continue
  }
  sleep,% devicePeriod+10
  voltime:= oldvoltime="" ? 0 : a_tickcount-oldvoltime
  oldvoltime:=a_tickcount

  VA_IAudioMeterInformation_GetPeakValue(audioMeter,involValue)
  if (old_involValue=involValue)
  {
    resetcompressor+=1
    if !App
    {
      if (resetcompressor=1000)
      {
        resetcompressor:=
        ObjRelease(AudioMeter)
        audioMeter:=VA_GetAudioMeter()
      }
      else if !audioMeter
        Fail:=1
    }
    else
    {
      if (resetcompressor=200)
      {
        resetcompressor:=
        gosub,GetVolumeObject
      }
      else if !AppVol
        Fail:=1
    }
    if (resetcompressor>100)
      sleep,10
;tooltip,% resetcompressor "`n" AppVol "`n" AudioMeter "`n" Fail
  }
  else
    resetcompressor:=
  old_involValue:=involValue
  Old_invol:=invol
  invol:=VA_Scalar2dB(involValue**linearity,0,1)*100
  Outvol:=newvol*invol/100/gain
  if (Outvol<0 or resetnow)
    Outvol:=0
;  invol:=round(invol)
;  Outvol:=round(Outvol)
;  tooltip,"%invol%"`n"%Outvolcoeff%"`n"%Outvol%"
  if !App
    vol:=round(VA_GetMasterVolume(),2)
  else
  {
    VA_ISimpleAudioVolume_GetMasterVolume(AppVol,vol)
    vol*=100
  }
;tooltip,% """" round(vol) """`n""" round(newvol) """`n""" gain """" """`n""" newvol """"
  if (round(newvol)<100 and round(vol)!=round(newvol))
  {
;tooltip,% round(vol) "`n" round(newvol) "`n" gain
    wait:=200+voltime
    if (notebook and !App)
    {
      resetnow:=1
      if !App
      {
        gain:=gain<0 ? 0 : gain>2 ? 2 : gain
        gain:=(gain*100+(vol-newvol)*3)/100
        tmpgain:=Round(gain*100)
        GuiControl,,Setgain,% tmpgain
        GuiControl,,newvolset,% vol
        tooltip,% tmpgain
        settimer,removetooltip,-1000
      }
      if gain=0
        vol:=newvol:=0
;tooltip,% """" vol """`n""" newvol """`n""" gain
    }
    newvolset:=newvol:=vol
    if guiexist
      GuiControl,,newvolset,% round(newvol)
  }
  if !winactive("ahk_exe SndVol.exe")
    wait:=0
  else if (wait and !GetKeyState("lbutton","P"))
    wait:=wait>0 ? wait-voltime : 0
  temp4+=1
  if (App and temp4>100)
  {
    hwndP:=winexist("Compressor Win 7 Main")
    temp4:=
    if (!MainNotExist and !hwndP) or (MainNotExist and hwndP)
      exit:=1
  }
; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  if (work and gain!=0 and !wait)
    gosub,Align
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  if (hide and guiexist)
  {
    winget,pid,PID,A
    if !instr(ListWin,pid+0)
    {
;tooltip,% ListWin "`n" guiid+0 "`n" id+0
      wingetpos,GuiX,GuiY,,,ahk_id %guiid%
      guiexist:=0
      Gui,1:hide
      if !App
        gosub,guiexisttoapps
    }
  }
;tooltip,%ottime%`n%volmaxtime%`n%resettime%`n%newvol%`n
;tooltip,% gain "`n" newvol

; --------------------------------------------------------------------------
  temp3+=1
  if (Mixer and temp3>100)
  {
    temp3:=
    loop,parse,List,`,
    {
      if !a_loopfield
        continue
      process,exist,% a_loopfield
      if !errorlevel
      {
        PostMessage,0x1002,1,,,% "ahk_pid " Compr%a_loopfield%
        AppCount--
        ListWin:=RegExReplace(ListWin, Compr%a_loopfield% "`,", "")
        List:=RegExReplace(List, a_loopfield "`,", "")
        gosub,Refrash
      }
    }
    ; GetDefaultAudioEndpoint
    ObjRelease(DAE)
    try DAE:=VA_GetDevice()
    ; activate the session manager
    ObjRelease(IASM2)
    try VA_IMMDevice_Activate(DAE,IID_IASM2,0,0,IASM2)
    ; enumerate sessions for on this device
    ObjRelease(IASE)
    try VA_IAudioSessionManager2_GetSessionEnumerator(IASM2,IASE)
    try VA_IAudioSessionEnumerator_GetCount(IASE,Count)
    AppCount:=
    Loop,% Count
    {
      ; Get the IAudioSessionControl object
      ObjRelease(IASC)
      try VA_IAudioSessionEnumerator_GetSession(IASE,A_Index-1,IASC)
      ; Query the IAudioSessionControl for an IAudioSessionControl2 object
      ObjRelease(IASC2)
      try IASC2:=ComObjQuery(IASC,IID_IASC2)
      ; Get the sessions process ID
      try VA_IAudioSessionControl2_GetProcessID(IASC2,SPID)
      process,exist,% SPID
      if (!SPID or !ErrorLevel)
        continue
      WinGet,ProcName%SPID%,ProcessName,ahk_pid %SPID%
      if (ProcName%SPID%="explorer.exe")
        continue

      AppCount++
      if !instr(List,SPID)
      {
        List.= SPID "`,"
        if a_iscompiled
          run,% a_scriptfullpath " " ProcName%SPID% " " SPID " " TurnOn,,UseErrorLevel,RPID
        else
          run,% """" a_ahkPath """ """ a_scriptfullpath """ " ProcName%SPID% " " SPID " " TurnOn,,UseErrorLevel,RPID
        Compr%SPID%:=RPID
        ListWin.= RPID+0 "`,"
        winwait,% "ahk_pid " Compr%SPID%,,3
        gosub,Refrash
      }
    }
  ;tooltip,% a_tickcount "`n" AppCount "`n`n" list "`n" class "`t|" ahkPath "|"
  }
; --------------------------------------------------------------------------
  temp2++
  if (temp2>1000)
  {
    mousegetpos,,,mwin
    WinGet,mpid,PID,ahk_id %mwin%
    if (lategui and mpid and mpid!=AppPID)
    {
      lategui:=0
      SetParent(guiid,hwndP,,(Left+MainWeight+MainWeight))
      Gui,1:Show,NA w170 h460,Compressor for %AppPID%
      guiexist:=1
    }
  }
  if guiexist
  {
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, 2, &involValues)
    involL:=VA_Scalar2dB(NumGet(involValues, 0, "float")**linearity,0,1)*100
    involR:=VA_Scalar2dB(NumGet(involValues, 4, "float")**linearity,0,1)*100
    Gui,1:submit,nohide
    gain:=Setgain/100
    tmpgain:=Round(gain*100)
    GuiControl,,Volumein,%involL%
    GuiControl,,Volumein2,%involR%
    GuiControl,,Volumeout,%Outvol%
    Outvolshow+=1
    Outvoltextt+=Outvol
    if !work
    {
;tooltip,% vol "`t" newvol "`n" newvolset
      if (round(vol)!=round(newvolset))
      {
        if !App
          VA_SetMasterVolume(round(newvolset),"","")
        else
          VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvolset/100)
        vol:=newvolset
      }
    }
    if (Outvolshow>10)
    {
      Outvolshowt:=Outvoltextt/Outvolshow
      GuiControl,,Outvoltext,% Round(Outvolshowt)
      Outvolshow:=
      Outvoltextt:=
      GuiControl,,volnow,% Round(newvol)
      GuiControl,,gainset,% tmpgain

    }
    if (multipliertext!=multiplier)
    {
      multipliertext:=multiplier
      GuiControl,,multipliertext,%multipliertext%
    }
    if (otvoltext!=otvol)
    {
      otvoltext:=otvol
      if (otvol>dovol)
      {
        temp:=otvol+1
        GuiControl,,dovol,%temp%
        GuiControl,,dovoltext,%temp%
      }
      GuiControl,,otvoltext,%otvol%
    }
    if (dovoltext!=dovol)
    {
      dovoltext:=dovol
      if (dovol<otvol)
      {
        temp:=dovol-1
        GuiControl,,otvol,%temp%
        GuiControl,,otvoltext,%temp%
      }
      GuiControl,,dovoltext,%dovol%
    }

    temp1+=1
    if (temp1>100 and !tooltipshow)
    {
      temp1:=
      if !FadeOut
        control,enable,,,ahk_id %E_27%
      else
        control,disable,,,ahk_id %E_27%
      if !work
        control,enable,,,ahk_id %E_9%
      else
        control,disable,,,ahk_id %E_9%
      if notebook
        control,enable,,,ahk_id %E_10%
      else
        control,disable,,,ahk_id %E_10%
;      if (!App or MainNotExist)
;      {
;        Gui,1:-AlwaysOnTop
;        Gui,1:+AlwaysOnTop
;      }
    }
    if (A_TimeIdle>300 and !tooltipshow)
    {
      tooltipshow:=1
      mousegetpos,,,mwin,mctrl
      if (mctrl and (mwin=guiid or mwin=hlinearity or mwin=hwndP))
      {
        ControlGet,hElement,hwnd,,%mctrl%,ahk_id %mwin%
        if (hElement=E_38)
          tooltip,Если курсор мыши находится над панелью задач.
        else if (hElement=E_2)
          tooltip,Сбросить настройки.
        else if (hElement=E_3)
          tooltip,Уровень громкости`, к которому`nстремится выходной уровень.
        else if (hElement=E_4)
          tooltip,Уровень сигнала`, ниже которого`nгромкость будет нарастать`nс интервалом %otvoltime% ms.
        else if (hElement=E_8)
          tooltip,Уровень сигнала`, выше которого`nгромкость будет убывать`nс интервалом %dovoltime% ms.
        else if (hElement=E_9)
          tooltip,Текущий уровень громкости.`n`nМожно регулировать только`,`n если нормализация выключена.
        else if (hElement=E_10)
          tooltip,% "Усиление.`nПроцент от уровня стремления`n" tmpgain "`% от " multiplier
        else if (hElement=E_5)
          tooltip,Входной уровень.`nЛевый канал.
        else if (hElement=E_6)
          tooltip,Выходной уровень`nсигнала.
        else if (hElement=E_7)
          tooltip,Входной уровень.`nПравый канал.
        else if (hElement=E_17)
          tooltip,Сглаживание при`nвозрастании громкости.
        else if (hElement=E_18)
          tooltip,Сглаживание при`nубывании громкости.
        else if (hElement=E_19)
          tooltip,Задержка при возрастании`,`nесли уровень ниже %otvol%
        else if (hElement=E_21)
          tooltip,Задержка при убывании`,`nесли уровень выше %dovol%
        else if (hElement=E_23)
          tooltip,% "Скорость увеличения громкости`nпри ""стремлении"" к " multiplier "`n" flatup " единиц громкости за " timerflatset*voltime " милисекунд (" timerflatset " цикл(ов) программы)."
        else if (hElement=E_25)
          tooltip,% "Скорость уменьшения громкости`nпри ""стремлении"" к " multiplier "`n" flatdown " единиц громкости за " timerflatset*voltime " милисекунд (" timerflatset " цикл(ов) программы)."
        else if (hElement=E_26)
          tooltip,Количество циклов/измерений для усреднения.
        else if (hElement=E_22)
          tooltip,Последний интервал срабатывания.
        else if (hElement=E_24)
          tooltip,Текущее состояние`n"стремления" к %multiplier%
        else if (hElement=E_27)
          tooltip,Время отсутствия сигнала`, через которое произойдет`nсброс громкости на %multiplier%`n`nЕсли задать 0 - то громкость не будет сбрасываться.
        else if (hElement=E_28)
          tooltip,Восстанавливать громкость`nпосле сброса на %multiplier%
        else if (hElement=E_29)
          tooltip,Скорость восстановления.`n%FadeInSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_30)
          tooltip,Псевдо-FadeOut.`nПостепенно уменьшает громкость до %multiplier%`,`n если звуков не воспроизводится.
        else if (hElement=E_31)
          tooltip,Скорость затухания.`n%FadeOutSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_32)
          tooltip,Сбрасывать громкость почти до нуля`,`n вместо %multiplier%.
        else if (hElement=E_34)
          tooltip,Гасить импульсы короче`, чем %Impulsesettime% милисекунд.
        else if (hElement=E_37)
          tooltip,Длительность последнего восстановленного импульса.
        else if (hElement=E_41)
          tooltip,Режим "Ноутбук".`nРегулирует уровни нормализации синхронно с`nрегулировкой громкости в системе пользователем.
        else if (hElement=E_35)
          tooltip,Длинна импульса для гашения.
        else if (hElement=E_42)
          tooltip,Сохранить настройки и выйти.
        else if (hElement=E_43)
          tooltip,Активирует режим микшера.`nТ.е. нармализацию для всех`n приложений в отдельности.
        else if (hElement=E_46)
          tooltip,Настройки линейности громкости.
        else if instr(S_20 "," S_21 "," S_22 "," S_23 "," S_24 "," S_25 "," S_26 "," S_27 "," S_28 "," S_29 "," S_30,hElement)
          tooltip,Фактический уровень`nгромкости на входе.
        else if instr(S_31 "," S_32 "," S_33 "," S_34 "," S_35 "," S_36 "," S_37 "," S_38 "," S_39 "," S_40 "," S_41,hElement)
          tooltip,Уровень который обрабатывет компрессор.
      }
    }
    else if (A_TimeIdle<100 and tooltipshow)
    {
      tooltipshow:=
      tooltip
    }
  }
}
return

Align:
; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !resetnow
{
  if (Outvol<=otvol and Outvol!=0)
  {
    ottime+=voltime
    if guiexist
      GuiControl,+cBlue,Volumeout
    if (ottime>1 and Outvol!=0 and guiexist and round(newvol)!=100)
      GuiControl,,newvolsettext,%ottime%
    if (ottime>otvoltime)
    {
      ottime:=1
      if otvoltime=0
        newvol+=2
      else if smoothot
        newvol+=1
      else
        newvol+=5
      if newvol<=100
        change=1
    }
  }
  else if ottime!=
  {
    if guiexist
      GuiControl,+cGreen,Volumeout
    ottime:=
  }
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  if (Outvol>dovol and Outvol!=0)
  {
    if (Impulse and !ImpulseExist)
    {
      saveinlevel:=Outvol-5
      savelevel:=newvol
      Impulsetime:=
      ImpulseExist:=1
    }
    if guiexist
    {
      GuiControl,+cRed,Volumeout
      GuiControl,,newvolsettext,%volmaxtime%
    }
    if (Outvol>Outvoltmp)
      Outvoltmp:=Outvol
    volmaxtime+=voltime
    if (volmaxtime>dovoltime)
    {
      volmaxtime:=1
      if dovoltime=0
      {
        if smoothdo
          newvol-=(newvol-dovol*gain)/10+1
        else
          newvol-=(Outvol-dovol)*gain
;            newvol:=(dovol*75+otvol*25)/invol
      }
      else if smoothdo
        newvol-=(newvol-dovol*gain)/10+1
      else
        newvol-=(newvol-dovol*gain)/6+1
      change:=1
    }
    newvol:=newvol<1 ? 1 : newvol
  }
  else if volmaxtime!=
  {
    if guiexist
      GuiControl,+cGreen,Volumeout
    Outvoltmp:=
    volmaxtime:=
  }
; //////||||||||||||||||||||||\\\\\\\\\\\\\\\\\\\\\\\///////////\|||||||||||||\\\\\/////////
  if (Outvol!=0 and Impulse)
  {
    if ImpulseExist
    {
      if (Old_invol<invol)
        ImpulseIn:=1
      else if (Old_invol>invol)
        ImpulseIn:=0
      if ImpulseIn
        Impulsetime+=voltime
      else if (Impulsetime<Impulsesettime and saveinlevel>Outvol)
      {
        rise:=1
        if guiexist
          GuiControl,,LastImpulse,% Impulsetime
      }
      else if (Impulsetime>Impulsesettime)
      {
        rise:=
        ImpulseExist:=
        Impulsetime:=
      }
    }
    if (rise and newvol<savelevel and Impulsetime>0)
    {
      Impulsetime+=voltime
      newvol++
      change:=1
    }
    if (rise and (newvol>savelevel or Impulsetime>Impulsesettime*2))
    {
      rise:=
      ImpulseExist:=
      Impulsetime:=
    }
  }
}
; //////////////////////////////////////////////////////////////////////////////
  if (Outvol>0 and resetdone and FadeIn)
  {
    newvol+=FadeInSpeed
    change:=1
    if (Outvol>multiplier or newvol>100)
      resetdone:=
  }
; //////////////////////////////////////////////////////////////////////////////
  if (FadeOut and Outvol=0 and round(newvol/gain)>(ResetToNull ? 1 : multiplier))
  {
    FadeOutRun:=1
    newvol-=FadeOutSpeed
    change:=1
    if (!ResetToNull and round(newvol/gain)<multiplier+FadeOutSpeed)
      resetnow:=1
  }
  if (FadeOutRun and Outvol>0)
  {
    FadeOutRun:=
    resetnow:=2
  }

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  if ((!FadeOut and resettimeset and Outvol=0 and round(newvol/gain)!=(ResetToNull ? 1 : multiplier)) or resetnow)
  {
    resettime+=voltime
    if guiexist
      GuiControl,,newvolsettext,%resettime%
    if (resettime>resettimeset or resetnow)
    {
      resetdone:=1
      if resetnow!=2
        newvol:=(ResetToNull ? 1 : multiplier*gain)
      change:=1
      resetnow:=
    }
  }
  else if resettime!=
    resettime:=
; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  if (timerflat>timerflatset and Outvol!=0)
  {
    if (minvol>maxvol)
      newvol+=flatup
    else if (minvol<maxvol)
      newvol-=flatdown
    if guiexist
      if (minvol>maxvol)
        GuiControl,,devicePeriodtext,^
      else if (minvol<maxvol)
        GuiControl,,devicePeriodtext,v
    change:=1
    timerflat:=minvol:=maxvol:=0
  }
  else
  {
    timerflat+=1
    if (Outvol>multiplier+(flatup+flatdown)/2)
      maxvol+=1
    else if (Outvol<multiplier-(flatup+flatdown)/2)
      minvol+=1
    else
    {
      if (guiexist and !flatcange)
      {
        GuiControl,,devicePeriodtext,|
        flatcange:=1
      }
      else
        flatcange:=
      timerflat:=0
    }
  }
  newvol:=round(newvol,2)
  newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
  if (change and newvol!=oldvol)
  {
;tooltip,% a_tickcount "`n" newvol
    change:=
    if guiexist
      GuiControl,,newvolset,% newvol
    if !App
      VA_SetMasterVolume(newvol,"","")
    else
      VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
  }
  oldvol:=newvol
; --------------------------------------------------------------------------
return

guisize:
if App
  return
;if (a_cursor!="SizeWE")
;{
;  send,{lbutton up}
;  winmove,ahk_id %guiid%,,,,,595
;}
wingetpos,,,w,h,ahk_id %guiid%
if (w>MainWeight+14+MainWeight*AppCount)
{
  send,{lbutton up}
  winmove,ahk_id %guiid%,,,,% MainWeight+10+MainWeight*AppCount
}
if (w<(AppCount?MainWeight*2:MainWeight))
{
  send,{lbutton up}
  winmove,ahk_id %guiid%,,,,% (AppCount?MainWeight*2:MainWeight)+14
}
UpdateScrollBar(guiid,MainWeight+MainWeight*AppCount,E_1)
if !GetKeyState("lButton","P")
  WinSet,redraw,,ahk_id %guiid%
return

ShowWin:
tmpgain:=Round(gain*100)
guiexist:=1
Gui,1:show
gosub,guiexisttoapps
WinSet,redraw,,ahk_id %guiid%
gosub,Refrash
return

guiexisttoapps:
loop,parse,List,`,
  if a_loopfield
    PostMessage,0x1002,2,% guiexist,,% "ahk_pid " Compr%a_loopfield%
return

Notebooke:
gain:=savegain
resetnow:=1
return

Mixer:
Gui,1:submit,nohide
if Mixer
{
  winmove,ahk_id %guiid%,,,,% MainWeight*2
  UpdateScrollBar(guiid,MainWeight+MainWeight*AppCount,E_1)
}
else
{
  loop,parse,List,`,
  {
    if !a_loopfield
      continue
    PostMessage,0x1002,1,,,% "ahk_pid " Compr%a_loopfield%
    AppCount--
    List:=RegExReplace(List, a_loopfield "`,", "")
  }
  winmove,ahk_id %guiid%,,,,% MainWeight+11
  UpdateScrollBar(guiid,MainWeight,E_1)
}
return

Message(wParam,lParam,Msg,hwnd)
{
;msgbox,% wParam "`t" lParam "`t" Msg "`t" hwnd "`n" guiid "`n" Weight,100,,2
  Message:=1
  wP:=wParam
  lP:=lParam
}

removetooltip:
tooltip
return

; 0000000000000000000000000000000000000000000000000000000000000
ReloadSettings:
ReloadSettings:=1
exit:
guiclose:
if !alreadyexit
{
  if (!App and !guiexist)
  {
    Gui,1:show,NA
    Gui,1:submit,nohide
    sleep,100
  }
  wingetpos,GuiX,GuiY,,,ahk_id %guiid%
  if !ReloadSettings
  {
    if !notebook
      gain:=savegain
    gosub,SaveSettings
  }
  else
    Regdelete,HKCU,%Settingspath%
  if !App
  {
    loop,parse,List,`,
      if a_loopfield
        PostMessage,0x1002,1,,,% "ahk_pid " Compr%a_loopfield%
;    VA_SetMasterVolume(multiplier*2>100 ? 100 : multiplier,"","")
    VA_SetMasterVolume(returnvol,"","")
  }
  else
    VA_ISimpleAudioVolume_SetMasterVolume(AppVol,1)
  alreadyexit:=1
}
exitapp
; 0000000000000000000000000000000000000000000000000000000000000

Refrash:
offset:=0
PostMessage,WM_HSCROLL,0x6,,,ahk_id %guiid%
sleep,300
loop,parse,List,`,
{
  if !a_loopfield
    continue
  if winexist("ahk_pid " Compr%a_loopfield%)
    PostMessage,0x1002,3,a_index-offset,,% "ahk_pid " Compr%a_loopfield%
  else
  {
    List:=RegExReplace(List, a_loopfield "`,", "")
    offset++
    AppCount--
  }
}
gosub,guisize
return

linearitySettings:
GuiControl,,%S_11%,% linearity*10
gosub,Changelinearity
gui,2:show,NA
return

Defaultlinty:
GuiControl,,%S_11%,10
Changelinearity:
gui,2:submit,NoHide
loop,11
{
  tmp1:=a_index-1
  tmp2:=tmp1/10
  tmp3:=a_index+30
  linty_%tmp1%:=VA_Scalar2dB(tmp2**(linearityS/10),0,1)*100
  GuiControl,,% S_%tmp1%,% linty_%tmp1%
  GuiControl,,% S_%tmp3%,% round(linty_%tmp1%)
}
GuiControl,,%S_12%,% linearity:=round(linearityS/10,1)
return

SaveSettings:
if Settingspath=
  Settingspath:="SOFTWARE\Unknown_AHK_Script"
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
    {
      Setting:=a_loopfield
      Break
    }
  }
  save:=%Setting%
  RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Save%
}
LoadSettings:
if Settingspath=
  Settingspath:="SOFTWARE\Unknown_AHK_Script"
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
      Setting:=a_loopfield
    else if a_index=2
      Default:=a_loopfield
    else
      Default.="=" a_loopfield
  }
  RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  if errorlevel
  {
    RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default%
    RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  }
}
Return

GetVolumeObject:
Process,Exist,%AppPID%
if !ErrorLevel
  return
PID:=AppPID
; GetDefaultAudioEndpoint
ObjRelease(DAE)
DAE:=VA_GetDevice()
; activate the session manager
ObjRelease(IASM2)
VA_IMMDevice_Activate(DAE,IID_IASM2,0,0,IASM2)
; enumerate sessions for on this device
ObjRelease(IASE)
VA_IAudioSessionManager2_GetSessionEnumerator(IASM2,IASE)
VA_IAudioSessionEnumerator_GetCount(IASE,Count)
Loop,% Count
{
  ObjRelease(IASC)
  VA_IAudioSessionEnumerator_GetSession(IASE,A_Index-1,IASC)
  ; Query the IAudioSessionControl for an IAudioSessionControl2 object
  ObjRelease(IASC2)
  IASC2:=ComObjQuery(IASC,IID_IASC2)
  ; Get the sessions process ID
  VA_IAudioSessionControl2_GetProcessID(IASC2,SPID)
  process,exist,% SPID
  if (!SPID or !ErrorLevel)
    continue
  if (app and SPID=PID)
  {
    ObjRelease(AppVol)
    AppVol:=ComObjQuery(IASC2,IID_ISAV)
    ObjRelease(audioMeter)
    AudioMeter:=ComObjQuery(IASC,IID_AM)
    break
  }
}
return

;
; ISimpleAudioVolume : {87CE5498-68D6-44E5-9215-6DA47EF883D8}
;
VA_ISimpleAudioVolume_SetMasterVolume(this, ByRef fLevel, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float", fLevel, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMasterVolume(this, ByRef fLevel) {
    return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "float*", fLevel)
}
VA_ISimpleAudioVolume_SetMute(this, ByRef Muted, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "int", Muted, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMute(this, ByRef Muted) {
    return DllCall(NumGet(NumGet(this+0)+6*A_PtrSize), "ptr", this, "int*", Muted)
}

SetParent(hwnd,hNewParent,ClassNN="",x=0,y=0)
{
  if ClassNN
    ControlGet,hNewParent,Hwnd,,%ClassNN%,ahk_id %hNewParent%
  oldParent:=DllCall("SetParent","ptr",hwnd,"ptr",hNewParent)
  WinMove,ahk_id %hwnd%,,%x%,%y%
  return oldParent
}

UpdateScrollBar(hwnd, ScrollWeight,ctrl)
{
global
  PostMessage,WM_HSCROLL,0x6,,,ahk_id %guiid%
   static SIF_RANGE := 0x1, SIF_PAGE := 0x2, SB_HORZ := 0
   WinGetPos,,,GuiWidth,, ahk_id %hwnd%
   VarSetCapacity(si, 28, 0)
   NumPut(28, si) ; cbSize
   NumPut(SIF_RANGE | SIF_PAGE, si, 4)
   NumPut(ScrollWeight, si, 12) ; nMax
   NumPut(GuiWidth, si, 16) ; nPage
   DllCall("SetScrollInfo", Ptr, hwnd, UInt, SB_HORZ, Ptr, &si, UInt, 1)

   ; Scroll contents of window and invalidate uncovered area.
;   DllCall("ScrollWindow", Ptr, hwnd, Int, 1, Int, 0, Ptr, 0, Ptr, 0)

   ControlGetPos,Left,,,,,ahk_id %ctrl%

   Right := MainWeight+MainWeight*AppCount
   if (Left < 0 && Right < GuiWidth)
   {
      x := (a := Abs(Left)) > (b := GuiWidth-Right) ? b : a
      DllCall("ScrollWindow", Ptr, hwnd, Int, x, Int, 0, Ptr, 0, Ptr, 0)
   }
}

WM_HSCROLL(wParam, lParam, msg, hwnd)
{
   static SIF_ALL=0x17, SCROLL_STEP=10
   bar := 0 ; SB_HORZ=0, SB_VERT=1

   VarSetCapacity(si, 28, 0)
   NumPut(28, si, "UInt") ; cbSize
   NumPut(SIF_ALL, si, 4, "UInt") ; fMask
   if !DllCall("GetScrollInfo", Ptr, hwnd, Int, bar, Ptr, &si)
     return

   VarSetCapacity(rect, 16)
   DllCall("GetClientRect", Ptr, hwnd, Ptr, &rect)

   new_pos := NumGet(si, 20, "UInt") ; nPos

   action := wParam & 0xFFFF
   if action = 0 ; SB_LINEUP
     new_pos -= SCROLL_STEP
   else if action = 1 ; SB_LINEDOWN
     new_pos += SCROLL_STEP
   else if action = 2 ; SB_PAGEUP
     new_pos -= NumGet(rect, 12, "Int") - SCROLL_STEP
   else if action = 3 ; SB_PAGEDOWN
     new_pos += NumGet(rect, 12, "Int") - SCROLL_STEP
   else if (action = 5 || action = 4) ; SB_THUMBTRACK || SB_THUMBPOSITION
     new_pos := wParam>>16
   else if action = 6 ; SB_TOP
     new_pos := NumGet(si, 8, "Int") ; nMin
   else if action = 7 ; SB_BOTTOM
     new_pos := NumGet(si, 12, "Int") ; nMax
   else
     return

   min := NumGet(si, 8, "Int") ; nMin
   max := NumGet(si, 12, "Int") - NumGet(si, 16, "UInt") ; nMax-nPage
   new_pos := new_pos > max ? max : new_pos
   new_pos := new_pos < min ? min : new_pos

   old_pos := NumGet(si, 20, "Int") ; nPos
   x := old_pos-new_pos

   ; Scroll contents of window and invalidate uncovered area.
   DllCall("ScrollWindow", Ptr, hwnd, Int, x, Int, y, UInt, 0, UInt, 0)

   ; Update scroll bar.
   NumPut(new_pos, si, 20, "Int") ; nPos
   DllCall("SetScrollInfo", Ptr, hwnd, Int, bar, Ptr, &si, Int, 1)

  if !GetKeyState("lButton","P")
    WinSet,redraw,,ahk_id %guiid%
}


#if (!App and (UnderSomething() or UnderApp()))
$*wheelup::
if work
{
  if notebook
  {
    gain+=0.05
    newvol+=2
    gosub,wheeeel
    gosub,wheeeeeeel
  }
  else
  {
    newvol++
    gosub,wheeeel
  }
}
else
{
  newvol++
  gosub,wheeeel
}
settimer,removetooltip,-1000
return

$*wheeldown::
if work
{
  if notebook
  {
    gain-=0.05
    gosub,wheeeeeeel
  }
  else
  {
    newvol--
    gosub,wheeeel
  }
}
else
{
  newvol--
  gosub,wheeeel
}
settimer,removetooltip,-1000
return

#if

wheeeel:
newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
GuiControl,,newvolset,% newvol
VA_SetMasterVolume(newvol,"","")
if UnderSomething()
{
  if !InfoShow
  {
    InfoShow:=1
    Gui,5:Show,center NoActivate
    Gui,5:+AlwaysOnTop
  }
  GuiControl,5:,InfoVolume,% Round(newvol)
  GuiControl,5:,InfoVolumep2,% Round(newvol)
  GuiControl,5:,InfoVolumep,% Round(newvol)
  settimer,HideInfo,-1000
}
return

wheeeeeeel:
wait:=200+voltime
gain:=gain<0 ? 0 : gain>2 ? 2 : gain
tmpgain:=Round(gain*100)
GuiControl,,Setgain,% tmpgain
if UnderSomething()
{
  if !InfoShow
  {
    InfoShow:=1
    Gui,5:Show,center NoActivate
    Gui,5:+AlwaysOnTop
  }
  GuiControl,5:,InfoVolume,% tmpgain
  GuiControl,5:,InfoVolumep2,% tmpgain//2
  GuiControl,5:,InfoVolumep,% tmpgain//2
  settimer,HideInfo,-1000
}
if gain=0
  vol:=newvol:=0
return

HideInfo:
InfoShow:=0
Gui,5:Hide
return

isWindowFullScreen(WinID)
{
  WinGet,WinMinMax,MinMax,ahk_pid %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_pid %WinID%
  if (WinMinMax=0 and WinX=0 and WinY=0 and WinW=A_ScreenWidth and WinH=A_ScreenHeight)
  {
    WinGetClass,WinClass,ahk_pid %WinID%
    WinGet,WinProcessName,ProcessName,ahk_pid %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman" and WinClass!="WorkerW" and WinProcessExt!="scr")
      return true
  }
}

UnderApp()
{
  global ListWin
  mousegetpos,,,w
  winget,pid,PID,ahk_id %w%
  if instr(ListWin,pid+0)
    return 1
}

UnderSomething()
{
  if !WheelVol
    return
;-----------------
; Ниже можно добавлять условия, в которых возможна регулировка громкости роликом
  mousegetpos,x,y,w
;  wingetclass,c,ahk_id %w%
;  if (c="Shell_TrayWnd")
;    return 1
  if (y>a_screenheight-32)
    return 1
}

Update
Обновлен код:
упрощены некоторые функции;
добавлено описание настройкам при наведении мыши.

Update 2
Добавлено:
кнопка сброса настроек по умолчанию;
настройка времени сброса громкости при тишине;
Fade In - быстрое нарастание после "тишины" и настройка ее скорости.

Update 3
Исправлены некоторые мелкие ошибки.

Update 4
Сменилась формула расчета входной громкости и ограничителя громкости в режиме "без сглаживания с 0 задержкой".

Update 5
Устранена небольшая ошибка в "доводке звука до центра громкости", ничего серьезного.

Update 6
Добавлена функция гашения коротких импульсов заданной длинны.

Update 7
Теперь можно пользоваться на ноутбуке. Просто поставьте галочку "Ноутбук" в настройках.

Update 8
Исправил мелкие ошибки после добавления нового режима.

Update 9
Поправил интерфейс.

Update 10
Добавил "псевдо-FadeOut" - при отсутствии сигнала, с заданной скоростью уменьшает громкость.

Update 11
Исправление ошибок.

Update 12
Улучшен "детектор" импульсов, теперь "гашение импульсов" соответствует описанию.
Добавлена возможность сбрасывать громкость до нуля (почти) вместо "установленной".

Update 13
Добавлен Микшер. Теперь можно активировать нормализацию для каждого приложения в отдельности.

Старая версия сохранена в архиве.

Update 14
Исправление ошибок.

Update 15
Ещё несколько ошибок исправлено.

Update 16
И ещё несколько ошибок исправлено.

Update 17
Исправлена ошибка запуска компонентов микшера.

Update 18
Исправлена ошибка с пропаданием окна настроек.
Компоненты микшера теперь используют PID процесса вместо имени процесса.
Если задать "время отсутствия сигнала" = 0, то громкость не будет сбрасываться.

Update 19
Исправление мелких ошибок.

Update 20
Добавлена возможность регулировать громкость роликом над панелью задач. Включается в настройках.
Также можете сами добавить условия, в которых регулировка роликом активна, в конце исходного скрипта (отмечено комментарием).

Update 21
Добавлена настройка "Количество измерений для усреднения" в "доводке звука до центра". Мелкие доработки.
Изменён путь настроек: старый - "SOFTWARE\DF\Compressor"; новый - "SOFTWARE\AlectricSoft\Compressor".

Update 22
Ещё раз исправлена линейность звука.
Добавлена настройка линейности звука.

Update 23
Исправлена ошибка при использовании полно-экранных приложений и "Микшера", эти приложения могут не корректно завершаться, т.к. не поддерживают "сворачивания".

Update 24
Исправлены ошибки интерфейса при измененном масштабе в Windows.

В прикрепленном файле: скомпилированный вариант (для тех у кого проблемы), иконка и исходники.
Ссылка рабочая! Не смотрите на следующие посты.

Post's attachments

Compressor_win7.zip 465.88 kb, 4 downloads since 2019-02-06 

You don't have the permssions to download the attachments of this post.
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

2

Re: AHK: Аудио компрессор для windows 7,8,10

Сссылка битая, архив тоже.
Вкратце расскажите что делает скрипт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3 (изменено: Alectric, 2013-08-22 18:18:47)

Re: AHK: Аудио компрессор для windows 7,8,10

Как тогда архивы загружать на сайт если битая ссылка получается (в архиве VA.ahk, сам скрипт и иконка для скрипта)?

Компрессор нужен для выравнивания громкости.
Т.е. если воспроизводится тихий звук в плеере или еще где-либо - компрессор повысит громкость; если звук слишком громкий, то соответственно понизит.
Уровни срабатывания и задержка выставляются в Gui, а также доводка звука до "центра" громкости.

В основном скрипт пригодился бы для меломанов и занимающихся звуком/музыкой.
И лучше всего использовать на стационарных компьютерах с аудиосистемой и регулировать громкость на аудиосистеме, в смысле на ноутбуке к примеру невозможно будет настроить громкость так как она выравняется скриптом.
Настройки сохраняются в реестре.


PS: Кстати если кто-нибудь знает как осуществить функции VA.ahk (определение пиковой выходной громкости сигнала) на Win XP, буду безмерно благодарен.

Здесь VA.ahk https://dl.dropbox.com/u/20532918/Lib/VA-2.3.zip
Если ссылка ниже опять битая.

Post's attachments

VA.ahk 32.63 kb, 22 downloads since 2013-08-22 

You don't have the permssions to download the attachments of this post.
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

4

Re: AHK: Аудио компрессор для windows 7,8,10

Компрессор нужен для выравнивания громкости.

Штука нужная.

Как тогда архивы загружать на сайт если битая ссылка получается (в архиве VA.ahk, сам скрипт и иконка для скрипта)?

Пишет архив повреждён. В ZIP`e у меня нормально всегда выкладывались.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5 (изменено: Alectric, 2014-04-06 07:10:05)

Re: AHK: Аудио компрессор для windows 7,8,10

Выкладываю файл который нормально открывается, скачиваю сам и он не открывается...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

6 (изменено: Zanoza, 2013-08-24 02:09:31)

Re: AHK: Аудио компрессор для windows 7,8,10

Приложение очень полезное , давно искал подобное. Особенно при просмотре фильмов ночью.

Win10 x64

7

Re: AHK: Аудио компрессор для windows 7,8,10

Хоть кому-то пригодилось. )

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

8 (изменено: serzh82saratov, 2013-08-24 20:13:54)

Re: AHK: Аудио компрессор для windows 7,8,10

Конечно. Вещь серьёзная. Тут только код курить и курить. Сейчас бытовой  возможности нет проверить. Меня эта фича в Xonar DG не устраивает. Долго искал стороннее сравнить. Так что пригодится точно!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

9

Re: AHK: Аудио компрессор для windows 7,8,10

Объясните непосвящённым, что эта штука должна делать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

10

Re: AHK: Аудио компрессор для windows 7,8,10

Протестил - (Windws 7 x64) -работает отлично! Спасибо автору . И всем большое  спасибо за поддержку!!!

Win10 x64

11 (изменено: Alectric, 2014-04-05 08:10:45)

Re: AHK: Аудио компрессор для windows 7,8,10

teadrinker пишет:

Объясните непосвящённым, что эта штука должна делать.

В 3-ем посте описано.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

12 (изменено: Alectric, 2014-04-06 07:11:15)

Re: AHK: Аудио компрессор для windows 7,8,10

Update: Обновил код в 1-ом посте.

Обнаружилась странная проблема: на компе у друга почему-то скрипт сильно "ест" ресурс процессора (30 - 50% на 2х ядерном).
Прошу желающих протестировать скомпилированный скрипт и отписаться.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

13 (изменено: Irbis, 2014-04-05 11:17:53)

Re: AHK: Аудио компрессор для windows 7,8,10

На планшете с win 8.1 включенный скрипт потребляет 0.1% .. 0.8% ресурсов процессора, по сведениям диспетчера задач.

Upd:Если "поиграть" с уровнями, чтобы скрипт постоянно был в работе, нагрузка возрастает до ~3.5%, что тоже вряд ли попадает в категорию 'сильно "ест" ресурс'.

14 (изменено: Alectric, 2014-05-05 18:02:59)

Re: AHK: Аудио компрессор для windows 7,8,10

Исправил проблему с утечкой памяти и ресурса процессора.

В цикле был повторный запрос, на случай, если звуковое устройство не будет отвечать (занято другим процессом или служба Windows Audio отключалась на короткое время):

      audioMeter:=VA_GetAudioMeter()
      VA_GetDevicePeriod("capture", devicePeriod)

Заменил его воспроизведением стандартного тихого звука и последующей проверкой (~каждые 15 сек), если проверка не пройдет скрипт перезапустится.


Спустя 37 минут:
Нет... ошибся, проблема с утечкой еще существует...


Спустя 8 минут:
Нашел условия возникновения утечки: при запуске этого скрипта через другой командой "Run".

    run,Compressor_win7.ahk,,UseErrorLevel

Причину не могу понять.

При том, что при использовании простого скрипта запуска:

f1::
    run,Compressor_win7.ahk,,UseErrorLevel
return

- все в порядке...


Спустя некоторое время:
Так и не понял происходящего, решил использовать другой метод запуска, при котором все в порядке.
Т.е. проблема решена.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

15 (изменено: define, 2014-05-22 11:41:10)

Re: AHK: Аудио компрессор для windows 7,8,10

в 3-ем посте - VA.ahk -по ссылкам две разные сборки, какую использовать?

решил использовать другой метод запуска, при котором все в порядке.

А каком методе идет речь?

16 (изменено: Alectric, 2014-05-22 22:00:04)

Re: AHK: Аудио компрессор для windows 7,8,10

define пишет:

в 3-ем посте - VA.ahk -по ссылкам две разные сборки, какую использовать?

Можно использовать любую сборку, конечно если одна из них не "битая".

define пишет:

А каком методе идет речь?

Это у меня была проблема, когда этот скрипт запускал другой мой скрипт функцией "Run", так что не обращайте внимания на то, как я сам с собой разговаривал , с этим скриптом компрессора все в порядке.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

17 (изменено: Alectric, 2014-08-13 20:39:02)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 4
Сменилась формула расчета входной громкости и ограничителя громкости в режиме "без сглаживания с 0 задержкой".
Теперь "ограничение" работает более линейно относительно "ощущаемой" громкости.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

18

Re: AHK: Аудио компрессор для windows 7,8,10

Сделал файл compressor.ahk вставил в него код. В той же папке положил VA.ahk и при запуске выдает ошибку.
https://dl.dropboxusercontent.com/u/5519283/temp/ahk_audio_compressor.jpg
Помогите плиз. Давно ищу подобную программу.

19

Re: AHK: Аудио компрессор для windows 7,8,10

vasotelvi, Вам сюда.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

20 (изменено: Alectric, 2014-08-13 20:45:39)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 5
Устранена небольшая ошибка в "доводке звука до центра громкости", ничего серьезного.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

21

Re: AHK: Аудио компрессор для windows 7,8,10

Update 6
Добавлена функция гашения коротких импульсов заданной длинны.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

22

Re: AHK: Аудио компрессор для windows 7,8,10

Update 7
Теперь можно пользоваться на ноутбуке. Просто поставьте галочку "Ноутбук" в настройках.

Если встретите ошибки - пишите.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

23 (изменено: Alectric, 2015-01-13 17:10:48)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 8 - 17:52 13.01.2015
Исправил мелкие, но неприятные, ошибки после добавления нового режима.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

24 (изменено: mate26, 2015-05-06 13:15:07)

Re: AHK: Аудио компрессор для windows 7,8,10

Очень необходимая вещь. Очень прошу объяснить назначение регуляторов

P.S. Извините, разобрался... Нужно было немного курсор задержать на регуляторе.

25 (изменено: Alectric, 2015-05-24 09:21:50)

Re: AHK: Аудио компрессор для windows 7,8,10

Если кому не лень проверте работает ли на Win 10.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

26

Re: AHK: Аудио компрессор для windows 7,8,10

Проверил, на Windows 10 работает всё прекрасно.

Как сказал мой дед - Я твой дед

27

Re: AHK: Аудио компрессор для windows 7,8,10

Есть проблема (особенно актуальна на ноутбуке): при включенной нормализации невозможно установить системную громкость на 0%. Громкость будет колебаться около нуля.

Может быть, это можно решить выставлением каких-то значений в настройках?

28

Re: AHK: Аудио компрессор для windows 7,8,10

Сейчас посмотрю, исправлю.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

29

Re: AHK: Аудио компрессор для windows 7,8,10

Исправил (костыль выдал скрипту), проверь.
PS Если убавлять до нуля из интерфейса реальная громкость может не убавиться до конца, буду дальше думать как исправить, но если убавлять через систему, то все в порядке должно быть.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

30

Re: AHK: Аудио компрессор для windows 7,8,10

У меня пара проблем.
При нажатии в меню на Exit не выходит, а перезапускаеться.
Если кликнуть на кнопку "перезапустить и сохранить настройки", иногда или после нескольких кликов подряд, запускает несколько копий себя.

windows 7 x64
AutoHotkey v1.1.22.02 unicode 32-bit

и по моему не хватает

Gui,Hide

в менюшке.

31 (изменено: Alectric, 2015-07-14 17:13:24)

Re: AHK: Аудио компрессор для windows 7,8,10

У меня все в порядке и в скомпилированном виде, и в обычном.
У меня тоже Windows 7 x64.
У друзей x86 тоже нормально работает.
AutoHotkey v1.1.22.03 (только что обновил чтобы проверить, была 1.1.19.02) unicode, на счет битности не уверен, пользуюсь по умолчанию после "Express install".

Gui,Hide

Для этого есть настройка "Скрывать при потере фокуса", но ладно добавлю, если скажешь что действительно это нужно.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

32

Re: AHK: Аудио компрессор для windows 7,8,10

Извините, все нормально, у меня с старой версии запускался.
А настройка Gui,Hide для того чтобы скрипт закинутый в авто загрузку, не мозолил глаза.

33

Re: AHK: Аудио компрессор для windows 7,8,10

Настрока "Скрывать при потере фокуса" как раз это и делает.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

34

Re: AHK: Аудио компрессор для windows 7,8,10

Классический компрессор имеет следующие настройки:
"Threshold" - порог (в децибелах - порог, при превышении которого, срабатывает компрессор)
"Ratio" - степень сжатия (в разах или в отношении к единице - выражает, во сколько раз будет уменьшаться сигнал при превышении порога);
"Attack" - время атаки (обычно в миллисекундах, реже - в децибелах в секунду - время, в течение которого, компрессор убавляет громкость);
"Release" - время восстановления (обычно в миллисекундах, реже - в децибелах в секунду - время, в течение которого, компрессор восстанавливает громкость);
"Output" - усиление или ослабление выходного сигнала (в децибелах - позволяет усилить   выходной сигнал после сжатия, например, чтобы в итоговом сигнале тихие звуки стали громче, а громкие, ослабленные компрессором, вернулись к номинальному значению.
Есть ещё дополнительные параметры, которые могут как присутствовать, так и отсутствовать. Но их перечисление займёт слишком много времени и мне кажется необязательным.
Это я к тому, что такими параметрами гораздо удобнее оперировать, чем теми, что указаны у Вас. Например, мне хочется уточнить:
"Задержка при возрастании" и "Задержка при убывании" - это "Attack" или нетрадиционно используемый"Hold"?
В каких единицах выражаются "Скорость увеличения громкости при "стремлении" к", "Скорость уменьшения громкости при "стремлении" к" и "Скорость восстановления после сброса"?
"Время, через которое произойдёт сброс громкости на" - это "Release" или "Hold"? Или галочкой "Fade in" мы как раз меняем "Hold" на "Release"?
"Длина импульса для гашения" - это длительность анализируемого фрагмента в миллисекундах?
Насколько я понял, степень сжатия в Вашем компрессоре постоянна и равна бесконечности к одному? Т. е. он фактически лимитер?
Спасибо!

35 (изменено: Malcev, 2015-09-30 15:09:28)

Re: AHK: Аудио компрессор для windows 7,8,10

У меня на Win7 тема классическая вот так гуи отображается:
http://savepic.net/7364629.htm
Чтобы его удалить полностью, нужно стереть ветку в реестре SOFTWARE\DF\Compressor?
После закрытия скрипта у меня громкость понизилась на 2 трети (поднял ползунком), больше он ничего не натворил?

36 (изменено: Alectric, 2015-09-30 17:38:23)

Re: AHK: Аудио компрессор для windows 7,8,10

2Malcev
А что именно не устраивает в отображении? Я его делал, вообще-то, только ради функционала, мне особо не важно как он выглядит (учитывая то, что окно скрыто большую часть времени).
Удалить ветку SOFTWARE\DF, больше ничего.

больше он ничего не натворил?

Нет больше ничего, я же не варвар...

2vazha
Да это не настоящий компрессор (хотя очень хотелось бы), просто первое что пришло в голову для названия. Чтобы сделать настоящий нужно лезть в драйвера и т.д., а для меня там "туман войны", поэтому приходится довольствоваться всего лишь "автоматической регулировкой уровня" (АРУ), с довольно гибкими настройками (ИМХО).
Насчет описания к настройкам, если хотите могу все переписать, только скажите... если это, конечно, еще имеет смысл...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

37

Re: AHK: Аудио компрессор для windows 7,8,10

Это имеет смысл всегда Поскольку работает и работает неплохо. Наверное, есть смысл чуть подробнее описать функционал настроек. Ну, и единицы указать. А то ведь, правда, непонятно про скорость, не в км\ч же На миллисекунды на слух не похоже...

38

Re: AHK: Аудио компрессор для windows 7,8,10

А что именно не устраивает в отображении?

Ну какое-то оно кривое. Не все надписи видно.
Вот для сравнения:
http://www.sonycreativesoftware.com/ima … ssorEQ.jpg

39

Re: AHK: Аудио компрессор для windows 7,8,10

В каких единицах выражаются "Скорость увеличения громкости при "стремлении" к", "Скорость уменьшения громкости при "стремлении" к" и "Скорость восстановления после сброса"?

В "единицах громкости за 1 цикл программы" (чаще всего за 17 ms). Как предложите описать это в настройках?

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

40

Re: AHK: Аудио компрессор для windows 7,8,10

Malcev, шкалы добавлять к настройкам не имеет смысла (уже думал об этом), т.к. это убьет "гибкость настроек".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

41

Re: AHK: Аудио компрессор для windows 7,8,10

Alectric пишет:

В каких единицах выражаются "Скорость увеличения громкости при "стремлении" к", "Скорость уменьшения громкости при "стремлении" к" и "Скорость восстановления после сброса"?

В "единицах громкости за 1 цикл программы" (чаще всего за 17 ms). Как предложите описать это в настройках?

Единицы громкости - это значение в микшере windows от 0 до 100? А цикл программы от чего зависит? Почему 17мс? Сорри за вопросы - я не программист, я звукорежиссер

42

Re: AHK: Аудио компрессор для windows 7,8,10

Единицы громкости - это значение в микшере windows от 0 до 100?

Да

А цикл программы от чего зависит? Почему 17мс?

Цикл программы зависит от загруженности процессора и приоритета процесса скрипта. Приоритет скрипт задает себе "Высокий" (process,priority,,high),... ну в основном на выполнение всех строк в цикле срипта уходит около 17 ms.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

43 (изменено: Alectric, 2015-09-30 18:08:01)

Re: AHK: Аудио компрессор для windows 7,8,10

Подкорректировал описание к настройкам... посмотри, пойдет или еще что-то поменять.

Модераторы, простите за "даблпостинг", просто я не уверен, что сообщение уже было прочитано.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

44

Re: AHK: Аудио компрессор для windows 7,8,10

В принципе, кто прочтёт нашу переписку, тот поймёт. Но можно написать что-то типа: "X единиц громкости микшера за цикл программы (Y мс)".

45

Re: AHK: Аудио компрессор для windows 7,8,10

Update 9
Поправил интерфейс, "по просьбам трудящихся".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

46 (изменено: Zanoza, 2015-11-23 10:44:20)

Re: AHK: Аудио компрессор для windows 7,8,10

А возможно ли добавить  типа чекбокс  (при отсутствие звука в течении  %N% секунд сбросить на 0 уровень громкости.)
После появления звука -  с  %B% скоростью звук достиг  указанного уровня.
Было бы  неплохо!
"Уровень сигнала  к которому стремится ..." Это отдельная настройка. И это  не то  что я предложил.
Да и спасибо всем кто  придумал  компрессор  я полюзуюсь  давно с  2013-08-23 23:53:32

Win10 x64

47 (изменено: Alectric, 2015-11-23 17:34:29)

Re: AHK: Аудио компрессор для windows 7,8,10

Zanoza пишет:

После появления звука -  с  %B% скоростью звук достиг  указанного уровня.

Это делает "Fade in".

Zanoza пишет:

в течении  %N% секунд

Т.е. постепенно, не сразу?

Zanoza пишет:

на 0 уровень громкости

Именно до нуля?!

+ OFF:
Zanoza пишет:

давно с  2013-08-23 23:53:32

Офигеть уже два года прошло с тех пор как я его выложил...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

48 (изменено: Alectric, 2015-11-23 19:14:08)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 10
Добавил "псевдо-FadeOut" - при отсутствии сигнала, с заданной скоростью уменьшает громкость.

Zanoza, так подойдет?

...

Update 11
Исправление ошибок.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

49

Re: AHK: Аудио компрессор для windows 7,8,10

Да я давно пользуюсь вашим шедевром но похоже вы не поняли меня.
Нужно чтобы громкость при отсутствии звука стала минимальная , иногда бывает что резко заорет после вкючения фильма
Это происходит если слайдер (уровень громкости к которому стремится выходной уровень) установлен на середину и выше
нужно чтоб "псевдо-FadeOut" не орентировался на него а сбрасывал уровень громкости на 0

Win10 x64

50 (изменено: Alectric, 2015-11-24 20:38:35)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 12
1. Улучшен "детектор" импульсов, теперь "гашение импульсов" соответствует описанию.
2. Добавлена возможность сбрасывать громкость до нуля (почти) вместо "установленной".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

51

Re: AHK: Аудио компрессор для windows 7,8,10

Спасибо за обновление!

Win10 x64

52

Re: AHK: Аудио компрессор для windows 7,8,10

Уважаемый  Alectric . А возможно-ли сделать ваше чудо устройство именно на одну или несколько  программ которые используют звук (не общий) . Типа просто на плеер  или на плеер и есче на какой то девайс  если он есть в микшере? Типа определяем какие  устройства   и  чекбос на него который будет задействован.

Win10 x64

53 (изменено: Alectric, 2015-12-12 17:01:58)

Re: AHK: Аудио компрессор для windows 7,8,10

Скорей всего - нет, но посмотрю, попробую поискать, подумать. И скорей всего это будет отдельный скрипт, т.к. библиотека VA.ahk, вроде, ссылается напрямую на устройство воспроизведения.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

54

Re: AHK: Аудио компрессор для windows 7,8,10

Ну и на том спасибо!

Win10 x64

55

Re: AHK: Аудио компрессор для windows 7,8,10

Zanoza, так я и не нашел метода, это выше моих сил.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

56

Re: AHK: Аудио компрессор для windows 7,8,10

А так не пробовал?
https://autohotkey.com/board/topic/9711 … ic-progra/

57 (изменено: Alectric, 2016-01-21 23:10:39)

Re: AHK: Аудио компрессор для windows 7,8,10

Malcev, самое главное - это получить текущий уровень сигнала для приложения. Для основной громкости это делает VA_IAudioMeterInformation_GetPeakValue(), как сделать тоже самое для каждого приложения мне не удалось найти.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

58

Re: AHK: Аудио компрессор для windows 7,8,10

https://autohotkey.com/board/topic/7822 … pp-volume/

59 (изменено: Alectric, 2016-01-21 23:46:17)

Re: AHK: Аудио компрессор для windows 7,8,10

Malcev, и здесь тоже нет нужной информации.
AudioMeterInformation_GetPeakValue - его отображает зеленая, дергающаяся шкала, а точнее серая, если убавить громкость, её станет видно.

Post's attachments

Безымянный.png
Безымянный.png 5.01 kb, 1 downloads since 2016-01-21 

You don't have the permssions to download the attachments of this post.
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

60

Re: AHK: Аудио компрессор для windows 7,8,10

Вроде можно сделать:
http://stackoverflow.com/questions/2399 … r-namepeak
Задай вопрос на оф.форуме. Наверняка Lexikos не оставит без внимания. Это же его детище.

61 (изменено: Alectric, 2016-01-22 17:59:47)

Re: AHK: Аудио компрессор для windows 7,8,10

Получилось!!! Попробую собрать АРУ для конкретного приложения. Спасибо, Malcev, за наводку, с поиском плохо дружу.

...

Функция для получения уровня сигнала для приложения:

#SingleInstance, Force
#Include VA.ahk
OnExit, ExitSub


WinGet, test, PID,ahk_exe 1by1.exe
if !test
  exitapp


; Get "System Sounds" (PID 0)
if !(Volume := GetVolumeObject(test,AudioMeter))
{
    MsgBox, There was a problem retrieving the application volume interface
    ExitApp
}

loop
{
  sleep,100
  VA_IAudioMeterInformation_GetPeakValue(AudioMeter,involValue)
  tooltip,% involValue

}
return

esc::
ExitSub:
ObjRelease(Volume)
ObjRelease(AudioMeter)
ExitApp
return

^m::
VA_ISimpleAudioVolume_GetMute(Volume, Mute)
VA_ISimpleAudioVolume_SetMute(Volume, !Mute)
return

GetVolumeObject(Param,ByRef audioMeter)
{
    static IID_IASM2 := "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
    , IID_IASC2 := "{bfb7ff88-7239-4fc9-8fa2-07c950be9c6d}"
    , IID_ISAV := "{87CE5498-68D6-44E5-9215-6DA47EF883D8}"
    , IID_AM := "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"

    ; Turn empty into integer
    if !Param
        Param := 0

    ; Get PID from process name
    if Param is not Integer
    {
        Process, Exist, %Param%
        Param := ErrorLevel
    }

    ; GetDefaultAudioEndpoint
    DAE := VA_GetDevice()

    ; activate the session manager
    VA_IMMDevice_Activate(DAE, IID_IASM2, 0, 0, IASM2)

    ; enumerate sessions for on this device
    VA_IAudioSessionManager2_GetSessionEnumerator(IASM2, IASE)
    VA_IAudioSessionEnumerator_GetCount(IASE, Count)

    ; search for an audio session with the required name
    Loop, % Count
    {
        ; Get the IAudioSessionControl object
        VA_IAudioSessionEnumerator_GetSession(IASE, A_Index-1, IASC)

        ; Query the IAudioSessionControl for an IAudioSessionControl2 object
        IASC2 := ComObjQuery(IASC, IID_IASC2)
        ObjRelease(IASC)


        ; Get the sessions process ID
        VA_IAudioSessionControl2_GetProcessID(IASC2, SPID)

        ; If the process name is the one we are looking for
        if (SPID == Param)
        {
            ; Query for the ISimpleAudioVolume
            ISAV := ComObjQuery(IASC2, IID_ISAV)
            audioMeter := ComObjQuery(IASC, IID_AM)

            ObjRelease(IASC2)
            break
        }
        ObjRelease(IASC2)
    }
    ObjRelease(IASE)
    ObjRelease(IASM2)
    ObjRelease(DAE)
    return ISAV
}

;
; ISimpleAudioVolume : {87CE5498-68D6-44E5-9215-6DA47EF883D8}
;
VA_ISimpleAudioVolume_SetMasterVolume(this, ByRef fLevel, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float", fLevel, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMasterVolume(this, ByRef fLevel) {
    return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "float*", fLevel)
}
VA_ISimpleAudioVolume_SetMute(this, ByRef Muted, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "int", Muted, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMute(this, ByRef Muted) {
    return DllCall(NumGet(NumGet(this+0)+6*A_PtrSize), "ptr", this, "int*", Muted)
}

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

62 (изменено: Alectric, 2016-01-24 12:19:58)

Re: AHK: Аудио компрессор для windows 7,8,10

Zanoza, получите, распишитесь, как говорится.
Для одного приложения, нужно указать имя процесса в переменной Appexe.
Предвидя дальнейшие вопросы: нет, в одном скрипте нельзя сделать сразу на несколько приложений, т.к. увеличится время обработки одного цикла (а может и нет, попробую как-нибудь), и громкие звуки будут "проскакивать" тебе в ухо.

Можно использовать в комбинации с обычным компрессором.
Можно скопировать этот скрипт и изменить приложение, и так запускать кучу копий для каждого, нужного приложения.
Подумаю насчет менеджера для нескольких приложений.

Интерфейс остался прежний.

#SingleInstance,off
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
Menu,Tray,UseErrorLevel
process,priority,,high
SendMode,Input
SetBatchLines,-1
SetControlDelay,0
SetKeyDelay,0
SetTitleMatchMode,2
SetWinDelay,-1
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On
onexit,exit
DetectHiddenWindows,On
#Include VA.ahk
#NoTrayIcon
IID_IASM2:="{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
IID_IASC2:="{bfb7ff88-7239-4fc9-8fa2-07c950be9c6d}"
IID_ISAV:="{87CE5498-68D6-44E5-9215-6DA47EF883D8}"
IID_AM:="{C02216F6-8C67-4B5B-9D00-D008E73E0064}"

app=1
Appexe=1by1.exe

;App=%0%
;Appexe=%1%
Pos=%2%

Menu,Tray,NoStandard
if (!App or !winexist("Compressor Win 7 Main"))
{
  OnMessage(0x114, "WM_HSCROLL")
  Menu,Tray,Icon
  Menu,Tray,Icon,%A_ScriptDir%\va.ico
}
Menu,Tray,add,Нормализация громкости,ShowWin
Menu,Tray,add,Exit,Exit
Menu,Tray,default,Нормализация громкости

if !App
  Settingspath=SOFTWARE\DF\Compressor
else
  Settingspath=SOFTWARE\DF\Compressor\%Appexe%
if !App
  SettingsDefault=
(
x=0
y=0
otvol=1
otvoltime=20
dovol=35
dovoltime=0
smoothot=1
smoothdo=0
work=1
Hide=0
multiplier=30
flatup=0.25
flatdown=0.25
resettimeset=50
FadeIn=1
FadeInSpeed=0.7
FadeOut=0
FadeOutSpeed=0.7
ResetToNull=0
Impulse=1
Impulsesettime=150
notebook=0
gain=100
Mixer=0
)
else
  SettingsDefault=
(
x=0
y=0
otvol=1
otvoltime=20
dovol=35
dovoltime=0
smoothot=1
smoothdo=0
work=0
Hide=0
multiplier=30
flatup=0.25
flatdown=0.25
resettimeset=50
FadeIn=1
FadeInSpeed=0.7
FadeOut=0
FadeOutSpeed=0.7
ResetToNull=0
Impulse=1
Impulsesettime=150
notebook=1
gain=100
Mixer=0
)

gosub,loadSettings
process,exist
RegWrite,REG_SZ,HKCU,SOFTWARE\DF,CompressorPID%Appexe%,%errorlevel%

if (x>a_screenwidth)
  x-=(x-a_screenwidth+200)
if (y>a_screenheight)
  y-=(y-a_screenheight+200)

if !App
{
  vol:=newvol:=newvolset:=VA_GetMasterVolume()
  audioMeter:=VA_GetAudioMeter()
}
else
{
  gosub,GetVolumeObject
  VA_ISimpleAudioVolume_GetMasterVolume(AppVol,vol)
  vol*=100
  newvol:=newvolset:=vol
}
if !AudioMeter
  audioMeter:=VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VA_GetDevicePeriod("capture", devicePeriod)
VarSetCapacity(involValues, channelCount*4)

gui,font,s8,Tahoma
Gui,Margin,0,4

Gui, -sysmenu +ToolWindow +hwndguiid
if (!App or !winexist("Compressor Win 7 Main"))
{
  Gui,+resize +alwaysontop
  Gui,Add,Button,+hwndE_1 x0 y0 h5 w5 GReload,-
  Gui,Add,Button,+hwndE_2 x54 y0 h7 w31 GReloadSettings
}
else
{
  gui,add,groupbox,x0 y0 w170 h470,%appexe%
}
;-------------------------------------------------------------------------------------------------
Gui,Add,Slider,+hwndE_3 x10 y12 w20 h210 Vertical Invert Center NoTicks Range0-100 vmultiplier,%multiplier%
Gui,Add,Slider,+hwndE_4 x+2 yp w20 h210 Vertical Invert Center NoTicks votvol,%otvol%
Gui,Add,Progress,+hwndE_5 x+2 yp+6 w6 h198 Vertical cGray vVolumein
Gui,Add,Progress,+hwndE_6 x+0 yp w20 h198 Vertical cBlue vVolumeout
Gui,Add,Progress,+hwndE_7 x+0 yp w6 h198 Vertical cGray vVolumein2
Gui,Add,Slider,+hwndE_8 x+2 yp-6 w20 h210 Vertical Invert Center NoTicks vdovol,%dovol%
Gui,Add,Slider,+hwndE_9 x+2 yp-2 h214 Vertical Thick20 Invert Center NoTicks vnewvolset,%newvol%
Gui,Add,Slider,+hwndE_10 x+2 yp h214 Range0-200 Vertical Thick20 Invert Center NoTicks vgain,%gain%
;-------------------------------------------------------------------------------------------------
Gui,Add,text,+hwndE_11 x8 y+1 w20 vmultipliertext Center
Gui,Add,text,+hwndE_12 x+3 yp w20 votvoltext Center
Gui,Add,text,+hwndE_13 x+9 yp w20 voutvoltext Center
Gui,Add,text,+hwndE_14 x+7 yp w20 vdovoltext Center
Gui,Add,text,+hwndE_15 x+5 yp w20 vvolnow Center
Gui,Add,text,+hwndE_16 x+7 yp w20 vgainset Center
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,+hwndE_17 x33 y+5 Checked%smoothot% vsmoothot,smooth
Gui,Add,CheckBox,+hwndE_18 x+6 yp Checked%smoothdo% vsmoothdo
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,+hwndE_19 x23 y+6 w35 -Multi Center votvoltime,%otvoltime%
Gui,Add,text,+hwndE_20 x+1 yp+3 w24 Center,ms
Gui,Add,Edit,+hwndE_21 x+1 yp-3 w35 -Multi Center vdovoltime,%dovoltime%
Gui,Add,text,+hwndE_22 x+1 yp+3 w40 vnewvolsettext Center
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,+hwndE_23 x23 y+10 w35 -Multi Center vflatup,%flatup%
Gui,Add,text,+hwndE_24 x+1 yp+3 w24 Center vdevicePeriodtext
Gui,Add,Edit,+hwndE_25 x+1 yp-3 w35 -Multi Center vflatdown,%flatdown%
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,+hwndE_26 x5 y+6 w159 h4 cGray vV1 ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,+hwndE_27 x5 y+6 w50 -Multi Center vresettimeset,%resettimeset%
Gui,Add,CheckBox,+hwndE_28 x+6 yp+3 w60 Checked%FadeIn% vFadeIn,Fade In
Gui,Add,Edit,+hwndE_29 x+3 yp-3 w40 -Multi Center vFadeInSpeed,%FadeInSpeed%
Gui,Add,CheckBox,+hwndE_30 x61 y+1 w61 Checked%FadeOut% vFadeOut,Fade Out
Gui,Add,Edit,+hwndE_31 x+2 yp+3 w40 -Multi Center vFadeOutSpeed,%FadeOutSpeed%
Gui,Add,CheckBox,+hwndE_32 x10 y+3 w150 Checked%ResetToNull% vResetToNull,Сбрасывать до нуля ;
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,+hwndE_33 x5 y+6 w159 h4 cGray vV2 ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,+hwndE_34 x10 y+10 w53 Checked%Impulse% vImpulse,Impulse
Gui,Add,Edit,+hwndE_35 x+1 w50 yp-3 -Multi Center vImpulseSettime,%ImpulseSettime%
Gui,Add,text,+hwndE_36 x+1 yp+3 w20 Center,ms
Gui,Add,text,+hwndE_37 x+1 yp w30 Center vLastImpulse
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,+hwndE_38 x5 y+10 w159 h4 cGray vV3 ;------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,+hwndE_39 x10 y+10 w160 +multi Checked%work% vwork,Нормализация включена
if (!App or !winexist("Compressor Win 7 Main"))
{
  Gui,Add,CheckBox,+hwndE_40 x10 w160 +multi Checked%Hide% vHide,Скрывать при потере фокуса ;
  Gui,Add,CheckBox,+hwndE_41 x10 w70 +multi Checked%notebook% gNotebooke vnotebook,Ноутбук ;
  Gui,Add,CheckBox,+hwndE_43 x10 y+9 w160 +multi Checked%Mixer% gMixer vMixer,Микшер (недоделано) ;
}
;-------------------------------------------------------------------------------------------------
Gui,Add,Button,+hwndE_42 x165 y0 h5 w5 GExit,-
;-------------------------------------------------------------------------------------------------
if !App
{
  gui,+0x100000
  Gui,Show,x%x% y%y% w170,Compressor Win 7 Main
AppCount=2
  UpdateScrollBar(guiid,180*(AppCount+1))
}
else
{
  Gui,Show,x%x% y%y% w170,Compressor for %AppExe%
  Notebook=1
  if hwndP:=winexist("Compressor Win 7 Main")
  {
    Gui,-border
    SetParent(guiid,hwndP,"",175*pos+1)
  }
}

control,disable,,,ahk_id %E_9%
GuiControl,,V1,100
GuiControl,,V2,100
GuiControl,,V3,100

GuiControl,,multipliertext,%multiplier%
GuiControl,,otvoltext,%otvol%
GuiControl,,dovoltext,%dovol%
GuiControl,,devicePeriodtext,%devicePeriod%
GuiControl,,gain,% gain
gain:=gain/100

if (!App and hide)
{
  gui,1:hide
  guiexist=0
}
else
  guiexist=1

loop
{
  temp2+=1
  if !notebook
    savegain:=gain, gain=1
  if gain>3
    gain:=gain/100
  if Fail
  {
    sleep,5000
    if !App
    {
      ObjRelease(AudioMeter)
      audioMeter:=VA_GetAudioMeter()
      if audioMeter
      {
        run,%a_scriptfullpath%
        exitapp
      }
      else
        continue
    }
    else
    {
      WinSet,redraw,,ahk_id %guiid%
      gosub,GetVolumeObject
      if AppVol
        Fail=0
      else
        continue
    }
  }
  sleep,% devicePeriod+10
  voltime:= oldvoltime="" ? 0 : a_tickcount-oldvoltime
  oldvoltime:=a_tickcount

  VA_IAudioMeterInformation_GetPeakValue(audioMeter,involValue)
  if (old_involValue=involValue)
  {
    resetcompressor+=1
    if !App
    {
      if resetcompressor=1000
      {
        resetcompressor=
        ObjRelease(AudioMeter)
        audioMeter:=VA_GetAudioMeter()
      }
      else if not audioMeter
        Fail=1
    }
    else
    {
      if resetcompressor=200
      {
        resetcompressor=
        gosub,GetVolumeObject
      }
      else if !AppVol
        Fail=1
;        exitapp
    }
    if resetcompressor>100
      sleep,10
;tooltip,% resetcompressor "`n" AppVol "`n" AudioMeter "`n" Fail
  }
  else
    resetcompressor=
  old_involValue:=involValue
  Old_invol:=invol
  invol:=VA_Scalar2dB(involValue**1.0,0,40)*2.5
  Outvol:=newvol*invol/100/gain
  if (Outvol<0 or resetnow)
    Outvol=0
;  invol:=round(invol)
;  Outvol:=round(Outvol)
;  tooltip,"%invol%"`n"%Outvolcoeff%"`n"%Outvol%"
  if !App
    vol:=VA_GetMasterVolume()
  else
  {
    VA_ISimpleAudioVolume_GetMasterVolume(AppVol,vol)
    vol*=100
  }
;tooltip,% """" round(vol) """`n""" round(newvol) """`n""" gain """" """`n""" newvol """"
  if (round(vol)!=round(newvol))
  {
;tooltip,% round(vol) "`n" round(newvol) "`n" gain
    wait=200+voltime
    if notebook
    {
      resetnow=1
      if !App
      {
        gain:=Round(gain*100)+(round(vol)-round(newvol))*3
        gain:=gain<0 ? 0 : gain>200 ? 200 : gain
        GuiControl,,gain,% gain
        tooltip,% round(gain)
        settimer,removetooltip,-1000
        gain:=gain/100
      }
      if gain=0
        vol:=newvol:=0
;tooltip,% """" vol """`n""" newvol """`n""" gain
    }
    newvolset:=newvol:=vol
    if guiexist
      GuiControl,,newvolset,% round(newvol)
  }
  if (wait and !GetKeyState("lbutton","P"))
    wait:=wait>0 ? wait-voltime : 0
  if (work and gain!=0 and !wait)
  {

; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  if !resetnow
  {
    if (outvol<=otvol and outvol!=0)
    {
      ottime+=voltime
      if guiexist=1
        GuiControl,+cBlue,Volumeout
      if (ottime>1 and outvol!=0 and guiexist=1 and round(newvol)!=100)
        GuiControl,,newvolsettext,%ottime%
      if (ottime>otvoltime)
      {
        ottime=1
        if otvoltime=0
          newvol+=2
        else if smoothot=1
          newvol+=1
        else
          newvol+=5
        newvol:= newvol>100 ? 100 : newvol
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        if !App
          VA_SetMasterVolume(round(newvol),"","")
        else
          VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
    }
    else if ottime!=
    {
      if guiexist=1
        GuiControl,+cGreen,Volumeout
      ottime=
    }
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if (outvol>dovol and outvol!=0)
    {
      if (Impulse=1 and ImpulseExist="")
      {
        saveinlevel:=outvol-5
        savelevel:=newvol
        Impulsetime=
        ImpulseExist=1
      }
      if guiexist=1
      {
        GuiControl,+cRed,Volumeout
        GuiControl,,newvolsettext,%volmaxtime%
      }
      if (outvol>outvoltmp)
        outvoltmp:=outvol
      volmaxtime+=voltime
      if (volmaxtime>dovoltime)
      {
        volmaxtime=1
        if dovoltime=0
        {
          if smoothdo=1
            newvol-=(newvol-dovol*gain)/10+1
          else
            newvol-=(outvol-dovol)*gain
;            newvol:=(dovol*75+otvol*25)/invol
        }
        else if smoothdo=1
          newvol-=(newvol-dovol*gain)/10+1
        else
          newvol-=(newvol-dovol*gain)/6+1

        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        if !App
          VA_SetMasterVolume(round(newvol),"","")
        else
          VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
    }
    else if volmaxtime!=
    {
      if guiexist=1
        GuiControl,+cGreen,Volumeout
      outvoltmp=
      volmaxtime=
    }
; //////||||||||||||||||||||||\\\\\\\\\\\\\\\\\\\\\\\///////////\|||||||||||||\\\\\/////////
    if (outvol!=0 and Impulse=1)
    {
      if ImpulseExist=1
      {
        if (Old_invol<invol)
          ImpulseIn=1
        else if (Old_invol>invol)
          ImpulseIn=0
        if ImpulseIn
          Impulsetime+=voltime
        else if (Impulsetime<ImpulseSettime and saveinlevel>outvol)
        {
          rise=1
          if guiexist=1
            GuiControl,,LastImpulse,% Impulsetime
        }
        else if (Impulsetime>ImpulseSettime)
        {
          rise=
          ImpulseExist=
          Impulsetime=
        }
      }
      if (rise=1 and newvol<savelevel and Impulsetime>0)
      {
        Impulsetime+=voltime
        newvol++
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        if !App
          VA_SetMasterVolume(round(newvol),"","")
        else
          VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
      if (rise=1 and (newvol>savelevel or Impulsetime>ImpulseSettime*2))
      {
        rise=
        ImpulseExist=
        Impulsetime=
      }
    }
  }
; //////////////////////////////////////////////////////////////////////////////
    if (outvol>0 and resetdone and FadeIn)
    {
      newvol+=FadeInSpeed
      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      if !App
        VA_SetMasterVolume(round(newvol),"","")
      else
        VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      if (outvol>multiplier)
        resetdone=
    }
; //////////////////////////////////////////////////////////////////////////////
    if (FadeOut and outvol=0 and round(newvol/gain)>(ResetToNull ? 1 : multiplier))
    {
      FadeOutRun=1
      newvol-=FadeOutSpeed
      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      if !App
        VA_SetMasterVolume(round(newvol),"","")
      else
        VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      if (!ResetToNull and round(newvol/gain)<multiplier+FadeOutSpeed)
        resetnow=1
    }
    if (FadeOutRun and outvol>0)
    {
      FadeOutRun=
      resetnow=2
    }

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if ((!FadeOut and outvol=0 and round(newvol/gain)!=(ResetToNull ? 1 : multiplier)) or resetnow)
    {
      resettime+=voltime
      if guiexist=1
        GuiControl,,newvolsettext,%resettime%
      if (resettime>resettimeset or resetnow)
      {
        resetdone=1
        if resetnow!=2
          newvol:=(ResetToNull ? 1 : multiplier*gain)
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        if !App
          VA_SetMasterVolume(round(newvol),"","")
        else
          VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
        resetnow=
      }
    }
    else if resettime!=
      resettime=
; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    if (timerflat>20 and outvol!=0)
    {
      if (minvol>maxvol)
        newvol+=flatup
      else if (minvol<maxvol)
        newvol-=flatdown

      if (minvol>maxvol and guiexist=1)
        GuiControl,,devicePeriodtext,^
      else if (minvol<maxvol and guiexist=1)
        GuiControl,,devicePeriodtext,v

      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      if !App
        VA_SetMasterVolume(round(newvol),"","")
      else
        VA_ISimpleAudioVolume_SetMasterVolume(AppVol,newvol/100)
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      timerflat:=minvol:=maxvol:=0
    }
    else
    {
      timerflat+=1
;      if (Outvol>(dovol-otvol)/2+otvol)
      if (Outvol>multiplier+1)
        maxvol+=1
      else if (Outvol<multiplier-1)
        minvol+=1
      else
      {
        if (guiexist=1 and flatcange="")
        {
          GuiControl,,devicePeriodtext,|
          flatcange=1
        }
        else
          flatcange=
        timerflat=0
      }
    }
  } ; --------------------------------------------------------------------------
  if (hide=1 and guiexist=1)
  {
    winget,id,id,A
    if (id!=guiid)
    {
      wingetpos,x,y,,,ahk_id %guiid%
      guiexist=0
      gui,1:hide
    }
  }

;tooltip,%ottime%`n%volmaxtime%`n%resettime%`n%newvol%`n
;tooltip,% gain "`n" newvol
  if guiexist=1
  {
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &involValues)
    involL:=VA_Scalar2dB(NumGet(involValues, 0, "float"),0,40)*2.5
    involR:=VA_Scalar2dB(NumGet(involValues, 4, "float"),0,40)*2.5
    gui,submit,nohide
    gain:=gain/100
    GuiControl,,Volumein,%involL%
    GuiControl,,Volumein2,%involR%
    GuiControl,,Volumeout,%outvol%
    outvolshow+=1
    outvoltextt+=outvol
    if outvolshow>2
    {
      outvolshowt:=outvoltextt/outvolshow
      GuiControl,,outvoltext,% Round(outvolshowt)
      outvolshow=
      outvoltextt=
      GuiControl,,volnow,% Round(newvol)
      GuiControl,,gainset,% Round(gain*100)

    }
    if (multipliertext!=multiplier or otvoltext!=otvol or dovoltext!=dovol)
    {
      multipliertext:=multiplier
      otvoltext:=otvol
      dovoltext:=dovol
      if (otvol>dovol)
      {
        temp:=otvol+1
        GuiControl,,dovol,%temp%
        GuiControl,,dovoltext,%temp%
      }
      if (dovol<otvol)
      {
        temp:=dovol-1
        GuiControl,,otvol,%temp%
        GuiControl,,otvoltext,%temp%
      }
      GuiControl,,multipliertext,%multipliertext%
      GuiControl,,otvoltext,%otvol%
      GuiControl,,dovoltext,%dovol%
    }
    temp1+=1
    if (temp1>100 and tooltipshow!=1)
    {
      if !FadeOut
        control,enable,,,ahk_id %E_27%
      else
        control,disable,,,ahk_id %E_27%
      if notebook
        control,enable,,,ahk_id %E_10%
      else
        control,disable,,,ahk_id %E_10%
      temp1=
      if !App
      {
        Gui,1:-AlwaysOnTop
        Gui,1:+AlwaysOnTop
      }
      else
        WinSet,redraw,,ahk_id %guiid%
    }
    if (A_TimeIdle>300 and tooltipshow="")
    {
      tooltipshow=1
      mousegetpos,,,mwin,mctrl
      if (mwin=guiid)
      {
        ControlGet,hElement,hwnd,,%mctrl%,ahk_id %mwin%

        if (hElement=E_1)
          tooltip,Перезапустить и сохранить настройки.
        else if (hElement=E_2)
          tooltip,Сбросить настройки.
        else if (hElement=E_3)
          tooltip,Уровень громкости`, к которому`nстремится выходной уровень.
        else if (hElement=E_4)
          tooltip,Уровень сигнала`, ниже которого`nгромкость будет нарастать`nс интервалом %otvoltime% ms.
        else if (hElement=E_8)
          tooltip,Уровень сигнала`, выше которого`nгромкость будет убывать`nс интервалом %dovoltime% ms.
        else if (hElement=E_9)
          tooltip,Текущий уровень громкости.
        else if (hElement=E_10)
          tooltip,% "Усиление.`nПроцент от уровня стремления`n" Round(gain*100) "`% от " multiplier
        else if (hElement=E_5)
          tooltip,Входной уровень.`nЛевый канал.
        else if (hElement=E_6)
          tooltip,Выходной уровень`nсигнала.
        else if (hElement=E_7)
          tooltip,Входной уровень.`nПравый канал.
        else if (hElement=E_17)
          tooltip,Сглаживание при`nвозрастании громкости.
        else if (hElement=E_18)
          tooltip,Сглаживание при`nубывании громкости.
        else if (hElement=E_19)
          tooltip,Задержка при возрастании`,`nесли уровень ниже %otvol%
        else if (hElement=E_21)
          tooltip,Задержка при убывании`,`nесли уровень выше %dovol%
        else if (hElement=E_23)
          tooltip,Скорость увеличения громкости`nпри "стремлении" к %multiplier%`n%flatup% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_25)
          tooltip,Скорость уменьшения громкости`nпри "стремлении" к %multiplier%`n%flatDOwn% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_22)
          tooltip,Последний интервал срабатывания.
        else if (hElement=E_24)
          tooltip,Текущее состояние`n"стремления" к %multiplier%
        else if (hElement=E_27)
          tooltip,Время отсутствия сигнала`, через которое произойдет`nсброс громкости на %multiplier%
        else if (hElement=E_28)
          tooltip,Восстанавливать громкость`nпосле сброса на %multiplier%
        else if (hElement=E_29)
          tooltip,Скорость восстановления.`n%FadeInSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_30)
          tooltip,Псевдо-FadeOut.`nПостепенно уменьшает громкость до %multiplier%`,`n если звуков не воспроизводится.
        else if (hElement=E_31)
          tooltip,Скорость затухания.`n%FadeOutSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if (hElement=E_32)
          tooltip,Сбрасывать громкость почти до нуля`,`n вместо %multiplier%.
        else if (hElement=E_34)
          tooltip,Гасить импульсы короче`, чем %Impulsesettime% милисекунд.
        else if (hElement=E_37)
          tooltip,Длительность последнего восстановленного импульса.
        else if (hElement=E_41)
          tooltip,Режим "Ноутбук".`nРегулирует уровни нормализации синхронно с`nрегулировкой громкости в системе пользователем.
        else if (hElement=E_35)
          tooltip,Длинна импульса для гашения.
        else if (hElement=E_42)
          tooltip,Сохранить настройки и выйти.
      }
    }
    else if (A_TimeIdle<100 and tooltipshow!="")
    {
      tooltipshow=
      tooltip
    }
  }
}
return

guiresize:
WinSet,redraw,,ahk_id %guiid%
return

ShowWin:
GuiControl,,newvolset,%newvol%
GuiControl,,gain,% Round(gain*100)
gui,1:show
guiexist=1
return


reload:
if !app
  run,%a_scriptfullpath%
goto,exit
return

ReloadSettings:
ReloadSettings=1
Regdelete,HKCU,%Settingspath%
goto,exit
return

Notebooke:
gain:=savegain
resetnow=1
return

Mixer:
return

removetooltip:
tooltip
return

exit:
if guiexist=0
  gui,1:show
sleep,100
wingetpos,x,y,,,ahk_id %guiid%
if !ReloadSettings
{
  if !notebook
    gain:=savegain
  gain:=Round(gain*100)
  gosub,SaveSettings
}
else if !App
  run,%a_scriptfullpath%
exitapp
return

SaveSettings:
if Settingspath=
  Settingspath=SOFTWARE\Unknown_AHK_Script
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
    {
      Setting:=a_loopfield
      Break
    }
  }
  save:=%Setting%
  RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Save%
}
LoadSettings:
if Settingspath=
  Settingspath=SOFTWARE\Unknown_AHK_Script
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
      Setting:=a_loopfield
    else if a_index=2
      Default:=a_loopfield
    else
      Default.="=" a_loopfield
  }
  RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  if errorlevel
  {
    RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default%
    RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  }
}
Return

GetVolumeObject:
{
  Process,Exist,%AppEXE%
  if !PID:=ErrorLevel
    return
  ; GetDefaultAudioEndpoint
  ObjRelease(DAE)
  DAE:=VA_GetDevice()
  ; activate the session manager
  ObjRelease(IASM2)
  VA_IMMDevice_Activate(DAE,IID_IASM2,0,0,IASM2)
  ; enumerate sessions for on this device
  ObjRelease(IASE)
  VA_IAudioSessionManager2_GetSessionEnumerator(IASM2,IASE)
  VA_IAudioSessionEnumerator_GetCount(IASE,Count)

  list=
  real=
  Loop,% Count
  {
    ObjRelease(IASC)
    VA_IAudioSessionEnumerator_GetSession(IASE,A_Index-1,IASC)
    ; Query the IAudioSessionControl for an IAudioSessionControl2 object
    ObjRelease(IASC2)
    IASC2:=ComObjQuery(IASC,IID_IASC2)
    ; Get the sessions process ID
    VA_IAudioSessionControl2_GetProcessID(IASC2,SPID)
    process,exist,% SPID
    if (!SPID or !ErrorLevel)
      continue
    real++
    if (app and SPID=PID)
    {
      ObjRelease(AppVol)
      AppVol:=ComObjQuery(IASC2,IID_ISAV)
      ObjRelease(audioMeter)
      AudioMeter:=ComObjQuery(IASC,IID_AM)
      break
    }
  }
}
return

;
; ISimpleAudioVolume : {87CE5498-68D6-44E5-9215-6DA47EF883D8}
;
VA_ISimpleAudioVolume_SetMasterVolume(this, ByRef fLevel, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float", fLevel, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMasterVolume(this, ByRef fLevel) {
    return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "float*", fLevel)
}
VA_ISimpleAudioVolume_SetMute(this, ByRef Muted, GuidEventContext="") {
    return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "int", Muted, "ptr", VA_GUID(GuidEventContext))
}
VA_ISimpleAudioVolume_GetMute(this, ByRef Muted) {
    return DllCall(NumGet(NumGet(this+0)+6*A_PtrSize), "ptr", this, "int*", Muted)
}

SetParent(hwnd,hNewParent,ClassNN="",x=0,y=0)
{
  if ClassNN
    ControlGet,hNewParent,Hwnd,,%ClassNN%,ahk_id %hNewParent%
  oldParent:=DllCall("SetParent","ptr",hwnd,"ptr",hNewParent)
  WinMove,ahk_id %hwnd%,,%x%,%y%
  return oldParent
}

UpdateScrollBar(hwnd, ScrollWeight)
{
   static SIF_RANGE := 0x1, SIF_PAGE := 0x2, SB_HORZ := 0

   WinGetPos,,,GuiWidth,, ahk_id %hwnd%
   VarSetCapacity(si, 28, 0)
   NumPut(28, si) ; cbSize
   NumPut(SIF_RANGE | SIF_PAGE, si, 4)
   NumPut(ScrollWeight, si, 12) ; nMax
   NumPut(GuiWidth, si, 16) ; nPage
   DllCall("SetScrollInfo", Ptr, hwnd, UInt, SB_HORZ, Ptr, &si, UInt, 1)

   ; Scroll contents of window and invalidate uncovered area.
   DllCall("ScrollWindow", Ptr, hwnd, Int, 0, Int, y, UInt, 0, UInt, 0)

   ; Update scroll bar.
   NumPut(new_pos, si, 20, "Int") ; nPos
   DllCall("SetScrollInfo", Ptr, hwnd, Int, bar, Ptr, &si, Int, 1)
}

WM_HSCROLL(wParam, lParam, msg, hwnd)
{
   static SIF_ALL=0x17, SCROLL_STEP=10
   bar := 0 ; SB_HORZ=0, SB_VERT=1

   VarSetCapacity(si, 28, 0)
   NumPut(28, si, "UInt") ; cbSize
   NumPut(SIF_ALL, si, 4, "UInt") ; fMask
   if !DllCall("GetScrollInfo", Ptr, hwnd, Int, bar, Ptr, &si)
     return

   VarSetCapacity(rect, 16)
   DllCall("GetClientRect", Ptr, hwnd, Ptr, &rect)

   new_pos := NumGet(si, 20, "UInt") ; nPos


   action := wParam & 0xFFFF
   if action = 0 ; SB_LINEUP
     new_pos -= SCROLL_STEP
   else if action = 1 ; SB_LINEDOWN
     new_pos += SCROLL_STEP
   else if action = 2 ; SB_PAGEUP
     new_pos -= NumGet(rect, 12, "Int") - SCROLL_STEP
   else if action = 3 ; SB_PAGEDOWN
     new_pos += NumGet(rect, 12, "Int") - SCROLL_STEP
   else if (action = 5 || action = 4) ; SB_THUMBTRACK || SB_THUMBPOSITION
     new_pos := wParam>>16
   else if action = 6 ; SB_TOP
     new_pos := NumGet(si, 8, "Int") ; nMin
   else if action = 7 ; SB_BOTTOM
     new_pos := NumGet(si, 12, "Int") ; nMax
   else
     return

   min := NumGet(si, 8, "Int") ; nMin
   max := NumGet(si, 12, "Int") - NumGet(si, 16, "UInt") ; nMax-nPage
   new_pos := new_pos > max ? max : new_pos
   new_pos := new_pos < min ? min : new_pos

   old_pos := NumGet(si, 20, "Int") ; nPos
   x := old_pos-new_pos

;   x := 0
;   y := old_pos-new_pos

   ; Scroll contents of window and invalidate uncovered area.
   DllCall("ScrollWindow", Ptr, hwnd, Int, x, Int, y, UInt, 0, UInt, 0)

   ; Update scroll bar.
   NumPut(new_pos, si, 20, "Int") ; nPos
   DllCall("SetScrollInfo", Ptr, hwnd, Int, bar, Ptr, &si, Int, 1)
}

;esc::
;exitapp

;^esc::
;listlines
;return
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

63

Re: AHK: Аудио компрессор для windows 7,8,10

Спасибо огромное, но есть небольшая проблемка. Если скрипт запустить раньше приложения то он пытается выравнивать системные звуки а приложение потом не подхватывается. Работает только если скрипт запустить после приложения.

Win10 x64

64

Re: AHK: Аудио компрессор для windows 7,8,10

Исправил.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

65 (изменено: Zanoza, 2016-01-24 00:40:36)

Re: AHK: Аудио компрессор для windows 7,8,10

Почемуто  не могу  завершить  процесс в трее
Не получается закрыть  скрипт!

Win10 x64

66

Re: AHK: Аудио компрессор для windows 7,8,10

Да и после появления приложения (в моём случае это медиа плеер) происходит краш и скрипта и приложения.

Win10 x64

67 (изменено: Alectric, 2016-01-24 11:56:18)

Re: AHK: Аудио компрессор для windows 7,8,10

Да, знаю, работаю над этим.

...

Исправил, попробуй еще раз.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

68 (изменено: Alectric, 2016-01-27 20:27:18)

Re: AHK: Аудио компрессор для windows 7,8,10

Выкладываю новую версию с микшером для бэта-тестирования. Сообщайте о проблемах, пожалуйста.

Известные проблемы:
1) Если стоит галочка "Скрывать при потере фокуса", невозможно изменить настройки для приложений, окно скрывается. Исправлено.
2) Есть возможность запустить несколько главных окон. Исправлено.
3) Элементы управления "моргают". Исправлено.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

69

Re: AHK: Аудио компрессор для windows 7,8,10

Update 13
Добавлен Микшер. Теперь можно активировать нормализацию для каждого приложения в отдельности.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

70 (изменено: Zanoza, 2016-02-04 08:32:53)

Re: AHK: Аудио компрессор для windows 7,8,10

Както не  коректно работает на WIn7 х32

Win10 x64

71 (изменено: Alectric, 2016-06-05 09:07:37)

Re: AHK: Аудио компрессор для windows 7,8,10

Zanoza пишет:

Както не  коректно работает на WIn7 х32

Что именно некорректно? Нужно же знать что исправить.

...

Update 14
Исправление ошибок.

Zanoza, попробуй еще раз, с текущими исправлениями.

...

Update 15
Ещё несколько ошибок исправлено.

...

Update 16
И ещё несколько ошибок исправлено.
Известные конфликты при использовании режима "Микшер": при запуске полно-экранных приложений эти приложения могут не корректно завершаться, т.к. не поддерживают "сворачивания", в основном это игры (так что, если приложение "вылетает" на запуске - выгрузите скрипт, либо отключите режим "Микшер").

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

72 (изменено: Alectric, 2016-06-14 20:53:49)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 17
Исправлена ошибка запуска компонентов микшера, для запуска в не скомпилированном виде.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

73 (изменено: Alectric, 2016-06-14 20:54:00)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 18
1) Исправлена ошибка с пропаданием окна настроек.
2) Компоненты микшера теперь используют PID процесса вместо имени процесса.
3) Если задать "время отсутствия сигнала" 0, то громкость не будет сбрасываться.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

74 (изменено: Zanoza, 2016-08-02 16:43:21)

Re: AHK: Аудио компрессор для windows 7,8,10

Очень благодарен, работает точно как я хотел !
Но есть маленькая просьба, на старом варианте компрессора я сделал для себя удобство регулировки громкости мышкой когда курсор находится в области панели задач. Pаботает отлично, но хотел также сделать на новой версии. Помогите !

Вот мой вариант.

#SingleInstance,Force
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
Menu,Tray,UseErrorLevel
process,priority,,high
SendMode,Input
SetBatchLines,-1
SetControlDelay,0
SetKeyDelay,0
SetTitleMatchMode,2
SetWinDelay,-1
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On
onexit,exit
DetectHiddenWindows,On
#Include VA.ahk

Menu,Tray,NoStandard
Menu,Tray,Icon,%A_ScriptDir%\va.ico
Menu,Tray,add,Нормализация громкости,ShowWin
Menu,Tray,add,Exit,Exit
Menu,Tray,default,Нормализация громкости

Height := A_ScreenHeight-30 ; разрешение экрана

Settingspath=SOFTWARE\DF\Compressor
SettingsDefault=
(
x=0
y=0
otvol=1
otvoltime=20
dovol=35
dovoltime=0
smoothot=1
smoothdo=0
work=1
Hide=0
multiplier=30
flatup=0.25
flatdown=0.25
resettimeset=50
FadeIn=1
FadeInSpeed=0.7
FadeOut=0
FadeOutSpeed=0.7
ResetToNull=0
Impulse=1
Impulsesettime=150
notebook=0
gain=30
)

gosub,loadSettings
process,exist
RegWrite,REG_SZ,HKCU,SOFTWARE\DF,CompressorPID,%errorlevel%

if (x>a_screenwidth)
  x-=(x-a_screenwidth+200)
if (y>a_screenheight)
  y-=(y-a_screenheight+200)

;wingetpos,,,,sh,ahk_class Shell_TrayWnd
vol:=newvol:=newvolset:=VA_GetMasterVolume()
audioMeter:=VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VA_GetDevicePeriod("capture", devicePeriod)
VarSetCapacity(involValues, channelCount*4)

gui,font,s8,Tahoma
Gui,+alwaysontop -sysmenu +ToolWindow
Gui,Margin,0,4
Gui,Add,Button,x0 y0 h5 w5 GReload,-
Gui,Add,Button,x54 y0 h7 w31 GReloadSettings
;-------------------------------------------------------------------------------------------------
Gui,Add,Slider, x10 y4 w20 h210 Vertical Invert Center NoTicks Range0-100 vmultiplier,%multiplier%
Gui,Add,Slider, x+2 yp w20 h210 Vertical Invert Center NoTicks votvol,%otvol%
Gui,Add,Progress,x+2 yp+6 w6 h198 Vertical cGray vVolumein
Gui,Add,Progress,x+0 yp w20 h198 Vertical cBlue vVolumeout
Gui,Add,Progress,x+0 yp w6 h198 Vertical cGray vVolumein2
Gui,Add,Slider, x+2 yp-6 w20 h210 Vertical Invert Center NoTicks vdovol,%dovol%
Gui,Add,Slider,x+2 yp-2 h214 Vertical Thick20 Invert Center NoTicks vnewvolset,%newvol%
Gui,Add,Slider,x+2 yp h214 Range0-200 Vertical Thick20 Invert Center NoTicks vgain,%gain%
;-------------------------------------------------------------------------------------------------
Gui,Add,text,x8 y+1 w20 vmultipliertext Center
Gui,Add,text,x+3 yp w20 votvoltext Center
Gui,Add,text,x+9 yp w20 voutvoltext Center
Gui,Add,text,x+7 yp w20 vdovoltext Center
Gui,Add,text,x+5 yp w20 vvolnow Center
Gui,Add,text,x+7 yp w20 vgainset Center
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,x33 y240 Checked%smoothot% vsmoothot,smooth
Gui,Add,CheckBox,x+6 yp Checked%smoothdo% vsmoothdo
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,x23 y+6 w35 -Multi Center votvoltime,%otvoltime%
Gui,Add,text,x+1 yp+3 w24 Center,ms
Gui,Add,Edit,x+1 yp-3 w35 -Multi Center vdovoltime,%dovoltime%
Gui,Add,text,x+1 yp+3 w40 vnewvolsettext Center
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,x23 y+10 w35 -Multi Center vflatup,%flatup%
Gui,Add,text,x+1 yp+3 w24 Center vdevicePeriodtext
Gui,Add,Edit,x+1 yp-3 w35 -Multi Center vflatdown,%flatdown%
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,x5 y+6 w159 h4 cGray vV1 ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,Edit,x5 y+6 w50 -Multi Center vresettimeset,%resettimeset%
Gui,Add,CheckBox,x+6 yp+3 w60 Checked%FadeIn% vFadeIn,Fade In
Gui,Add,Edit,x+3 yp-3 w40 -Multi Center vFadeInSpeed,%FadeInSpeed%
Gui,Add,CheckBox,x61 y+1 w61 Checked%FadeOut% vFadeOut,Fade Out
Gui,Add,Edit,x+2 yp+3 w40 -Multi Center vFadeOutSpeed,%FadeOutSpeed%
Gui,Add,CheckBox,x10 y+3 w150 Checked%ResetToNull% vResetToNull,Сбрасывать до нуля ;
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,x5 y+6 w159 h4 cGray vV2 ;-------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,x10 y+10 w53 Checked%Impulse% vImpulse,Impulse
Gui,Add,Edit,x+1 w50 yp-3 -Multi Center vImpulseSettime,%ImpulseSettime%
Gui,Add,text,x+1 yp+3 w20 Center,ms
Gui,Add,text,x+1 yp w30 Center vLastImpulse
;-------------------------------------------------------------------------------------------------
Gui,Add,Progress,x5 y+10 w159 h4 cGray vV3 ;------------------------------------------------------
;-------------------------------------------------------------------------------------------------
Gui,Add,CheckBox,x10 w160 +multi Checked%work% vwork,Нормализация включена
Gui,Add,CheckBox,x10 w160 +multi Checked%Hide% vHide,Скрывать при потере фокуса
Gui,Add,CheckBox,x10 w70 +multi Checked%notebook% gNotebooke vnotebook,Ноутбук
;-------------------------------------------------------------------------------------------------
Gui,Add,Button,x165 y0 h5 w5 GExit,-
;-------------------------------------------------------------------------------------------------
Gui,Show,x%x% y%y%,Compressor Win 7

control,disable,,msctls_trackbar324,Compressor Win 7
GuiControl,,V1,100
GuiControl,,V2,100
GuiControl,,V3,100

GuiControl,,multipliertext,%multiplier%
GuiControl,,otvoltext,%otvol%
GuiControl,,dovoltext,%dovol%
GuiControl,,devicePeriodtext,%devicePeriod%
GuiControl,,gain,% gain
gain:=gain/100
winget,guiid,id,Compressor
WinSet,Transparent,255,Ahk_id %guiid%

if hide
{
  gui,1:hide
  guiexist=0
}
else
  guiexist=1

loop
{
  if !notebook
    savegain:=gain, gain=1
  if gain>26
    gain:=gain/100
  if Fail=1
  {
    sleep,5000
    audioMeter:=VA_GetAudioMeter()
    if audioMeter
    {
      run,%a_scriptfullpath%
      exitapp
    }
    else
      continue
  }
  sleep,% devicePeriod+10
  voltime:= oldvoltime="" ? 0 : a_tickcount-oldvoltime
  oldvoltime:=a_tickcount

  VA_IAudioMeterInformation_GetPeakValue(audioMeter,involValue)
  if (old_involValue=involValue)
  {
    resetcompressor+=1
    if resetcompressor=1000
      audioMeter:=VA_GetAudioMeter()
    else if not audioMeter
      Fail=1
    if resetcompressor>100
      sleep,10
;tooltip,%resetcompressor%`n%voltime%
  }
  else
    resetcompressor=
  old_involValue:=involValue
  Old_invol:=invol
  invol:=VA_Scalar2dB(involValue**1.5,0,40)*2.5
  Outvol:=newvol*invol/100/gain
  if (Outvol<0 or resetnow)
    Outvol=0
;  invol:=round(invol)
;  Outvol:=round(Outvol)
;  tooltip,"%invol%"`n"%Outvolcoeff%"`n"%Outvol%"
  vol:=VA_GetMasterVolume()
;tooltip,% """" round(vol) """`n""" round(newvol) """`n""" gain """" """`n""" newvol """"
  if (round(vol)!=round(newvol))
  {
;tooltip,% round(vol) "`n" round(newvol) "`n" gain
    wait=200+voltime
    if notebook
    {
      resetnow=1
      gain:=gain*100+(round(vol)-round(newvol))*3
      gain:=gain<0 ? 0 : gain>200 ? 200 : gain
      GuiControl,,gain,% gain
      tooltip,% round(gain)
    settimer,removetooltip,-1000
      gain:=gain/100
      if gain=0
        vol:=newvol:=0
;tooltip,% """" vol """`n""" newvol """`n""" gain
    }
    newvolset:=newvol:=vol
    if guiexist
      GuiControl,,newvolset,% round(newvol)
  }
  if (wait and !GetKeyState("lbutton","P"))
    wait:=wait>0 ? wait-voltime : 0
  if (work and gain!=0 and !wait)
  {

; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  if !resetnow
  {
    if (outvol<=otvol and outvol!=0)
    {
      ottime+=voltime
      if guiexist=1
        GuiControl,+cBlue,Volumeout
      if (ottime>1 and outvol!=0 and guiexist=1 and round(newvol)!=100)
        GuiControl,,newvolsettext,%ottime%
      if (ottime>otvoltime)
      {
        ottime=1
        if otvoltime=0
          newvol+=2
        else if smoothot=1
          newvol+=1
        else
          newvol+=5
        newvol:= newvol>100 ? 100 : newvol
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        VA_SetMasterVolume(round(newvol),"","")
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
    }
    else if ottime!=
    {
      if guiexist=1
        GuiControl,+cGreen,Volumeout
      ottime=
    }
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if (outvol>dovol and outvol!=0)
    {
      if (Impulse=1 and ImpulseExist="")
      {
        saveinlevel:=outvol-5
        savelevel:=newvol
        Impulsetime=
        ImpulseExist=1
      }
      if guiexist=1
      {
        GuiControl,+cRed,Volumeout
        GuiControl,,newvolsettext,%volmaxtime%
      }
      if (outvol>outvoltmp)
        outvoltmp:=outvol
      volmaxtime+=voltime
      if (volmaxtime>dovoltime)
      {
        volmaxtime=1
        if dovoltime=0
        {
          if smoothdo=1
            newvol-=(newvol-dovol*gain)/10+1
          else
            newvol-=(outvol-dovol)*gain
;            newvol:=(dovol*75+otvol*25)/invol
        }
        else if smoothdo=1
          newvol-=(newvol-dovol*gain)/10+1
        else
          newvol-=(newvol-dovol*gain)/6+1

        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        VA_SetMasterVolume(round(newvol),"","")
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
    }
    else if volmaxtime!=
    {
      if guiexist=1
        GuiControl,+cGreen,Volumeout
      outvoltmp=
      volmaxtime=
    }
; //////||||||||||||||||||||||\\\\\\\\\\\\\\\\\\\\\\\///////////\|||||||||||||\\\\\/////////
    if (outvol!=0 and Impulse=1)
    {
      if ImpulseExist=1
      {
        if (Old_invol<invol)
          ImpulseIn=1
        else if (Old_invol>invol)
          ImpulseIn=0
        if ImpulseIn
          Impulsetime+=voltime
        else if (Impulsetime<ImpulseSettime and saveinlevel>outvol)
        {
          rise=1
          if guiexist=1
            GuiControl,,LastImpulse,% Impulsetime
        }
        else if (Impulsetime>ImpulseSettime)
        {
          rise=
          ImpulseExist=
          Impulsetime=
        }
      }
      if (rise=1 and newvol<savelevel and Impulsetime>0)
      {
        Impulsetime+=voltime
        newvol++
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        VA_SetMasterVolume(round(newvol),"","")
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
      }
      if (rise=1 and (newvol>savelevel or Impulsetime>ImpulseSettime*2))
      {
        rise=
        ImpulseExist=
        Impulsetime=
      }
    }
  }
; //////////////////////////////////////////////////////////////////////////////
    if (outvol>0 and resetdone and FadeIn)
    {
      newvol+=FadeInSpeed
      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      VA_SetMasterVolume(round(newvol),"","")
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      if (outvol>multiplier)
        resetdone=
    }
; //////////////////////////////////////////////////////////////////////////////
    if (FadeOut and outvol=0 and round(newvol/gain)>(ResetToNull ? 1 : multiplier))
    {
      FadeOutRun=1
      newvol-=FadeOutSpeed
      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      VA_SetMasterVolume(round(newvol),"","")
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      if (!ResetToNull and round(newvol/gain)<multiplier+FadeOutSpeed)
        resetnow=1
    }
    if (FadeOutRun and outvol>0)
    {
      FadeOutRun=
      resetnow=2
    }

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if ((!FadeOut and outvol=0 and round(newvol/gain)!=(ResetToNull ? 1 : multiplier)) or resetnow)
    {
      resettime+=voltime
      if guiexist=1
        GuiControl,,newvolsettext,%resettime%
      if (resettime>resettimeset or resetnow)
      {
        resetdone=1
        if resetnow!=2
          newvol:=(ResetToNull ? 1 : multiplier*gain)
        newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
        VA_SetMasterVolume(round(newvol),"","")
        if guiexist=1
          GuiControl,,newvolset,% round(newvol)
        resetnow=
      }
    }
    else if resettime!=
      resettime=
; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    if (timerflat>20 and outvol!=0)
    {
      if (minvol>maxvol)
        newvol+=flatup
      else if (minvol<maxvol)
        newvol-=flatdown

      if (minvol>maxvol and guiexist=1)
        GuiControl,,devicePeriodtext,^
      else if (minvol<maxvol and guiexist=1)
        GuiControl,,devicePeriodtext,v

      newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
      VA_SetMasterVolume(round(newvol),"","")
      if guiexist=1
        GuiControl,,newvolset,% round(newvol)
      timerflat:=minvol:=maxvol:=0
    }
    else
    {
      timerflat+=1
;      if (Outvol>(dovol-otvol)/2+otvol)
      if (Outvol>multiplier+1)
        maxvol+=1
      else if (Outvol<multiplier-1)
        minvol+=1
      else
      {
        if (guiexist=1 and flatcange="")
        {
          GuiControl,,devicePeriodtext,|
          flatcange=1
        }
        else
          flatcange=
        timerflat=0
      }
    }
  } ; --------------------------------------------------------------------------
  if (hide=1 and guiexist=1)
  {
    winget,id,id,A
    if (id!=guiid)
    {
      wingetpos,x,y,,,Compressor Win 7
      guiexist=0
      gui,1:hide
    }
  }

;tooltip,%ottime%`n%volmaxtime%`n%resettime%`n%newvol%`n
;tooltip,% gain "`n" newvol
  if guiexist=1
  {
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &involValues)
    involL:=VA_Scalar2dB(NumGet(involValues, 0, "float"),0,40)*2.5
    involR:=VA_Scalar2dB(NumGet(involValues, 4, "float"),0,40)*2.5
    gui,submit,nohide
    GuiControl,,Volumein,%involL%
    GuiControl,,Volumein2,%involR%
    GuiControl,,Volumeout,%outvol%
    gain:=gain/100
    outvolshow+=1
    outvoltextt+=outvol
    if outvolshow>2
    {
      outvolshowt:=outvoltextt/outvolshow
      GuiControl,,outvoltext,% Round(outvolshowt)
      outvolshow=
      outvoltextt=
      GuiControl,,volnow,% Round(newvol)
      GuiControl,,gainset,% Round(gain*100)

    }
    if (multipliertext!=multiplier or otvoltext!=otvol or dovoltext!=dovol)
    {
      multipliertext:=multiplier
      otvoltext:=otvol
      dovoltext:=dovol
      if (otvol>dovol)
      {
        temp:=otvol+1
        GuiControl,,dovol,%temp%
        GuiControl,,dovoltext,%temp%
      }
      if (dovol<otvol)
      {
        temp:=dovol-1
        GuiControl,,otvol,%temp%
        GuiControl,,otvoltext,%temp%
      }
      GuiControl,,multipliertext,%multipliertext%
      GuiControl,,otvoltext,%otvol%
      GuiControl,,dovoltext,%dovol%
    }
    temp1+=1
    if (temp1>100 and tooltipshow!=1)
    {
      if !FadeOut
        control,enable,,Edit5,Compressor Win 7
      else
        control,disable,,Edit5,Compressor Win 7
      if notebook
        control,enable,,msctls_trackbar325,Compressor Win 7
      else
        control,disable,,msctls_trackbar325,Compressor Win 7
      temp1=
      Gui,1:-AlwaysOnTop
      Gui,1:+AlwaysOnTop
    }
    if (A_TimeIdle>300 and tooltipshow="")
    {
      tooltipshow=1
      mousegetpos,,,mwin,mctrl
      if (mwin=guiid)
      {
        if mctrl=Button1
          tooltip,Перезапустить и сохранить настройки.
        else if mctrl=Button2
          tooltip,Сбросить настройки.
        else if mctrl=msctls_trackbar321
          tooltip,Уровень громкости`, к которому`nстремится выходной уровень.
        else if mctrl=msctls_trackbar322
          tooltip,Уровень сигнала`, ниже которого`nгромкость будет нарастать`nс интервалом %otvoltime% ms.
        else if mctrl=msctls_trackbar323
          tooltip,Уровень сигнала`, выше которого`nгромкость будет убывать`nс интервалом %dovoltime% ms.
        else if mctrl=msctls_trackbar324
          tooltip,Текущий уровень громкости.
        else if mctrl=msctls_trackbar325
          tooltip,Уровень усиления для ноутбука.
        else if mctrl=msctls_progress321
          tooltip,Входной уровень.
        else if mctrl=msctls_progress323
          tooltip,Входной уровень.
        else if mctrl=msctls_progress322
          tooltip,Выходной уровень`nсигнала.
        else if mctrl=Button3
          tooltip,Сглаживание при`nвозрастании громкости.
        else if mctrl=Button4
          tooltip,Сглаживание при`nубывании громкости.
        else if mctrl=Edit1
          tooltip,Задержка при возрастании`,`nесли уровень ниже %otvol%
        else if mctrl=Edit2
          tooltip,Задержка при убывании`,`nесли уровень выше %dovol%
        else if mctrl=Edit3
          tooltip,Скорость увеличения громкости`nпри "стремлении" к %multiplier%`n%flatup% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if mctrl=Edit4
          tooltip,Скорость уменьшения громкости`nпри "стремлении" к %multiplier%`n%flatDOwn% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if mctrl=Static8
          tooltip,Последний интервал срабатывания.
        else if mctrl=Static9
          tooltip,Текущее состояние`n"стремления" к %multiplier%
        else if mctrl=Edit5
          tooltip,Время отсутствия сигнала`, через которое произойдет`nсброс громкости на %multiplier%
        else if mctrl=Button5
          tooltip,Восстанавливать громкость`nпосле сброса на %multiplier%
        else if mctrl=Edit6
          tooltip,Скорость восстановления.`n%FadeInSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if mctrl=Button6
          tooltip,Псевдо-FadeOut.`nПостепенно уменьшает громкость до %multiplier%`,`n если звуков не воспроизводится.
        else if mctrl=Edit7
          tooltip,Скорость затухания.`n%FadeOutSpeed% единиц громкости за %voltime% милисекунд (1 цикл программы).
        else if mctrl=Button7
          tooltip,Сбрасывать громкость почти до нуля`,`n вместо %multiplier%.
        else if mctrl=Button8
          tooltip,Гасить импульсы короче`, чем %Impulsesettime% милисекунд.
        else if mctrl=Static11
          tooltip,Длительность последнего восстановленного импульса.
        else if mctrl=Button11
          tooltip,Режим "Ноутбук".`nРегулирует уровни нормализации синхронно с`nрегулировкой громкости в системе пользователем.
        else if mctrl=Edit8
          tooltip,Длинна импульса для гашения.
        else if mctrl=Button12
          tooltip,Сохранить настройки и выйти.
      }
    }
    else if (A_TimeIdle<100 and tooltipshow!="")
    {
      tooltipshow=
      tooltip
    }
  }
}
return

ShowWin:
GuiControl,,newvolset,%newvol%
GuiControl,,gain,% gain*100
gui,1:show
guiexist=1
return


reload:
run,%a_scriptfullpath%
goto,exit
return

ReloadSettings:
ReloadSettings=1
Regdelete,HKCU,%Settingspath%
goto,exit
return

Notebooke:
gain:=savegain
resetnow=1
return

removetooltip:
tooltip
return

exit:
if guiexist=0
  gui,1:show
sleep,100
wingetpos,x,y,,,Compressor Win 7
if ReloadSettings=
{
  if !notebook
    gain:=savegain
  gain:=gain*100
  gosub,SaveSettings
}
if (fail=1 or ReloadSettings=1)
  run,%a_scriptfullpath%
exitapp
return

SaveSettings:
if Settingspath=
  Settingspath=SOFTWARE\Unknown_AHK_Script
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
    {
      Setting:=a_loopfield
      Break
    }
  }
  save:=%Setting%
  RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Save%
}
LoadSettings:
if Settingspath=
  Settingspath=SOFTWARE\Unknown_AHK_Script
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
      Setting:=a_loopfield
    else if a_index=2
      Default:=a_loopfield
    else
      Default.="=" a_loopfield
  }
  RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  if errorlevel
  {
    RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default%
    RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
  }
}
Return
;///////////////////////////////////////////////////////////////////////////////
~WheelUp::
MouseGetPos, xpos, ypos
if (ypos<Height)
  {
    return
  }
else
	{
	IfWinActive, Compressor Win 7
{
control,disable,,msctls_trackbar321,Compressor Win 7
control,disable,,msctls_trackbar322,Compressor Win 7
control,disable,,msctls_trackbar323,Compressor Win 7
if (work=0)
{
SoundSet +1
}
otvol++
dovol++
multiplier++
GuiControl,,otvol,%otvol%
GuiControl,,dovol,%dovol%
resetdone=1
GuiControl,,multiplier,%multiplier%
control,Enable,,msctls_trackbar321,Compressor Win 7
control,Enable,,msctls_trackbar322,Compressor Win 7
control,Enable,,msctls_trackbar323,Compressor Win 7
SetTimer , skrit , 1000
return
}
else
{
 gosub , ShowWin
	}
}
return
;----------------------------------------------
~WheelDown::
MouseGetPos, xpos, ypos
if (ypos<Height)
  {
    return
  }
else
	{
	IfWinActive, Compressor Win 7
{
control,disable,,msctls_trackbar321,Compressor Win 7 
control,disable,,msctls_trackbar322,Compressor Win 7
control,disable,,msctls_trackbar323,Compressor Win 7
if (work=0)
{
SoundSet -1
}
otvol--
dovol--
multiplier--
GuiControl,,otvol,%otvol%
GuiControl,,dovol,%dovol%
GuiControl,,multiplier,%multiplier%
control,Enable,,msctls_trackbar321,Compressor Win 7
control,Enable,,msctls_trackbar322,Compressor Win 7
control,Enable,,msctls_trackbar323,Compressor Win 7
SetTimer , skrit , 1000
return
}
else
{
 gosub , ShowWin
	}
}
return
;---------------------------------------------------
skrit:
if hide=1
{
  gui,1:hide
  guiexist=0
}
else
{
  guiexist=1
}
SetTimer , skrit , off
return

"control,disable,,msctls_trackbar321,Compressor Win 7"  - это для того чтобы фокус мышки не был на одном слайдере.
Вариант конечно не ахти я просто учусь.

Win10 x64

75

Re: AHK: Аудио компрессор для windows 7,8,10

Zanoza, расставьте заглавные буквы и точки.

76

Re: AHK: Аудио компрессор для windows 7,8,10

Для новой версии добавь в конец скрипта следующий код:

#if (!App and (undertray() or underapp()))
wheelup::
if work
{
  if notebook
  {
    gain+=0.05
    newvol+=2
    gosub,wheeeel
    gosub,wheeeeeeel
  }
  else
  {
    newvol++
    gosub,wheeeel
    tooltip,% Round(newvol)
  }
}
else
{
  newvol++
  gosub,wheeeel
  tooltip,% Round(newvol)
}
settimer,removetooltip,-1000
return

wheeldown::
if work
{
  if notebook
  {
    gain-=0.05
    gosub,wheeeeeeel
  }
  else
  {
    newvol--
    gosub,wheeeel
    tooltip,% Round(newvol)
  }
}
else
{
  newvol--
  gosub,wheeeel
  tooltip,% Round(newvol)
}
settimer,removetooltip,-1000
return

wheeeel:
newvol:= newvol<0 ? 0 : newvol>100 ? 100 : newvol
;GuiControl,,Setgain,% Setgain
GuiControl,,newvolset,% newvol
VA_SetMasterVolume(newvol,"","")
return

wheeeeeeel:
wait=200+voltime
;resetnow=1
gain:=gain<0 ? 0 : gain>2 ? 2 : gain
tmpgain:=Round(gain*100)
GuiControl,,Setgain,% tmpgain
tooltip,% tmpgain
settimer,removetooltip,-1000
if gain=0
  vol:=newvol:=0
;vol:=newvol:=newvolset
;if guiexist
;  GuiControl,,newvolset,% round(newvol)
return
#if

undertray()
{
;  static Height:=A_ScreenHeight-30 ; разрешение экрана
  mousegetpos,,y,w
  wingetclass,c,ahk_id %w%
  if (c="Shell_TrayWnd")
    return 1
;  if (y>Height)
;    return 1
}
underapp()
{
  global ListWin
  mousegetpos,,,w
  winget,pid,PID,ahk_id %w%
  if instr(ListWin,pid+0)
    return 1
}

А вот этого лучше не делать:

otvol++
dovol++
multiplier++

otvol--
dovol--
multiplier--

Вместо этого используй режим "Ноутбук".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

77

Re: AHK: Аудио компрессор для windows 7,8,10

Alectric
Спасибо, все работает!

Win10 x64

78 (изменено: Alectric, 2016-08-03 17:11:28)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 19
Исправление мелких ошибок.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

79 (изменено: Zanoza, 2016-08-03 21:30:59)

Re: AHK: Аудио компрессор для windows 7,8,10

Alectric
В win10 tooltip показывается сверху а не возле курсора эсли включить регулировку роликом. Есть ли возможность задать определённые координаты  или желательно  по центру ?
Вот пример когда курсор находится  на чекбоксе "микшер"
http://hostingkartinok.com/show-image.p … e3e01a4648
И есть ли возможность изменить в нем размер шрифта ?
Заранее спасибо за любой ответ!

Win10 x64

80 (изменено: Alectric, 2016-08-03 22:50:14)

Re: AHK: Аудио компрессор для windows 7,8,10

1)

Zanoza пишет:

показывается сверху а не возле курсора

Только с этим скриптом или даже с простым?

loop
{
  tooltip,% a_tickcount
  sleep,10
}

Как вариант, попробуй закоментировать пятую строку:

CoordMode,ToolTip

2)

Zanoza пишет:

если включить регулировку роликом.

А если не включать то всё нормально?
3)

Zanoza пишет:

изменить в нем размер шрифта

В нём - это в подсказке или во всём окне?

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

81 (изменено: Zanoza, 2016-08-04 03:01:16)

Re: AHK: Аудио компрессор для windows 7,8,10

Alectric
1:
"показывается сверху а не возле курсора"
Показывает любую подсказку tooltip сверху если курсор возле панели задач.
Я так понял что ему места снизу мало.
пример:
http://hostingkartinok.com/show-image.p … d91cee6b19
и
http://hostingkartinok.com/show-image.p … 295b7a6445
Это в 10тке такой прикол.

2:
"если включить регулировку роликом."
Я имел ввиду что информация о состоянии громкости появляется не рядом с курсором а в самом верху.
Также происходит и в самой программе если близко к низу.
Вот пример:
Курсор на "Ноутбук"
http://hostingkartinok.com/show-image.p … 56ea912d2f
А сейчас опущу окно ниже и наведу курсор на тоже место в программе.
http://hostingkartinok.com/show-image.p … 868645e575
Если регулировать роликом то tooltip всегда сверху так как курсор снизу.

3:
"И есть ли возможность изменить в нем размер шрифта ?"
Я имел ввиду tooltip который выдает инфо о состоянии громкости.
Просто не удобно когда он сверху , да и не видно его практически.
Хотелось бы чтоб инфа о состоянии регулятора громкости появлялась по центру экрана и немного больше шрифт!
Или проще - как сделать " tooltip,% Round(newvol) " по середине экрана и цифры побольше размером)

Win10 x64

82

Re: AHK: Аудио компрессор для windows 7,8,10

Всё ясно, через время будет обновление.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

83 (изменено: Alectric, 2016-08-04 20:52:56)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 20
Добавлена возможность регулировать громкость роликом над панелью задач. Включается в настройках.
Также можете сами добавить условия, в которых регулировка роликом активна, в конце исходного скрипта (отмечено комментарием).


Сообщайте об ошибках, если обнаружите.



Zanoza
Кстати, не рекомендую обе ограничительные шкалы делать на 100... тем более при использовании режима "Ноутбук". И шкала "стремления" должна находится между нижним и верхним ограничением, для получения желаемой громкости.

Post's attachments

Безымянный.png 68.32 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

84

Re: AHK: Аудио компрессор для windows 7,8,10

Спасибо за внимание и обнову !

Win10 x64

85 (изменено: Alectric, 2016-12-10 10:07:27)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 21
Добавлена настройка "Количество измерений для усреднения" в "доводке звука до центра". Мелкие доработки.
Изменён путь настроек: старый - "SOFTWARE\DF\Compressor"; теперь - "SOFTWARE\AlectricSoft\Compressor".
Т.к. путь настроек изменён, старые настройки сбросятся.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

86 (изменено: Alectric, 2017-06-14 22:08:35)

Re: AHK: Аудио компрессор для windows 7,8,10

Update 22
Ещё раз исправлена линейность звука.
Добавлена настройка линейности звука.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

87 (изменено: belyankin12, 2017-06-15 09:30:32)

Re: AHK: Аудио компрессор для windows 7,8,10

Слушайте, а можете подцепить программу к TeamSpeak? Например если кто-то начинает говорить, то громкость всех приложений снижается. Либо просто скажите как мне узнать о том, что кто-то говорит в конференции TeamSpeak (значок пользователя окрашивается в светлый цвет (но это плохая затея, ибо TS может использоваться с полноэкранным приложением ,и положение значка меняется, либо через программу overwolf выводится всплывающее окно о том, что кто-то что-то говорит), а я уже сам как-нибудь попробую.

Установлен таймер с именем removetooltip, но целевой метки не существует.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

88 (изменено: Alectric, 2017-06-15 16:42:46)

Re: AHK: Аудио компрессор для windows 7,8,10

belyankin12 пишет:

Установлен таймер с именем removetooltip, но целевой метки не существует.

Не весь код скопировал наверно, если нет попробуй EXE файл из архива.

Попробуй выставить следующие настройки:
Включить нормализацию;
Включить "Микшер";
Настроить громкость нужного тебе приложения на максимум;
На остальных приложениях немного убавить громкость.

Вот картинка, чтобы наглядней было.

+ открыть спойлер

http://forum.script-coding.com/misc.php?action=pun_attachment&amp;item=1349&amp;download=0

Post's attachments

Безымянный.png 56.06 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

89 (изменено: Alectric, 2017-06-15 16:56:53)

Re: AHK: Аудио компрессор для windows 7,8,10

А вообще вот:
http://forum.script-coding.com/viewtopi … 02#p100602
https://www.google.ru/search?newwindow= … Zm1mzCP1EE
http://forum.script-coding.com/viewtopic.php?id=11670

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

90

Re: AHK: Аудио компрессор для windows 7,8,10

Alectric, а я то думал, почему такая мощная программа занимает всего 200 строчек, а оказалось что только кусочек скопировал. Работает на win 10, спасибо.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

91

Re: AHK: Аудио компрессор для windows 7,8,10

Update 23
Исправлена ошибка при использовании полно-экранных приложений и "Микшера", эти приложения могут не корректно завершаться, т.к. не поддерживают "сворачивания".
История.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

92

Re: AHK: Аудио компрессор для windows 7,8,10

Подскажите пожалуйста для тех кто в танке, как программу правильно настроить?

93

Re: AHK: Аудио компрессор для windows 7,8,10

Смотря что ты хочешь получить от неё в итоге.
Вообще нажми кнопку сброса вверху, настройки по умолчанию и есть правильные.
Можно поставить галочки "Скрывать окно при потере фокуса" и "Микшер".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

94

Re: AHK: Аудио компрессор для windows 7,8,10

Допустим есть игра, где есть голосовой чат и там у некоторых криво настроен микрофон и когда они заходят и начинают говорить, звук с их микрофона начинает сильно фонить\зашкаливать, а у некоторых он наоборот тихий, вот я так понимаю компрессор поможет в том случае не оглохнуть и резко сбросить уровень громкости до определенного или повысить до комфортного...

Есть вот в драйверах Realtek тонкомпенсация, это я так понимаю аналогичные функции, тихие делать громче, громкие тише, но там ничего не страивается, просто галочка. А как правильно настроить вашу программу? Где задается этот уровень (3 столбец?), какие лучше галочки ставить? За что отвечает первый столбец (да, я читал описание при наведении, но ничего не понял -))? Остальные столбики, что значат? Извиняюсь, если вопросы тупые и ответы очевидные..

95

Re: AHK: Аудио компрессор для windows 7,8,10

Итак по порядку:
1) Первый регулятор "Уровень к которому стремится выходной уровень" - если шкала "Выходной уровень" (которая в центре) ниже заданного в этом регуляторе, то громкость будет потихоньку увеличиваться.
Скорость увеличения задаётся в настройке "Скорость увеличения при стремлении" и "количество циклов для усреднения".
Соответственно если шкала "Выходной уровень" выше заданного в этом регуляторе - будет потихоньку уменьшаться по такому же принципу.
Скорость уменьшения задаётся в настройке "Скорость уменьшения при стремлении" и "количество циклов для усреднения".

2) Следующий регулятор "Уровень сигнала, ниже которого громкость будет нарастать" - если шкала "Выходной уровень" ниже заданного в этом регуляторе, то громкость будет увеличиваться в соответствии с двумя настройками ниже. Это "smooth" или "Сглаживание при возрастании громкости" и вторая "Задержка при возрастании".
Если сглаживание включено, то громкость будет изменяться на 1 единицу за указанный промежуток времени ("Задержка при возрастании"), если отключена, то будет вычисляться на сколько нужно прибавить громкость чтобы "Выходной уровень" был равен настройке "Уровень сигнала, ниже которого громкость будет нарастать".

3) Следующий регулятор "Уровень сигнала, выше которого громкость будет убывать" - аналогично предыдущей, но на уменьшение громкости.

4) "Текущий уровень громкости" - который видно в стандартном микшере windows.

5) "Усиление" - похоже на масштабирование сигнала, программно меняет "Выходной уровень" чтобы программа думала что громкость ниже или выше, соответственно итоговая (слышимая) громкость будет выше или ниже.

6) "Время отсутствия сигнала, через которое произойдет сброс" системного регулятора громкости на установленную в первой настройке величину. Т.е. если звук перестал идти (пауза в плеере например).

7) "Fade in" - если после паузы в плеере снова запустить воспроизведение, то громкость будет нарастать с указанной скоростью пока "Выходной уровень" не достигнет установленного в первой настройке.

8) "Псевдо Fade out" - если поставить плеер на паузу, то настройка 6 будет игнорироваться, в место этого громкость будет уменьшаться с заданной скоростью пока не достигнет установленного в первой настройке.

9) "Impulse" - если "Выходной уровень" превысит уровень настройки 3 и если время этого превышения окажется меньше заданного времени, то системный регулятор вернется на тот же уровень который был в момент до прихода этой громкости (импульса громкости).

Вроде всё расписал.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

96 (изменено: Alectric, 2017-08-18 18:12:45)

Re: AHK: Аудио компрессор для windows 7,8,10

a154802, для твоего случая должны подойти следующие настройки:
Основное окно: нормализация выключено, микшер включен.
Для нужного приложения: первая настройка = 20, вторая = 15, третья = 25, пятая = по желанию, девятая = 700, остальное поумолчанию.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

97

Re: AHK: Аудио компрессор для windows 7,8,10

Update 24
Исправлены ошибки интерфейса при измененном масштабе в Windows.

Сообщайте об ошибках если такие есть, постараюсь выдать скрипту костыли.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.