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, расставьте заглавные буквы и точки.