#Requires AutoHotkey v2.0-a #SingleInstance Force start := False step_base := InputBox("Enter a step size:", "Binary Search Volume", , 5) If(step_base.Result != "OK") { ExitApp } step_base := step_base.Value step := step_base expected := 0 last_time := A_Now streak := 0 start := True Return FloorCeil(up) { global step_base, step, expected, last_time If(!up) { SoundSetVolume(step_base*Floor(SoundGetVolume()/step_base)) } Else { SoundSetVolume(step_base*Ceil(SoundGetVolume()/step_base)) } step := step_base expected := SoundGetVolume() last_time := A_Now } Volume_Up:: { global start, step_base, step, expected, last_time, streak If(!start) { Return } If(SoundGetVolume() != expected || DateDiff(last_time, A_Now, "S") > 180) { streak := 3 FloorCeil(True) Return } If(streak >= 0) { streak := streak+1 } Else { streak := 1 step := step/2 } If(streak == 3) { last := SoundGetVolume() FloorCeil(True) If(Abs(SoundGetVolume()-last) < 0.1) { SoundSetVolume("+" . step) } } Else { SoundSetVolume("+" . step) } expected := SoundGetVolume() last_time := A_Now } Volume_Down:: { global start, step_base, step, expected, last_time, streak If(!start) { Return } If(SoundGetVolume() != expected || DateDiff(last_time, A_Now, "S") > 180) { streak := -3 FloorCeil(False) Return } If(streak <= 0) { streak := streak-1 } Else { streak := -1 step := step/2 } If(streak == -3) { last := SoundGetVolume() FloorCeil(False) If(Abs(SoundGetVolume()-last) < 0.1) { SoundSetVolume(-step) } } Else { SoundSetVolume(-step) } expected := SoundGetVolume() last_time := A_Now }