; https:
2do..
    notify on volume changes 
    
    make flashing icon optional? (not everyone hides their taskbar)
global $version = "0.7.2.1"
global $my_version = FileGetVersion(@ScriptFullPath, "FileVersion")
global $special_build = ""
; 
; 
AutoItSetOption("GUIOnEventMode", 1)
AutoItSetOption("GUICoordMode", 0)
AutoItSetOption("TrayMenuMode", 11)
AutoItSetOption("TrayOnEventMode", 1)
$my_name = "LoopDropZ"
$my_domain = "corz.org"
global $my_title = "LoopDropZ"
global $ini_file = $my_name & ".ini"
global $my_url = "http:
global $versioncheck_url = "http:
global $download_url = "http://corz.org/windows/software/loopdropz/
global $me_app
global const $tray_event_primarydown = -7
global const $tray_event_mouseover = -11
global $droppedfiles[1]
if @Compiled then
    $me_app = @ScriptFullPath
else
    $me_app = "C:\Program Files\corz\LoopDropZ\LoopDropZ.exe"
endif
$data_dir = @AppDataDir & "\corz\" & $my_name
$ini_path = $my_name & ".ini"
$debug_level = 10
$dump_file = $data_dir & "\LoopDropZ_Debug.log"
if FileExists($data_dir & "\" & $ini_path) then
    $debug_level = Int(IniRead($data_dir & "\" & $ini_path, $my_name, "debug_level", $debug_level))
endif
if FileExists($dump_file) then FileDelete($dump_file)
global $quit = -99, $multi_loop, $gui_edit, $lv_sort_flag, $unloop, $tray_loop, $tray_looplist
global $switches, $exit, $disk, $path, $LoopZGUI, $installed_ini, $gui_prefs, $favourites, $hmm_wipe = 0
global $x, $y, $width, $height, $min_width, $width_magic, $min_height, $height_magic
global $def_ix, $def_iy, $def_iw, $input_x, $input_y, $input_width
global $show_tips, $notify, $taskbar_entry, $always_on_top, $explorer_context, $explorer_default
global $tray_on_top, $tray_show_tips, $tray_context, $tray_def_cmd
global $start_with_windows, $tray_startup, $start_minimized, $tray_startmin
global $fade_in, $step, $state, $info_time, $timer_stamp = 0, $preview, $keep_file_in_title
global $visible, $hover_to_show, $hover_sensitivity, $img_on_buttons
global $wav_file, $lab_wav_file, $but_playstop, $lab_dropzone, $lab_drop1
global $combo_wav_file, $wav_len, $wav_lenm, $wav_size, $dropped_file
global $reg_user, $reg_to, $proud_wearer, $waited = false, $wait_for = 0, $display_user
global $garbage_collector, $gui_about
global $portable, $tmpini
global $wav_volume, $volume_up_key = "{NUMPADADD}", $volume_down_key = "{NUMPADSUB}"
global $big_jump, $volume_big_up_key = "^{NUMPADADD}", $volume_big_down_key = "^{NUMPADSUB}"
    
func __________________START_HERE()
endfunc
if $cmdline[0] then
    debug_PrintArray($cmdline, "$cmdline:", @ScriptLineNumber, 7)
    if $cmdline[0] > 1 then
        $switches = StringStripWS($cmdline[1], 3)
        debug("$switches: " & $switches, @ScriptLineNumber, 7)
        global $load_list
        for $i = 2 to $cmdline[0]
            local $this_file = StringStripWS($cmdline[$i], 3)
            if $this_file then $load_list &= $this_file & "***"
        next
        CRT($load_list, "***")
        $load_list = StringSplit($load_list, "***", 1)
        debug_PrintArray($load_list, "$load_list:", @ScriptLineNumber, 7)
    else
        global $load_list[2] = [1, StringStripWS($cmdline[$cmdline[0]], 3)]
    endif
    
    $path = $load_list[1]
else
    global $load_list[2] = [1, ""]
endif
debug("$path: " & $path, @ScriptLineNumber, 7)
debug("$switches: " & $switches, @ScriptLineNumber, 7)
debug_PrintArray($load_list, "$load_list:", @ScriptLineNumber, 7)
if $path = "portable" then
    $installed_ini = FileInstall("Resources\LoopDropZ.ini", @ScriptDir & "\" & $ini_file)
    $path = ""
endif
if FileExists(@ScriptDir & "\" & $ini_file) then
    $portable = true
    $data_dir = @ScriptDir
    $ini_path = $data_dir & "\" & $ini_file
else
    $data_dir = @AppDataDir & "\corz\" & $my_name
    if not FileExists($data_dir) then DirCreate($data_dir)
    $ini_path = $data_dir & "\" & $ini_file
    $installed_ini = FileInstall("Resources\LoopDropZ.ini", $ini_path)
endif
if not IsWritable($ini_path) then
    $tmpini = @TempDir & "\LoopDropZ_TEMP.ini"
    FileCopy($ini_path, $tmpini)
    if FileExists($tmpini) then
        $ini_path = $tmpini
        FileSetAttrib($tmpini, "-SHRA")
    endif
endif
DoSplash("Looping FREE.. ", $my_title, $my_url)
if not $installed_ini then UpdateINI()
GetPrefs()
global $do_layer = false
if IsArray($load_list) then
    switch $switches
        case "preview",  "p"
            if FileExists($path) and GetExtension($path) = "wav" then
                PreviewWAV($path)
                exit 0
            endif
        case "layer", "l"
            $do_layer = true
    endswitch
endif
GetLogLocation()
MakeTray()
TraySetOnEvent($tray_event_mouseover, "WindowToFront")
TraySetOnEvent($tray_event_primarydown, "TrayToggleWindow")
MakeGUI()
CheckStartupLink()
SetAlwaysOnTop()
SetHotKeys()
if $do_layer then
    SimpleLayer($load_list)
elseif FileExists($path) then
    AddStringToCombo($combo_wav_file, $path, "wav_file")
    GUICtrlSetData($combo_wav_file, $path)
    LoopSound($path)
else
    UpdateSound(true)
endif
if $cmdline[0] then
    if $cmdline[1] = "all" or  $cmdline[1] = "a" then LoopList()
endif
while $quit = -99
    Sleep(1000)
wend
func GetPrefs()
    $x = IniRead($ini_path, $my_name, "x", -1)
    $y = IniRead($ini_path, $my_name, "y", @DesktopHeight / 4)
    $width = IniRead($ini_path, $my_name, "width", 480)
    $height = IniRead($ini_path, $my_name, "height", 130)
    $min_width = IniRead($ini_path, $my_name, "min_width", 70)
    $width_magic = 8
    $min_height = IniRead($ini_path, $my_name, "min_height", 25)
    $height_magic = 34
    $def_ix = 30
    $def_iy = 241
    $def_iw = 484
    $input_x = IniRead($ini_path, $my_name, "input_x", $def_ix)
    $input_y = IniRead($ini_path, $my_name, "input_y", $def_iy)
    $input_width = IniRead($ini_path, $my_name, "input_width", $def_iw)
    
    $show_tips = IniReadCheckboxValue($ini_path, $my_name, "show_tips", $ON)
    $taskbar_entry = IniReadCheckboxValue($ini_path, $my_name, "taskbar_entry", $OFF)
    $always_on_top = IniReadCheckboxValue($ini_path, $my_name, "always_on_top", $OFF)
    $explorer_context = IniReadCheckboxValue($ini_path, $my_name, "explorer_context", $OFF)
    $explorer_default = IniReadCheckboxValue($ini_path, $my_name, "explorer_default", $OFF)
    $start_with_windows = IniReadCheckboxValue($ini_path, $my_name, "start_with_windows", $OFF)
    $start_minimized = IniReadCheckboxValue($ini_path, $my_name, "start_minimized", $OFF)
    $hover_to_show = IniReadCheckboxValue($ini_path, $my_name, "hover_to_show", $ON)
    $hover_sensitivity = Abs(Int(IniRead($ini_path, $my_name, "hover_sensitivity", 8)))
    $fade_in = IniReadCheckboxValue($ini_path, $my_name, "fade_in", $ON)
    $step = IniRead($ini_path, $my_name, "step", 5)
    $state = IniRead($ini_path, $my_name, "state", "looping")
    $img_on_buttons = IniReadCheckboxValue($ini_path, $my_name, "img_on_buttons", $ON)
    
    $info_time = IniRead($ini_path, $my_name, "info_time", 5000)
    $keep_file_in_title = IniReadCheckboxValue($ini_path, $my_name, "keep_file_in_title", $OFF)
    
    $wav_volume = Int(IniRead($ini_path, $my_name, "wav_volume", 50))
    $volume_up_key = IniRead($ini_path, $my_name, "volume_up_key", "{NUMPADADD}")
    $volume_down_key = IniRead($ini_path, $my_name, "volume_down_key", "{NUMPADSUB}")
    $volume_big_up_key = IniRead($ini_path, $my_name, "volume_big_up_key", "^{NUMPADADD}")
    $volume_big_down_key = IniRead($ini_path, $my_name, "volume_big_down_key", "^{NUMPADSUB}")
    $big_jump = Int(IniRead($ini_path, $my_name, "big_jump", 10))
    
endfunc
func MakeGUI()
    if $taskbar_entry = $ON then
        $LoopZGUI = GUICreate($my_title & "..", $width, $height, $x, $y, _
            BitOR($ws_caption, $ws_sysmenu, $ws_minimizebox, $ws_sizebox), $ws_ex_acceptfiles)
    else
        local $dummy_container = GUICreate("", -1, -1, 0, 0, 0, BitOR($ws_ex_acceptfiles, $WS_EX_TOOLWINDOW))
        $LoopZGUI = GUICreate($my_title & "..", $width, $height, $x, $y, _
        BitOR($ws_caption, $ws_popup, $ws_sysmenu, $ws_minimizebox, $ws_sizebox), -1, $dummy_container)
    endif
    
    GUISetIcon($me_app, 0, $LoopZGUI)
    
    GUISetOnEvent($gui_event_close, "MenuDoQuit")
    GUISetOnEvent($gui_event_resized, "ResizeCheckSize")
    GUISetOnEvent($gui_event_primaryup, "PrimaryUPCheckSize")
    GUISetOnEvent($gui_event_minimize, "TrayToggleWindow")
    
    GUIRegisterMsg(563, "DropfilesFunc")
    
    
    
    
    
    local $dummy_volume_up = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "HK_WAVVolumeUP")
    local $dummy_volume_down = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "HK_WAVVolumeDOWN")
    local $dummy_volume_big_up = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "HK_WAVVolumeBigUP")
    local $dummy_volume_big_down = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "HK_WAVVolumeBigDOWN")
    $lab_dropzone = GUICtrlCreateLabel("DROP-ZONE", 0, 32, $width, $height - 32, BitOR($ss_notify, $ss_center), $gui_ws_ex_parentdrag)
    GUICtrlSetFont(-1, 50, 600, 1, "Arial Black")
    GUICtrlSetColor(-1, 11579568)
    GUICtrlSetCursor(-1, 9)
    local $dummy_begin = GUICtrlCreateGroup("", -9999, -9999)
    GUISetCoord(0, 0)
    $lab_drop1 = GUICtrlCreateLabel("", 0, 0, $width, 7, $ss_notify, $gui_ws_ex_parentdrag)
    GUICtrlSetState(-1, $gui_dropaccepted)
    GUICtrlSetCursor(-1, 9)
    $lab_wav_file = GUICtrlCreateLabel("Loops:", 5, 10, 32, Default, $ss_notify, $gui_ws_ex_parentdrag)
    GUICtrlSetCursor(-1, 9)
    $combo_wav_file = GUICtrlCreateCombo("", 35, -3, $width - 72, 200)
    GUICtrlSetOnEvent(-1, "ComboUpdateSound")
    BuildCombo($combo_wav_file, "wav_file")
    
    local $ctxt_source = GUICtrlCreateContextMenu($combo_wav_file)
    GUICtrlCreateMenuItem("&Open Wav Folder", $ctxt_source)
    GUICtrlSetOnEvent(-1, "OpenCurrentWAVParent")
    GUICtrlCreateMenuItem("", $ctxt_source)
    GUICtrlCreateMenuItem("Add to Favourites", $ctxt_source)
    GUICtrlSetOnEvent(-1, "AddToFavourites")
    GUICtrlSetTip(-1, "Add the current wav to your favourites group")
    GUICtrlCreateMenuItem("Save As Favourites", $ctxt_source)
    GUICtrlSetOnEvent(-1, "SaveFavourites")
    GUICtrlCreateMenuItem("Load Favourites", $ctxt_source)
    GUICtrlSetOnEvent(-1, "LoadFavourites")
    GUICtrlCreateMenuItem("", $ctxt_source)
    GUICtrlCreateMenuItem("&Delete This Item", $ctxt_source)
    GUICtrlSetOnEvent(-1, "WipeWavFileItem")
    GUICtrlCreateMenuItem("&Wipe The List", $ctxt_source)
    GUICtrlSetOnEvent(-1, "WipeWavFileList")
    GUICtrlCreateMenuItem("", $ctxt_source)
    GUICtrlCreateMenuItem("&Sort The List", $ctxt_source)
    GUICtrlSetOnEvent(-1, "SortWAVFileList")
    GUICtrlCreateMenuItem("&Edit The List", $ctxt_source)
    GUICtrlSetOnEvent(-1, "EditCombo")
    
    $but_playstop = GUICtrlCreateButton(" ", $width - 67, 0, 22, 21, BitOR($bs_icon, $ws_tabstop))
    GUICtrlSetOnEvent(-1, "ButtPlayStopButton")
    GUICtrlSetState(-1, $gui_dropaccepted)
    
    if $img_on_buttons = $ON then
        GUICtrlSetImage($but_playstop, @SystemDir & "\shell32.dll", -138, 0)
    else
        GUICtrlSetData($but_playstop, "loop")
    endif
    
    local $dummy_end = GUICtrlCreateGroup("", -9999, -9999)
    for $i = $dummy_begin to $dummy_end
        GUICtrlSetResizing($i, $gui_dockall)
    next
    
    GUICtrlSetResizing($lab_dropzone, $gui_dockborders)
    GUICtrlSetResizing($lab_drop1, $gui_dockheight)
    GUICtrlSetResizing($combo_wav_file, $gui_dockall + $gui_dockright)
    GUICtrlSetResizing($but_playstop, $gui_dockright + $gui_dockwidth + $gui_dockheight + $gui_docktop)
    
    SetShowTips()
    CheckSize()
    
    
    local $AppHotKeys[4][2] = [ _
                        [$volume_up_key, $dummy_volume_up], _
                        [$volume_down_key, $dummy_volume_down], _
                        [$volume_big_up_key, $dummy_volume_big_up], _
                        [$volume_big_down_key, $dummy_volume_big_down] _
                        ]
    GUISetAccelerators($AppHotKeys)
    
    if $fade_in = $ON then
        if $start_minimized = $OFF then
            FadeIn($LoopZGUI, $step)
        else
            GUISetState()
        endif
    endif
    
    $visible = true
    SetDropOn()
    if $start_minimized = $ON then ToggleWindow()
    
endfunc
func MakeTray()
    $tray_loop = TrayCreateItem("Loop The Sound..    F8 or Ctrl+\")
    TrayItemSetOnEvent(-1, "ButtPlayStopButton")
    $tray_looplist = TrayCreateItem("Loop The Entire List..    Ctrl+L")
    TrayItemSetOnEvent(-1, "TrayLoopList")
    TrayCreateItem("")
    TrayCreateItem("Open WAV File..    Ctrl+O")
    TrayItemSetOnEvent(-1, "OpenWAV")
    TrayCreateItem("Load a Folder of WAVs..    Ctrl+F")
    TrayItemSetOnEvent(-1, "OpenWAVFolder")
    TrayCreateItem("")
    TrayCreateItem("Volume Control..    Ctrl+A")
    TrayItemSetOnEvent(-1, "LaunchVolumeControl")
    TrayCreateItem("Edit INI File (prefs)..    Ctrl+P")
    TrayItemSetOnEvent(-1, "EditINIFile")
    TrayCreateItem("")
    $tray_show_tips = TrayCreateItem("Show ToolTips")
    TrayItemSetState(-1, $show_tips)
    TrayItemSetOnEvent(-1, "ToggleShowTips")
    $tray_on_top = TrayCreateItem("Always on Top")
    TrayItemSetState(-1, $always_on_top)
    TrayItemSetOnEvent(-1, "ToggleAlwaysOnTop")
    
    
    
    
    
    
    
    TrayCreateItem("")
    $tray_startmin = TrayCreateItem("Start Minimized")
    TrayItemSetState(-1, $start_minimized)
    TrayItemSetOnEvent(-1, "MenuToggleStartMinimized")
    $tray_startup = TrayCreateItem("Start with Windows")
    TrayItemSetState(-1, $start_with_windows)
    TrayItemSetOnEvent(-1, "MenuToggleStartWithWin")
    TrayCreateItem("")
    TrayCreateItem("About " & $my_name & "..")
    TrayItemSetOnEvent(-1, "EventDoAboutBox")
    TrayCreateItem("")
    TrayCreateItem("Quit    Esc or Alt+F4")
    TrayItemSetOnEvent(-1, "TrayQuit")
    SetupTray()
endfunc
func SetupTray()
    TraySetClick(8)
    TraySetState(1)
    TraySetIcon($me_app, 0)
    TraySetTip()
endfunc
func EditCombo()
    DialogOpen()
    $lv_sort_flag = false
    local $last_event_mode = AutoItSetOption("GUIOnEventMode", 0)
    local $last_coord_mode = AutoItSetOption("GUICoordMode", 1)
    local $raw_data = GrabComboPref("wav_file")
    local $data = StringSplit($raw_data, "|")
    local $e_x = $x + 10
    local $e_y = $y + 30
    local $e_width = $width - 48
    local $e_height = 55 + (15 * $data[0])
    if $e_height > (@DesktopHeight - $e_y - 24) then $e_height = @DesktopHeight - $e_y - 24
    $gui_edit = GUICreate(" Edit the Loop List..", $e_width, $e_height, $e_x, $e_y, _
                            BitOR($ws_caption, $ws_sizebox), $WS_EX_TOOLWINDOW, $LoopZGUI)
    local $list_loops = GUICtrlCreateListView("Loops..", 5, 5, $e_width - 5, $e_height - 38, BitOR($lvs_report, 0))
    GUICtrlSetResizing(-1, $gui_dockauto + $gui_dockstatebar + $gui_docktop + $gui_dockleft)
    FillListView($gui_edit, $list_loops, $data)
    local $butt_top = $e_height - 25
    local $but_edit_up = GUICtrlCreateButton("&UP", 5, $butt_top, 40, 22)
    local $but_edit_down = GUICtrlCreateButton("&DOWN", 45, $butt_top, 40, 22)
    local $but_edit_del = GUICtrlCreateButton("Del&ete", 100, $butt_top, 40, 22)
    local $but_edit_sort = GUICtrlCreateButton("So&rt", 150, $butt_top, 40, 22)
    local $but_edit_cancel = GUICtrlCreateButton("&Cancel", $e_width - 105, $butt_top, 50, 22)
    local $but_edit_ok = GUICtrlCreateButton("&Save", $e_width - 45, $butt_top, 40, 22)
    for $i = $but_edit_up to $but_edit_sort
        GUICtrlSetResizing($i, $gui_docksize + $gui_dockleft)
    next
    for $i = $but_edit_cancel to $but_edit_ok
        GUICtrlSetResizing($i, $gui_docksize + $gui_dockright)
    next
    if $show_tips = $ON then
        GUICtrlSetTip($but_edit_up, " Move the selcted file(s) UP. ")
        GUICtrlSetTip($but_edit_down, " Move the selcted file(s) DOWN. ")
        GUICtrlSetTip($but_edit_del, " Delete the selected file(s) from the list. ")
        GUICtrlSetTip($but_edit_sort, " Sort the list (click again to reverse-sort). ")
        GUICtrlSetTip($but_edit_cancel, " Close this window and don't save any changes. ")
        GUICtrlSetTip($but_edit_ok, " Save any changes and close this window. ")
    endif
    GUISetState()
    while 1
        local $msg = GUIGetMsg()
        switch $msg
            case $gui_event_close, $but_edit_cancel
                exitloop
            case $but_edit_up
                MoveListViewItemsUP($gui_edit, $list_loops, $data)
            case $but_edit_down
                MoveListViewItemsDOWN($gui_edit, $list_loops, $data)
            case $but_edit_del
                DeleteListViewItem($gui_edit, $list_loops, $data)
            case $but_edit_sort
                SortListView($gui_edit, $list_loops, $data)
            case $but_edit_ok
                WriteArrayToPref($data, "wav_file")
                BuildCombo($combo_wav_file, "wav_file")
                exitloop
        endswitch
        local $size_array = WinGetPos(" Edit the Loop List..")
        if IsArray($size_array) and $size_array[2] < 310 then WinMove(" Edit the Loop List..", "", Default, Default, 310)
    wend
    GUIDelete($gui_edit)
    AutoItSetOption("GUICoordMode", $last_coord_mode)
    AutoItSetOption("GUIOnEventMode", $last_event_mode)
    DialogClose()
endfunc
func DoSplash($sp_msg, $sp_app, $sp_url)
    if $waited then return true
    AdLibRegister("SetWaited", 1000)
    local $last_event_mode = AutoItSetOption("GUIOnEventMode", 0)
    local $last_coord_mode = AutoItSetOption("GUICoordMode", 0)
    local $d_height = 55
    local $d_width = 180
    local $gui_info = GUICreate($sp_msg, $d_width, $d_height, -1, -1, Default, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUICtrlCreateIcon($me_app, 0, 10, 10)
    GUICtrlCreateLabel($sp_app & " v" & $my_version & $MSG_LF & "from corz.org", 48, 0)
    GUISetState()
    while not $waited
        Sleep(25)
        local $msg = GUIGetMsg()
        switch $msg
            case $gui_event_close
                DoQuit(-33)
            case $gui_event_primarydown
                VisitURL($sp_url)
                $waited = true
        endswitch
    wend
    GUIDelete($gui_info)
    AutoItSetOption("GUIOnEventMode", $last_event_mode)
    AutoItSetOption("GUICoordMode", $last_coord_mode)
endfunc
func _______________STRING_FUNCS()
endfunc
func ConvertNames($some_path, $convert_level = 2)
    local $ab_file = $some_path
    local $ub_file = StringToBinary($some_path, $convert_level)
    $ab_file = BinaryToString($ub_file, 1)
    if $some_path <> $ab_file then
        $some_path = FileGetShortName($some_path)
    endif
    return $some_path
endfunc
func SortWAVFileList()
    SortComboPrefsList($combo_wav_file, "wav_file")
endfunc
func SortComboPrefsList(byref $control, $ini_prefname)
    if GUICtrlRead($control) == "" then return
    local $tmppref = GUICtrlRead($control)
    local $tmp = "|" & GrabComboPref($ini_prefname) & "|"
    local $array = StringSplit($tmp, "|")
    $array = BubbleSort($array)
    $tmp = "|"
    for $i = 1 to $array[0]
        if $i then $tmp &= $array[$i] & "|"
    next
    IniWrite($ini_path, $my_name, $ini_prefname, $tmp)
    BuildCombo($control, $ini_prefname)
    ControlCommand($LoopZGUI, "", $control, "selectString", $tmppref)
endfunc
func WriteArrayToPref(byref $data, $ini_prefname)
    if not IsArray($data) then return false
    local $tmp = "|"
    for $i = 1 to $data[0]
        if $data[$i] then
            $tmp &= $data[$i] & "|"
        endif
    next
    IniWrite($ini_path, $my_name, $ini_prefname, $tmp)
endfunc
func ______________SOUND_FUNCS()
endfunc
func PreviewWAV($path)
    debug("PreviewWAV(" & $path & ")...", @ScriptLineNumber, 5)
    local $memory = GetFreeMem()
    if FileGetSize($path) >= $memory then
        Beep(40, 150)
        Speak("2. Big!", 50, 5)
        exit -3
    endif
    $preview = true
    SetupTray()
    TraySetState(4)
    TraySetToolTip(" LoopDropZ..  " & $MSG_LF & " Previewing: " & CleanName($path) & " ")
    local $tray_abort = TrayCreateItem("Abort")
    TrayItemSetOnEvent(-1, "TrayQuit")
    TraySetClick(9)
    local $sound = _SoundOpen($path)
    _SoundPlay($sound)
    if _SoundStatus($sound) <> "" then
        while 1
            Sleep(100)
            if _SoundPos($sound, 2) >= _SoundLength($sound, 2) then exitloop
        wend
        _SoundCLose($sound)
    else
        TraySetToolTip(" LoopDropZ..  " & $MSG_LF & " Previewing: " & CleanName($path) & $MSG_LF & "[this sound cannot be aborted] ")
        TraySetState(8)
        TraySetClick(0)
        TrayItemDelete($tray_abort)
        SoundPlay($path, 1)
        SoundPlay("")
    endif
endfunc
func LoopSound($file, $noloop = false, $sync = false)
    debug("LoopSound(" & $file & "," & $noloop  & "," & $sync & ")...", @ScriptLineNumber, 5)
    local $loop = true
    if ce_IsPressed(10) or $noloop then $loop = false
    AdlibUnRegister("ResetTitle")
    DllCall("winmm.dll", "int", "PlaySoundA", "int", 0, "int", 0, "int", $snd_purge)
    GetSoundInfo($file)
    local $show_time = $wav_lenm
    local $memory = GetFreeMem()
    if $wav_size >= $memory then
        local $alert = MsgBox(4 + 48 + 256, "MEMORY ALERT!!!", _
            "The selected wav file is larger than the available system memory! " & $MSG_LF & _
            "Continuing could have unexpected and potentially disastrous effects." & $MSG_LF & $MSG_LF & _
            "Do you still wish to attempt to loop this file? ", 0, $LoopZGUI)
        if $alert <> 6 then
            WipeSingleComboItem($combo_wav_file, "wav_file")
            return false
        endif
    endif
    if $loop then
        $state = "Looping"
        DllCall("winmm.dll", "int", "PlaySoundA", "str", $file, "long", 0, "int", BitOR($SND_ASYNC, $SND_FILENAME, $SND_LOOP))
    else
        $state = "Playing"
        local $flags1 = BitOR($SND_ASYNC, $SND_FILENAME)
        if $sync then $flags1 = $SND_FILENAME
        DllCall("winmm.dll", "int", "PlaySoundA", "str", $file, "int", 0, "int", $flags1)
    endif
    TraySetTip($state & ": " & CleanName($file))
    local $my_title = " " & Chr(187) & Chr(187) & " " & $state & ": " & CleanName($file) & "  [" & $wav_len & "] " & _
                        Chr(171) & Chr(171)
    
    if $keep_file_in_title = $ON then
        SetFixedTitle($my_title)
    else
        SetInfoTitle($my_title, $show_time)
    endif
    
    SetStopButton()
endfunc
func TrayLoopList()
    LoopList()
endfunc
l "B:\Archive\Entrainment\[Presets]\Brainwave Generator\primal7.wav" "B:\Archive\Entrainment\[Presets]\Brainwave Generator\chant.wav" "B:\Archive\Entrainment\[Presets]\Brainwave Generator\metadrop.wav"
l "B:\Archive\Entrainment\[Presets]\Brainwave Generator\deepend.wav" "B:\Archive\Entrainment\[Presets]\Brainwave Generator\Perfect5th.wav"
func SimpleLayer($file_array)
    debug("SimpleLayer()...", @ScriptLineNumber, 5)
    if not IsArray($file_array) then return false
    local $sounds_array[$file_array[0]+1] = [$file_array[0]+1]
    debug_PrintArray($file_array, "$file_array:", @ScriptLineNumber, 7)
    debug_PrintArray($sounds_array, "$sounds_array:", @ScriptLineNumber, 7)
    SetDropOff()
    SetStopButton()
    $unloop = false
    for $i = 1 to $file_array[0]
        local $file = $file_array[$i]
        local $memory = GetFreeMem()
        if FileGetSize($file) >= $memory then
            SetInfoTitle(" FILE TOO BIG FOR MEMORY! ")
            return false
        endif
        TraySetTip("Layering.. ")
        $sounds_array[$i] = _SoundOpen($file)
        _SoundPlay($sounds_array[$i])
    next
    debug_PrintArray($sounds_array, "$sounds_array:", @ScriptLineNumber, 7)
    while not $unloop
        for $i = 1 to $file_array[0]
             if _SoundStatus($sounds_array[$i]) = "stopped" then _SoundPlay($sounds_array[$i])
        next
        Sleep(10)
    wend
    for $i = 1 to $file_array[0]
        _SoundClose($sounds_array[$i])
    next
    SetDropOn()
    TraySetTip()
endfunc
func LoopList()
    AdlibUnRegister("ResetTitle")
    SetStopButton()
    TrayItemSetState($tray_looplist, 128)
    $unloop = false
    $state = "LoopList"
    local $llist = GrabComboPref("wav_file")
    $llist = StringSplit($llist, "|")
    for $i = 1 to $llist[0]
        local $lpath = $llist[$i]
        if not FileExists($lpath) then continueloop
        local $lsnd = _SoundOpen($lpath)
        SetInfoTitle(" " & Chr(187) & Chr(187) & " Loop List: " & $i & " of " & $llist[0] & ": " & _
            CleanName($lpath) & "  [" & _SoundLength($lsnd) & "] " & Chr(171) & Chr(171), _SoundLength($lsnd, 2))
        _SoundPlay($lsnd)
        while _SoundPos($lsnd, 2) < _SoundLength($lsnd, 2)
            Sleep(100)
            if $unloop then
                $state = "Stopped"
                SetInfoTitle(" [" & $state & "]", $info_time / 2)
                _SoundCLose($lsnd)
                TrayItemSetState($tray_looplist, 64)
                return
            endif
        wend
        _SoundCLose($lsnd)
    next
    LoopList()
endfunc
func OverlapAudio($file)
    local $memory = GetFreeMem()
    if FileGetSize($file) >= $memory then
        SetInfoTitle(" FILE TOO BIG FOR MEMORY! ")
        return false
    endif
    local $sound = _SoundOpen($file)
    SetDropOff()
    local $tmplen = _SoundLength($sound)
    TraySetTip("Previewing: " & CleanName($file))
    SetInfoTitle(" " & Chr(187) & Chr(187) & _
                " Previewing: " & CleanName($file) & "  [" & $tmplen & "] [please wait]" & Chr(171) & Chr(171), $tmplen * 1000)
    _SoundPlay($sound)
    while 1
        Sleep(100)
        if _SoundPos($sound, 2) >= _SoundLength($sound, 2) then exitloop
    wend
    _SoundCLose($sound)
    SetDropOn()
    TraySetTip()
endfunc
func GetSoundInfo($file)
    local $sound = _SoundOpen($file)
    $wav_len = _SoundLength($sound)
    $wav_lenm = _SoundLength($sound, 2)
    $wav_size = FileGetSize($file)
    _SoundCLose($sound)
endfunc
func OldSpeak($text, $vol = 50, $rate = 1.1)
    local $o_speech = ObjCreate("SAPI.SpVoice")
    if not IsObj($o_speech) then return
    with $o_speech
        .rate = $rate
        .volume = $vol
        .Speak($text)
    endwith
endfunc
func comboUpdateSound()
    UpdateSound()
endfunc
func UpdateSound($startup = false)
    debug("UpdateSound(startup: " & $startup & ")...", @ScriptLineNumber, 5)
    local $file = GUICtrlRead($combo_wav_file)
    debug("$file: " & $file, @ScriptLineNumber, 7)
    if not FileExists($file) or GetExtension($file) <> "wav" then
        SetInfoTitle(" No such wav file! ", $info_time)
        WipeSingleComboItem($combo_wav_file, "wav_file")
        return false
    endif
    
    local $noloop = false
    if $startup then
        if $state = "Stopped" then
            SetInfoTitle(" [" & $state & "]", $info_time)
            return
        endif
        if $state = "Playing" then $noloop = true
    endif
    $state = "Stopped"
    LoopSound($file, $noloop)
endfunc
func HotKeyPlayOnce()
    switch $state
        case "Playing", "Looping", "LoopList"
            StopSound()
        case else
            $state = "Playing"
            UpdateSound(true)
    endswitch
endfunc
func ButtPlayStopButton()
    switch $state
        case "Looping", "Playing", "LoopList"
            StopSound()
        case else
            UpdateSound()
    endswitch
endfunc
func SetPlayButton()
    if $img_on_buttons = $ON then
        GUICtrlSetImage($but_playstop, @SystemDir & "\shell32.dll", -138, 0)
    else
        GUICtrlSetData($but_playstop, "loop")
    endif
    GUICtrlSetTip($but_playstop, " Click here to begin looping the selected wav file. (F8 or Ctrl+\)" & $MSG_LF & _
                                " Hold down the SHIFT key to play the sound ONCE ONLY.  (F9 or Ctrl+/)")
    TraySetTip()
    TrayItemSetText($tray_loop, "Loop The Sound..    F8 or Ctrl+\")
endfunc
func SetStopButton()
    if $img_on_buttons = $ON then
        GUICtrlSetImage($but_playstop, @SystemDir & "\shell32.dll", -28, 0)
    else
        GUICtrlSetData($but_playstop, "stop")
    endif
    GUICtrlSetTip($but_playstop, " Click here to stop the sound. (F8, F9, Ctrl+\ or Ctrl+/) ")
    TrayItemSetText($tray_loop, "Stop The Sound..    F8 or Ctrl+\")
endfunc
func StopSound()
    DllCall("winmm.dll", "int", "PlaySoundA", "int", 0, "int", 0, "int", $snd_purge)
    $state = "Stopped"
    $unloop = true
    ResetTitle()
    SetPlayButton()
endfunc
func _________________CONTROLS()
endfunc
func SetDropOff()
    TraySetState(4)
    GUICtrlSetState($lab_dropzone, $gui_nodropaccepted)
    GUICtrlSetState($lab_dropzone, $gui_disable)
    GUICtrlSetState($lab_drop1, $gui_nodropaccepted)
    GUICtrlSetState($lab_wav_file, $gui_nodropaccepted)
    GUICtrlSetState($combo_wav_file, $gui_nodropaccepted)
    GUICtrlSetState($but_playstop, $gui_nodropaccepted)
endfunc
func SetDropOn()
    GUICtrlSetState($lab_dropzone, $gui_enable)
    GUICtrlSetState($lab_dropzone, $gui_dropaccepted)
    GUICtrlSetState($lab_drop1, $gui_dropaccepted)
    GUICtrlSetState($lab_wav_file, $gui_dropaccepted)
    GUICtrlSetState($combo_wav_file, $gui_dropaccepted)
    GUICtrlSetState($but_playstop, $gui_dropaccepted)
    TraySetState(8)
endfunc
func SortListView(byref $hwnd, byref $control, byref $data)
    if $lv_sort_flag then
        $data = BubbleSort($data)
        _arrayreverse($data, 1)
        $lv_sort_flag = false
    else
        $data = BubbleSort($data)
        $lv_sort_flag = true
    endif
    FillListView($hwnd, $control, $data)
endfunc
func MoveListViewItemsUP(byref $hwnd, byref $control, byref $data)
    if not IsArray($data) then return false
    local $item_id = ControlListView($hwnd, "", $control, "Getselected", 1)
    local $id_array = StringSplit($item_id, "|")
    for $j = 1 to $id_array[0]
        local $sel_idx = $id_array[$j]
        local $sel_item = ControlListView($hwnd, "", $control, "GetText", $sel_idx)
        if $sel_idx > 0 then
            _ArrayDelete($data, $sel_idx + 1)
            _ArrayInsert($data, $sel_idx, $sel_item)
        endif
    next
    FillListView($hwnd, $control, $data)
    for $j = 1 to $id_array[0]
        local $itm = $id_array[$j] - 1
        if $itm = -1 then $itm = 0
        ControlListView($hwnd, "", $control, "select", $itm)
    next
endfunc
func MoveListViewItemsDOWN(byref $hwnd, byref $control, byref $data)
    if not IsArray($data) then return false
    local $item_id = ControlListView($hwnd, "", $control, "Getselected", 1)
    local $id_array = StringSplit($item_id, "|")
    for $j = $id_array[0] to 1 Step -1
        local $sel_idx = $id_array[$j]
        local $sel_item = ControlListView($hwnd, "", $control, "GetText", $sel_idx)
        _ArrayDelete($data, $sel_idx + 1)
        local $ins = $sel_idx + 2
        if $ins > $data[0] then $ins = $data[0]
        _ArrayInsert($data, $ins, $sel_item)
    next
    FillListView($hwnd, $control, $data)
    for $j = $id_array[0] to 1 Step -1
        local $itm = $id_array[$j] + 1
        if $itm = $data[0] then $itm = $id_array[$j]
        ControlListView($hwnd, "", $control, "select", $itm)
    next
endfunc
func DeleteListViewItem(byref $hwnd, byref $control, byref $data)
    if not IsArray($data) then return false
    local $item_id = ControlListView($hwnd, "", $control, "Getselected", 1)
    local $id_array = StringSplit($item_id, "|")
    for $j = $id_array[0] to 1 Step -1
        _ArrayDelete($data, $id_array[$j] + 1)
        $data[0] -= 1
    next
    FillListView($hwnd, $control, $data)
endfunc
func FillListView($hwnd, byref $control, byref $data)
    debug("FillListView(" & $control & "," & $data & ")...", @ScriptLineNumber, 8)
    if not IsArray($data) then return false
    _guictrllistview_deleteallitems($control)
    for $i = 1 to $data[0]
        if $data[$i] then
            GUICtrlCreateListViewItem($data[$i], $control)
        endif
    next
    GUICtrlSendMsg($control, $lvm_setcolumnwidth, 0, $lvscw_autosize)
    ControlFocus($hwnd, "", $control)
endfunc
func GrabComboPref($ini_prefname)
    debug("GrabComboPref(" & $ini_prefname & ")...", @ScriptLineNumber, 5)
    local $tmp = IniRead($ini_path, $my_name, $ini_prefname, "")
    $tmp = StringStripWS($tmp, 3)
    $tmp = StringReplace($tmp, "||", "|")
    while StringRight($tmp, 1) = "|"
        $tmp = StringTrimRight($tmp, 1)
    wend
    while StringLeft($tmp, 1) = "|"
        $tmp = StringTrimLeft($tmp, 1)
    wend
    return $tmp
endfunc
func BuildCombo(byref $control, $ini_prefname)
    debug("BuildCombo(" & $control & "," & $ini_prefname & ")...", @ScriptLineNumber, 5)
    GUICtrlSetOnEvent($combo_wav_file, "")
    local $data = GrabComboPref($ini_prefname)
    $data = StringSplit($data, "|")
    GUICtrlSetData($control, "")
    if $data[0] then
        for $i = 1 to $data[0]
            if $data[$i] then
                ControlCommand($LoopZGUI, "", $control, "AddString", $data[$i])
            endif
        next
        GUICtrlSetOnEvent($combo_wav_file, "ComboUpdateSound")
        ControlCommand($LoopZGUI, "", $control, "selectString", $data[$data[0]])
    endif
endfunc
func AddStringToCombo(byref $control, $new_str, $ini_prefname, $live_update = true)
    debug("AddStringToCombo(" & $control & "," & $new_str  & "," & $ini_prefname & "," & $live_update & ")...", @ScriptLineNumber, 5)
    local $tmp = "|" & GrabComboPref($ini_prefname) & "|"
    if $new_str <> "" and not StringInStr($tmp, "|" & $new_str & "|") then
        IniWrite($ini_path, $my_name, $ini_prefname, $tmp & $new_str & "|")
    endif
    if $live_update then
        ControlCommand($LoopZGUI, "", $control, "AddString", $new_str)
        ControlCommand($LoopZGUI, "", $control, "selectString", $new_str)
    endif
endfunc
func SetComboToCurrent(byref $control, $ini_prefname)
    debug("SetComboToCurrent(" & $control & "," & $ini_prefname &  ")...", @ScriptLineNumber, 5)
    if GUICtrlRead($control) = "" then return false
    local $tmp = "|" & GrabComboPref($ini_prefname) & "|"
    $tmp = StringReplace($tmp, "|" & GUICtrlRead($control) & "|", "|")
    IniWrite($ini_path, $my_name, $ini_prefname, $tmp & GUICtrlRead($control) & "|")
    BuildCombo($control, $ini_prefname)
endfunc
func LoadFavourites()
    LoadFaveGroup("favourites", "", $combo_wav_file, "wav_file")
endfunc
func SaveFavourites()
    local $exi_faves = IniRead($ini_path, $my_name, "favourites", "")
    if $exi_faves then
        local $def = IniRead($ini_path, $my_name, "ow_faves", "")
        if $def = "no" then SetInfoTitle(" No save performed, as per user default action.", $info_time)
        local $ret = YesNoMsgBox("Overwrite existing Faviourites?", _
                                "Are you absolutely sure you wish to overwrite the existing Faviourites?  ", 0, $def)
        if @error = 1 then IniWrite($ini_path, $my_name, "ow_faves", $ret)
        if $ret <> "yes" then return false
    endif
    if SaveFaveGroup("favourites", "wav_file") then SetInfoTitle(" Favourites successfully saved.", $info_time)
endfunc
func AddToFavourites()
    local $fave = GUICtrlRead($combo_wav_file)
    AddStringToCombo($combo_wav_file, $fave, "favourites", false)
endfunc
func LoadFaveGroup($def_grp_pref, $default, byref $combo, $combo_pref)
    local $i = IniRead($ini_path, $my_name, $def_grp_pref, $default)
    IniWrite($ini_path, $my_name, $combo_pref, $i)
    BuildCombo($combo, $combo_pref)
endfunc
func SaveFaveGroup($def_grp_pref, $combo_pref)
    local $i = GrabComboPref($combo_pref)
    if $i = "" then return false
    local $def_grp = "|" & $i & "|"
    return IniWrite($ini_path, $my_name, $def_grp_pref, $def_grp)
endfunc
func WipeWAVFileItem()
    WipeSingleComboItem($combo_wav_file, "wav_file")
endfunc
func WipeWAVFileList()
    local $tmp
    if ce_IsPressed(10) then $tmp = GUICtrlRead($combo_wav_file)
    local $def = IniRead($ini_path, $my_name, "do_wipe", "")
    switch $def
        case "no"
            SetInfoTitle(" USER DEFAULT ACTION PREVENS WIPE ", $info_time / 2)
        case "yes"
            SetInfoTitle(" LIST WIPED ", $info_time / 2)
    endswitch
    local $ret = YesNoMsgBox("Really Wipe?", "Are you absolutely sure you wish to completely wipe the list?  ", 0, $def)
    if @error = 1 then IniWrite($ini_path, $my_name, "do_wipe", $ret)
    if $ret <> "yes" then return
    SetInfoTitle(" Loop List Wiped", $info_time / 2)
    WipeCombo($combo_wav_file, "wav_file", $tmp)
endfunc
func WipeCombo(byref $control, $ini_prefname, $tmp = "")
    IniWrite($ini_path, $my_name, $ini_prefname, "")
    BuildCombo($control, $ini_prefname)
    if $tmp then
        ControlCommand($LoopZGUI, "", $control, "AddString", $tmp)
        ControlCommand($LoopZGUI, "", $control, "selectString", $tmp)
    endif
endfunc
func WipeSingleComboItem(byref $control, $ini_prefname)
    if GUICtrlRead($control) = "" then return false
    local $tmp = "|" & GrabComboPref($ini_prefname) & "|"
    $tmp = StringReplace($tmp, "|" & GUICtrlRead($control) & "|", "|")
    IniWrite($ini_path, $my_name, $ini_prefname, $tmp)
    BuildCombo($control, $ini_prefname)
endfunc
func __________________SYSTEM()
endfunc
func TrayToggleWindow()
    ToggleWindow()
endfunc
func ToggleWindow()
    local $winstate = WinGetState($LoopZGUI)
    if BitAND($winstate, 2) then
        UnSetHotKeys()
        GUISetState(@SW_HIDE, $LoopZGUI)
        $visible = false
        _ReduceMemory()
    else
        GUISetState(@SW_SHOW, $LoopZGUI)
        $visible = true
        SetHotKeys()
    endif
endfunc
func ResizeCheckSize()
    CheckSize()
endfunc
func PrimaryUPCheckSize()
    CheckSize()
endfunc
func CheckSize($save=true)
    local $size_array = WinGetPos($LoopZGUI)
    if not IsArray($size_array) then return 0
    if $size_array[2] < $min_width + $width_magic then WinMove($LoopZGUI, "", Default, Default, $min_width + $width_magic)
    if $size_array[3] < $min_height + $height_magic then WinMove($LoopZGUI, "", Default, Default, Default, $min_height + $height_magic)
    Sleep(25)
    $size_array = WinGetPos($LoopZGUI)
    if not IsArray($size_array) then return 0
    if $size_array[0] > @DesktopWidth - $size_array[2] + 12 then
        WinMove($LoopZGUI, "", @DesktopWidth - $size_array[2], Default, Default)
    endif
    if $size_array[1] > @DesktopHeight - $size_array[3] + 12 then
        WinMove($LoopZGUI, "", Default, @DesktopHeight - $size_array[3], Default)
    endif
    Sleep(25)
    $size_array = WinGetPos($LoopZGUI)
    if not IsArray($size_array) then return 0
    if $size_array[0] < 0 then
        WinMove($LoopZGUI, "", 0, Default)
        if $save then IniWrite($ini_path, $my_name, "x", 0)
    endif
    if $size_array[0] > @DesktopWidth - $size_array[2] then
        WinMove($LoopZGUI, "", @DesktopWidth - $size_array[2] + 12, Default)
        if $save then IniWrite($ini_path, $my_name, "x", @DesktopWidth - $size_array[2])
    endif
    if $size_array[1] < 0 then
        WinMove($LoopZGUI, "", Default, 0)
        if $save then IniWrite($ini_path, $my_name, "y", 0)
    endif
    if $size_array[1] > @DesktopHeight - $size_array[3] + 12 then
        WinMove($LoopZGUI, "", Default, @DesktopHeight - $size_array[3])
        if $save then IniWrite($ini_path, $my_name, "y", @DesktopHeight - $size_array[3])
    endif
    return true
endfunc
func SaveXYPrefs()
    if not CheckSize() then return 0
    local $size_array = WinGetPos($LoopZGUI)
    if not IsArray($size_array) then return 0
    if $x <> $size_array[0] and $size_array[0] >= 0 and $size_array[0] < (@DesktopWidth - 25) then
        IniWrite($ini_path, $my_name, "x", $size_array[0])
    endif
    if $y <> $size_array[1] and $size_array[1] >= 0 and $size_array[1] < (@DesktopHeight - 25) then
        IniWrite($ini_path, $my_name, "y", $size_array[1])
    endif
    $size_array = WinGetClientSize($LoopZGUI)
    if not IsArray($size_array) then return 0
    if $size_array[0] <> $width and $size_array[0] >= $min_width then IniWrite($ini_path, $my_name, "width", $size_array[0])
    if $size_array[1] <> $height and $size_array[1] >= $min_height then IniWrite($ini_path, $my_name, "height", $size_array[1])
endfunc
func YesNoMsgBox($ynmb_title, $ynmb_text, $timeout=0, $default="", $hwnd=default)
    if $hwnd = default then $hwnd = $LoopZGUI
    local $curr = GUICtrlRead($combo_wav_file)
    if $default <> "" and $curr <> "" then return $default
    if $curr = "" then
        $hmm_wipe += 1
        if $hmm_wipe == 3 then
            $hmm_wipe = 0
            local $do_reset = MsgBox(1, "Reset this menu item to its default state?", _
                "This item has been deactivated by your (someone's!) request. " & $MSG_LF & _
                "Do you wish to reset the menu item's behaviour to its default state? ", 0, $hwnd)
            if $do_reset == 1 then
                IniDelete($ini_path, $my_name, "do_wipe")
                $default = ""
            endif
        endif
        if $default <> "" then
            DialogClose()
            return $default
        endif
    endif
    DialogOpen()
    local $last_event_mode = AutoItSetOption("GUIOnEventMode", 0)
    local $last_coord_mode = AutoItSetOption("GUICoordMode", 0)
    local $response = ""
    local $ynmb_width = 360
    if StringLen($ynmb_text) > 130 then $ynmb_width = StringLen($ynmb_text) * 2
    if $ynmb_width < 360 then $ynmb_width = 360
    local $ynmb_height = UBound(StringSplit($ynmb_text, $MSG_LF)) * 20 + 20
    if $hwnd then
        local $size_array = WinGetPos($LoopZGUI)
        local $ynmb_left = ($size_array[0] + ($size_array[2] / 2)) - ($ynmb_width / 2)
        local $ynmb_top = ($size_array[1] + ($size_array[3] / 3)) - ($ynmb_height / 3)
    else
        $ynmb_left = (@DesktopWidth / 2) - ($ynmb_width / 2)
        $ynmb_top = (@DesktopHeight / 2) - ($ynmb_height)
    endif
    local $style = BitOR($ws_caption, $ws_popup, $ws_sysmenu)
    local $ynmb = GUICreate($ynmb_title, $ynmb_width, $ynmb_height, $ynmb_left, $ynmb_top, $style, -1, $hwnd)
    GUICtrlCreateLabel($ynmb_text, 15, 10)
    local $but_yes = GUICtrlCreateButton("&Yes", -5, $ynmb_height - 37, 60, 25)
    local $but_no = GUICtrlCreateButton("&No", 70, 0, 60, 25, $bs_defpushbutton)
    local $chk_remember = GUICtrlCreateCheckbox("always do this action", 75, 0, Default, Default, BitOR($bs_right, $bs_autocheckbox))
    GUISetCoord($ynmb_width - 65, $ynmb_height - 28)
    local $but_cancel = GUICtrlCreateButton("A&bort", -1, -1, 60, 25)
    GUISetState(@SW_SHOW)
    if $timeout <> 0 then local $dialog_begin = TimerInit()
    Do
        local $msg = GUIGetMsg()
        switch $msg
            case $but_cancel, $gui_event_close
                exitloop
            case $but_yes
                $response = "yes"
            case $but_no
                $response = "no"
        endswitch
        if $timeout <> 0 then
            if TimerDiff($dialog_begin)/1000 > $timeout then
                exitloop
            endif
        endif
    until $response <> ""
    local $rem = GUICtrlRead($chk_remember)
    GUIDelete($ynmb)
    AutoItSetOption("GUICoordMode", $last_coord_mode)
    AutoItSetOption("GUIOnEventMode", $last_event_mode)
    DialogClose()
    return SetError($rem, $rem, $response)
endfunc
func _ReduceMemory()
    DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
endfunc
func LaunchVolumeControl()
    local $default_vol = "SNDVOL32.EXE"
    if @OSArch = "X64" then $default_vol = "SNDVOL.EXE"
    local $volume_control = IniRead($ini_path, $my_name, "volume_control", $default_vol)
    Run($volume_control)
endfunc
func FadeIn($gui, $step = 5)
    WinSetTrans($gui, "", 0)
    GUISetState(@SW_SHOW, $gui)
    local $i = 100
    while $i >= 3
        WinSetTrans($gui, "", (100 - $i) * 2.55)
        Sleep(5)
        $step = $i / 9
        $i -= $step
    wend
    WinSetTrans($gui, "", 255)
    WinActivate($gui)
endfunc
func WindowToFront()
    if not $visible then return
    if $hover_to_show = $OFF then return
    if $timer_stamp = 0 or TimerDiff($timer_stamp) > 1000 then
        $timer_stamp = TimerInit()
    endif
    local $diff = TimerDiff($timer_stamp)
    if $diff > ((11 - $hover_sensitivity) * 100) then
        $timer_stamp = 0
        WinSetOnTop($LoopZGUI, "", 1)
        WinSetOnTop($LoopZGUI, "", 0)
        Sleep(100)
        WinActivate($LoopZGUI)
        RePaintGUI($LoopZGUI)
    endif
endfunc
func RePaintGUI($hwnd, $trect = 0, $hregion = 0, $iflags = 5)
    local $prect, $aresult
    if $trect <> 0 then $prect = DllStructGetPtr($trect)
    $aresult = DllCall("User32.dll", "int", "RedrawWindow", "hwnd", $hwnd, "ptr", $prect, "int", $hregion, "int", $iflags)
    if IsArray($aresult) then return ($aresult[0] <> 0)
endfunc
func SetAlwaysOnTop()
    if $always_on_top = $ON then
        WinSetOnTop($LoopZGUI, "", 1)
    else
        WinSetOnTop($LoopZGUI, "", 0)
    endif
endfunc
func ToggleAlwaysOnTop()
    if $always_on_top = $OFF then
        $always_on_top = $ON
    else
        $always_on_top = $OFF
    endif
    SetAlwaysOnTop()
    TrayItemSetState($tray_on_top, $always_on_top)
    IniWriteCheckboxValue($ini_path, $my_name, "always_on_top", $always_on_top)
endfunc
func TraySetTip($string = "")
    if $string then $string = $MSG_LF & " " & $string & " "
    TraySetToolTip(" LoopDropZ.. " & $string & $MSG_LF & " Left-click: Show/Hide | Right-click: Menu ")
endfunc
func SetShowTips()
    if $show_tips = $ON then
        GUICtrlSetTip($lab_dropzone, " You can drag and drop wav files *anywhere* onto LoopDropZ. " & $MSG_LF & _
                                " The window resizes real small, too, so you can keep it away in the corner.")
        GUICtrlSetTip($lab_wav_file, " WAV File input. Drag wav files and folders of wav files onto here." & $MSG_LF & _
                                                                    " NOTE: You can drag and drop anywhere on LoopDropZ. ")
        GUICtrlSetTip($combo_wav_file, " This drop-down stores all the wav files you've played." & $MSG_LF & _
                                                            " Right-click this control for some drop-down options. ")
        GUICtrlSetTip($but_playstop, " Click here to begin looping the selected wav file. (F8 or Ctrl+\) " & $MSG_LF & _
                                                    " Hold down the SHIFT key to play the sound ONCE ONLY. (F9 or Ctrl+/)")
    else
        for $i = $lab_dropzone to $but_playstop
            GUICtrlSetTip($i, "")
        next
    endif
endfunc
func ToggleShowTips()
    if $show_tips = $OFF then
        $show_tips = $ON
    else
        $show_tips = $OFF
    endif
    SetShowTips()
    TrayItemSetState($tray_show_tips, $show_tips)
    IniWriteCheckboxValue($ini_path, $my_name, "show_tips", $show_tips)
endfunc
    
        
    
        
    
    
    
    
        
    
        
    
    
        
    
        
    
    
    
    
        
    
        
    
func MenuToggleStartWithWin()
    ToggleStartWithWindows()
endfunc
func ToggleStartWithWindows()
    if $start_with_windows = $ON then
        $start_with_windows = $OFF
    else
        $start_with_windows = $ON
    endif
    TrayItemSetState($tray_startup, $start_with_windows)
    IniWriteCheckboxValue($ini_path, $my_name, "start_with_windows", $start_with_windows)
    CheckStartupLink()
endfunc
func CheckStartupLink()
    local $lnk = @StartupDir & "\" & $my_name & ".lnk"
    if $start_with_windows = $ON then
        if not FileExists($lnk) then
            FileCreateShortcut(@ScriptFullPath, $lnk, "", "startup", "A WAV looper, for your seamless background audio..")
        endif
    else
        FileDelete($lnk)
    endif
endfunc
func MenuToggleStartMinimized()
    ToggleStartMinimized()
endfunc
func ToggleStartMinimized()
    if $start_minimized = $ON then
        $start_minimized = $OFF
    else
        $start_minimized = $ON
    endif
    TrayItemSetState($tray_startmin, $start_minimized)
    IniWriteCheckboxValue($ini_path, $my_name, "start_minimized", $start_minimized)
    CheckStartupLink()
endfunc
func DialogOpen()
    SetDropOff()
    GUISetState(@SW_DISABLE, $LoopZGUI)
    TraySetState(2)
    UnSetHotKeys()
endfunc
func DialogClose()
    TraySetState(1)
    GUISetState(@SW_ENABLE, $LoopZGUI)
    WinActivate($LoopZGUI)
    GUISwitch($LoopZGUI)
    SetHotKeys()
    SetDropOn()
endfunc
func SetFixedTitle($info)
    WinSetTitle($LoopZGUI, "", $my_title & ".." & "  " & $info)
endfunc
func SetInfoTitle($info, $time = "")
    if not $time then $time = $info_time
    AdlibUnRegister("ResetTitle")
    WinSetTitle($LoopZGUI, "", $my_title & ".." & "  " & $info)
    AdlibRegister("ResetTitle", $time)
endfunc
func ResetTitle()
    local $tmp_title = WinGetTitle($LoopZGUI)
    WinSetTitle($LoopZGUI, "", $my_title & "..")
    AdlibUnRegister("ResetTitle")
    if $state <> "Stopped" then
        if $wav_lenm < $info_time then
            WinSetTitle($LoopZGUI, "", $tmp_title)
            AdlibRegister("ResetTitle", $info_time - $wav_lenm)
            $wav_lenm = 1.7e+308
        endif
        if $state = "Playing" then StopSound()
    endif
endfunc
func SetWaited()
    $waited = true
    AdlibUnRegister("SetWaited")
endfunc
func _____________________HOTKEYS()
endfunc
func SetHotKeys()
    HotKeySet("{Esc}", "HK_DoQuit")
    HotKeySet("^o", "HK_OpenWAV")
    HotKeySet("^e", "HK_EditCombo")
    HotKeySet("^f", "HK_OpenWAVFolder")
    HotKeySet("^l", "HK_LoopList")
    HotKeySet("^a", "HK_LaunchVolumeControl")
    HotKeySet("^p", "HK_EditINIFile")
    HotKeySet("{F8}", "HK_PlayStop")
    HotKeySet("{F9}", "HK_PlayOnceStop")
    HotKeySet("^\", "HK_PlayStop2")
    HotKeySet("^/", "HK_PlayOnceStop2")
    HotKeySet("^{Del}", "HK_WipeWavFileItem")
    
    
    
    
    
    
endfunc
func UnSetHotKeys()
    HotKeySet("{Esc}")
    HotKeySet("^o")
    HotKeySet("^e")
    HotKeySet("^f")
    HotKeySet("^l")
    HotKeySet("^a")
    HotKeySet("^p")
    HotKeySet("{F8}")
    HotKeySet("{F9}")
    HotKeySet("^\")
    HotKeySet("^/")
    HotKeySet("^{Del}")
    
    
    
    
    
    ResetCTRLKey()
endfunc
func ResetCTRLKey()
    Send("{CTRLDOWN}")
    Send("{CTRLUP}")
endfunc
func HK_DoQuit()
    if WinActive($LoopZGUI) then
        DoQuit()
    else
        HotKeySet("{Esc}")
        Send("{Esc}")
        HotKeySet("{Esc}", "HK_DoQuit")
    endif
endfunc
func HK_OpenWAV()
    if WinActive($LoopZGUI) then
        OpenWAV()
    else
        HotKeySet("^o")
        Send("^o")
        HotKeySet("^o", "HK_OpenWAV")
        ResetCTRLKey()
    endif
endfunc
func HK_EditCombo()
    if WinActive($LoopZGUI) then
        EditCombo()
    else
        HotKeySet("^e")
        Send("^e")
        HotKeySet("^e", "HK_EditCombo")
        ResetCTRLKey()
    endif
endfunc
func HK_OpenWAVfolder()
    if WinActive($LoopZGUI) then
        OpenWAVfolder()
    else
        HotKeySet("^f")
        Send("^f")
        HotKeySet("^f", "HK_OpenWAVFolder")
        ResetCTRLKey()
    endif
endfunc
func HK_LaunchVolumeControl()
    if WinActive($LoopZGUI) then
        LaunchVolumeControl()
    else
        HotKeySet("^a")
        Send("^a")
        HotKeySet("^a", "HK_LaunchVolumeControl")
        ResetCTRLKey()
    endif
endfunc
func HK_WAVVolumeUP()
    $wav_volume += 1
    if $wav_volume > 100 then $wav_volume = 100
    SoundSetWaveVolume($wav_volume)
endfunc
func HK_WAVVolumeDOWN()
    $wav_volume -= 1
    if $wav_volume < 0 then $wav_volume = 0
    SoundSetWaveVolume($wav_volume)
endfunc
func HK_WAVVolumeBigUP()
    $wav_volume += $big_jump
    if $wav_volume > 100 then $wav_volume = 100
    SoundSetWaveVolume($wav_volume)
endfunc
func HK_WAVVolumeBigDOWN()
    $wav_volume -= $big_jump
    if $wav_volume < 0 then $wav_volume = 0
    SoundSetWaveVolume($wav_volume)
endfunc
func HK_EditINIFile()
    if WinActive($LoopZGUI) then
        EditINIFile()
    else
        HotKeySet("^p")
        Send("^p")
        HotKeySet("^p", "HK_EditINIFile")
        ResetCTRLKey()
    endif
endfunc
func HK_PlayStop()
    if WinActive($LoopZGUI) then
        ButtPlayStopButton()
    else
        HotKeySet("{F8}")
        Send("{F8}")
        HotKeySet("{F8}", "HK_PlayStop")
    endif
endfunc
func HK_PlayStop2()
    if WinActive($LoopZGUI) then
        ButtPlayStopButton()
    else
        HotKeySet("^\")
        Send("^\")
        HotKeySet("^\", "HK_PlayStop2")
        ResetCTRLKey()
    endif
endfunc
func HK_PlayOnceStop()
    if WinActive($LoopZGUI) then
        HotKeyPlayOnce()
    else
        HotKeySet("{F9}")
        Send("{F9}")
        HotKeySet("{F9}", "HK_PlayOnceStop")
    endif
endfunc
func HK_PlayOnceStop2()
    if WinActive($LoopZGUI) then
        HotKeyPlayOnce()
    else
        HotKeySet("^/")
        Send("^/")
        HotKeySet("^/", "HK_PlayOnceStop2")
        ResetCTRLKey()
    endif
endfunc
func hk_WipeWAVFileItem()
    if WinActive($LoopZGUI) then
        WipeWAVFileItem()
    else
        HotKeySet("^{Del}")
        Send("^{Del}")
        HotKeySet("^{Del}", "HK_WipeWavFileItem")
        ResetCTRLKey()
    endif
endfunc
func HK_LoopList()
    if WinActive($LoopZGUI) then
        TrayLoopList()
    else
        HotKeySet("^l")
        Send("^l")
        HotKeySet("^l", "HK_LoopList")
        ResetCTRLKey()
    endif
endfunc
func ___________FILES_AND_PATHS()
endfunc
func GetDroppedItem()
    local $drop_ok = ""
    for $i = 0 to UBound($droppedfiles) - 1
        local $dragfile = $droppedfiles[$i]
        if not FileExists($dragfile) then return false
        local $dropped_file = false
        local $nosubs = false
        if ce_IsPressed(10) then $nosubs = true
        if ce_IsPressed(11) then
            if GetExtension($dragfile) = "wav" or GetExtension($dragfile) = "mp3" then OverlapAudio($dragfile)
            return
        endif
        if IsDir($dragfile) then
            ImportWAVFolder($dragfile, $nosubs)
        else
            switch GetExtension($dragfile)
                case "wav"
                    $dropped_file = $dragfile
                case "lnk"
                    local $lnk_arr = FileGetShortcut($dragfile)
                    select
                        case IsDir($lnk_arr[0])
                            ImportWAVFolder($lnk_arr[0], $nosubs)
                        case GetExtension($lnk_arr[0]) = "wav"
                            $dropped_file = $lnk_arr[0]
                    endselect
                case else
                    return false
            endswitch
        endif
        if $dropped_file then $drop_ok &= "|" & $dropped_file
    next
    if StringLen($drop_ok) then
        $drop_ok = StringTrimLeft($drop_ok, 1)
        local $add_files = StringSplit($drop_ok, "|", 2)
        for $i = 0 to UBound($add_files) - 1
            AddStringToCombo($combo_wav_file, $add_files[$i], "wav_file", false)
        next
        BuildCombo($combo_wav_file, "wav_file")
        ControlCommand($LoopZGUI, "", $combo_wav_file, "selectString", $add_files[0])
        UpdateSound()
    endif
endfunc
func DropfilesFunc($hwnd, $msgid, $wparam, $lparam)
    local $nsize, $pfilename
    local $d_arr = DllCall(@SystemDir & "\shell32.dll", "int", "DragQueryFile", _
                                                        "hwnd", $wparam, _
                                                        "int", -1, _
                                                        "ptr", 0, _
                                                        "int", 255)
    ReDim $droppedfiles[$d_arr[0]]
    for $i = 0 to $d_arr[0] - 1
        $nsize = DllCall(@SystemDir & "\shell32.dll",    "int", "DragQueryFile", _
                                                        "hwnd", $wparam, _
                                                        "int", $i, _
                                                        "ptr", 0, _
                                                        "int", 0)
        $nsize = $nsize[0] + 1
        $pfilename = DllStructCreate("char[" & $nsize & "]")
        DllCall(@SystemDir & "\shell32.dll",    "int", "DragQueryFile", _
                                                "hwnd", $wparam, _
                                                "int", $i, _
                                                "ptr", DllStructGetPtr($pfilename), _
                                                "int", $nsize)
        $droppedfiles[$i] = DllStructGetData($pfilename, 1)
        $pfilename = 0
    next
    GetDroppedItem()
endfunc
func OpenWAV()
    local $wavs_folder = IniRead($ini_path, $my_name, "wavs_folder", $data_dir & "\alerts")
    local $open_file = FileOpenDialog("Load a WAV file for looping..", $wavs_folder, "WAV Files (*.wav)", 1, "*.wav", $LoopZGUI)
    if GetExtension($open_file) = "wav" then
        AddStringToCombo($combo_wav_file, $open_file, "wav_file")
        BuildCombo($combo_wav_file, "wav_file")
        ControlCommand($LoopZGUI, "", $combo_wav_file, "selectString", $open_file)
        IniWrite($ini_path, $my_name, "wavs_folder", GetParent($open_file))
    endif
endfunc
func OpenWAVfolder()
    local $current = GUICtrlRead($combo_wav_file)
    local $load_folder = IniRead($ini_path, $my_name, "load_folder", $data_dir & "\alerts")
    local $open_folder = FileselectFolder("Load a folder of WAV files into the combo..", _
                                        "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 2, $load_folder, $LoopZGUI)
    local $nosubs = false
    if ce_IsPressed(10) then $nosubs = true
    if IsDir($open_folder) then
        ImportWAVFolder($open_folder, $nosubs)
        IniWrite($ini_path, $my_name, "load_folder", $open_folder)
    endif
    if $current then
        ControlCommand($LoopZGUI, "", $combo_wav_file, "selectString", $current)
    endif
endfunc
func ImportWAVFolder($dir, $do_recurse = true)
    SetInfoTitle("scanning for wav files in: " & BaseName($dir))
    local $list_o_wavs = RecurseDir($dir, "*.wav", $do_recurse)
    if IsArray($list_o_wavs) then
        for $i = 1 to $list_o_wavs[0]
            if $list_o_wavs[$i] <> "" then AddStringToCombo($combo_wav_file, $list_o_wavs[$i], "wav_file", false)
        next
        BuildCombo($combo_wav_file, "wav_file")
        ControlCommand($LoopZGUI, "", $combo_wav_file, "selectString", $list_o_wavs[1])
    endif
endfunc
func OpenCurrentWAVParent()
    if not GUICtrlRead($combo_wav_file) then ControlCommand($LoopZGUI, "", $combo_wav_file, "SetCurrentselection", 0)
    if not GUICtrlRead($combo_wav_file) then OpenWAV()
    if not GUICtrlRead($combo_wav_file) then
        SetInfoTitle(" No WAV File  =  NO WAV FOLDER! ", $info_time)
        return false
    endif
    local $parent = GetParent(GUICtrlRead($combo_wav_file))
    if not FileExists($parent) then
        OpenWAVfolder()
        return
    endif
    ShellExecute("Explorer.exe", '"' & $parent & '"')
endfunc
func IsWritable($test_path)
    local $test = IniWrite($test_path, $my_name, "write_test", 1)
    IniDelete($test_path, $my_name, "write_test")
    return $test
endfunc
func UpdateINI()
    local $old_version = IniRead($ini_path, $my_name, "version", 0)
    local $vcomp = _versioncompare($my_version, $old_version)
    switch $vcomp
        case 0, -1
            return false
    endswitch
    local $tmp_ini = @TempDir & "\" & $ini_file & ".new"
    FileInstall("Resources\LoopDropZ.ini", $tmp_ini, 1)
    local $existing_sections = IniReadSectionNames($tmp_ini)
    if IsArray($existing_sections) then
        for $a = 1 to $existing_sections[0]
            if $existing_sections[$a] <> $my_name then
                IniDelete($tmp_ini, $existing_sections[$a])
            endif
        next
    endif
    $existing_sections = IniReadSectionNames($ini_path)
    if IsArray($existing_sections) then
        for $a = 1 to $existing_sections[0]
            local $section = IniReadSection($ini_path, $existing_sections[$a])
            if IsArray($section) then
                for $b = 1 to $section[0][0]
                    if StringLeft($section[$b][0], 1) <> " then
                        IniWrite($tmp_ini, $existing_sections[$a], $section[$b][0], $section[$b][1])
                    endif
                next
            endif
        next
    endif
    FileMove($ini_path, GetParent($ini_path) & "\[" & FileDateStamp() & "] " & $ini_file & ".ini")
    FileMove($tmp_ini, $ini_path, 1)
    IniWrite($ini_path, $my_name, "version", $my_version)
endfunc
func __________________BYE_NOW()
endfunc
func EventDoAboutBox()
    DoAboutBox($LoopZGUI)
endfunc
func DoAboutBox($my_gui)
    local $a_x = -1
    local $a_y = -1
    local $a_shunt = 0
    local $d_height = 105
    local $d_width = 260
    local $txt_l = 80
    if WinVisible($my_gui) then
        local $n_size_array = WinGetPos($my_gui)
        if IsArray($n_size_array) then
            $a_x = $n_size_array[0] + ($n_size_array[2] / 2) - ($d_width / 2)
            $a_y = $n_size_array[1] + ($n_size_array[3] / 2) - ($d_height)
        endif
        AboutBoxOpen($my_gui)
    endif
    local $last_event_mode = AutoItSetOption("GUIOnEventMode", 0)
    local $last_coord_mode = AutoItSetOption("GUICoordMode", 1)
    $gui_about = GUICreate(" About " & $my_name & "..", $d_width, $d_height + $a_shunt, $a_x, $a_y, Default, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUISetBkColor(16777215)
    local $x1 = GUICtrlCreateLabel($my_name & " v" & $my_version & $MSG_LF & "from corz.org", $txt_l, 8)
    FileInstall("Resources\About.gif", @TempDir & "\", 1)
    local $pic
    if FileExists(@TempDir & "\About.gif") then
        $pic = GUICtrlCreatePic(@TempDir & "\About.gif", 6, 9, 64, 64)
    else
        $pic = GUICtrlCreateIcon($me_app, 0, 6, 9, 64, 64)
    endif
    local $x2 = GUICtrlCreateLabel("Do you want to visit the " & $my_name & $MSG_LF & "web page at this time?", $txt_l, $a_shunt + 40)
    local $gui_about_no = GUICtrlCreateButton("No, not right now", 10, $a_shunt + 80, 95, 22)
    GUICtrlSetTip(-1, " The other button is the one you want to click! ")
    local $gui_about_ok = GUICtrlCreateButton("Yes, let's do it!", $d_width - 104, $a_shunt + 80, 95, 22)
    GUICtrlSetTip(-1, " The link will open in your system default browser ")
    local $vbit = "x86"
    if @AutoItX64 = 1 then $vbit = "x64"
    local $lab_v = GUICtrlCreateLabel($vbit, $d_width - 19, 1, 18, 12)
    GUICtrlSetFont(-1, 8, 200, 0, "Lucida Console")
    FileInstall("Resources\About.wav", @TempDir & "\LoopDropZ-loopdigga-about.wav", 1)
    if FileExists(@TempDir & "\LoopDropZ-loopdigga-about.wav") then
        SoundPlay(@TempDir & "\LoopDropZ-loopdigga-about.wav", 0)
    endif
    GUISetState()
    local $count = 1
    local $my_action
    while 1
        $count += 1
        if Mod($count, 25) = 0 then
            GUICtrlSetColor($lab_v, 4473924)
        endif
        if Mod($count, 50) = 0 then
            GUICtrlSetColor($lab_v, 0)
        endif
        local $msg = GUIGetMsg()
        Sleep(33)
        switch $msg
            case $gui_event_close, $gui_about_no
                exitloop
            case $gui_about_ok
                $my_action = "url"
                exitloop
            case $pic
                if ce_IsPressed(10) or not $proud_wearer then
                    $my_action = "inp"
                else
                    $my_action = "url"
                endif
                exitloop
            case $x1, $x2
                VisitURL($my_url)
            case $lab_v
                $my_action = "sysi"
                exitloop
        endswitch
    wend
    GUIDelete($gui_about)
    AutoItSetOption("GUICoordMode", $last_coord_mode)
    AutoItSetOption("GUIOnEventMode", $last_event_mode)
    switch $my_action
        case "url"
            VisitURL($my_url)
        case "sysi"
            SysInfoBox()
    endswitch
    if WinVisible($my_gui) then AboutBoxClose($my_gui)
endfunc
func AboutBoxOpen($my_gui)
    GUISetState(@SW_DISABLE, $my_gui)
    TraySetState(2)
endfunc
func AboutBoxClose($my_gui)
    TraySetState(1)
    GUISetState(@SW_ENABLE, $my_gui)
    WinActivate($my_gui)
    guiswitch($my_gui)
endfunc
func GetLogLocation($this_preset=$my_name)
    local $i = DeTokenizeString(IniRead($ini_path, $this_preset, "log_location", $log_location))
    if $i <> "-" then
        if $portable then
            if $i and TestFileWrite($i) then
                $log_location = $i
            else
                if TestFileWrite(@ScriptDir & "\" & $my_name & ".log") then
                    $log_location = @ScriptDir & "\" & $my_name & ".log"
                endif
            endif
        elseif IsDir($i) and TestFileWrite($i & "\" & $my_name & ".log") then
            $log_location = $i & "\" & $my_name & ".log"
        elseif $i and TestFileWrite($i) then
            $log_location = $i
        else
            $log_location = @TempDir & "\" & $my_name & ".log"
        endif
    endif
    debug("$log_location set to: " & $log_location, @ScriptLineNumber, 7)
endfunc
func TrayQuit()
    DoQuit()
endfunc
func MenuDoQuit()
    DoQuit()
endfunc
func DoQuit($x=0)
    IniWriteCheckboxValue($ini_path, $my_name, "state", $state)
    IniWrite($ini_path, $my_name, "wav_volume", $wav_volume)
    DllCall("winmm.dll", "int", "PlaySoundA", "int", 0, "int", 0, "int", $snd_purge)
    if not $preview then
        SetComboToCurrent($combo_wav_file, "wav_file")
        SaveXYPrefs()
    endif
    
    FileDelete(@TempDir & "\About.gif")
    VersionCheckOnline($my_name, $versioncheck_url, $download_url, $ini_path, $my_name, $my_version)
    GUIDelete($LoopZGUI)
    exit $x
endfunc
; 
;
;
B:\Archive\Entrainment\[Presets]\Brainwave Generator\chant.wav"  "B:\Archive\Entrainment\[Presets]\Brainwave Generator\primal7.wav" "B:\Archive\Entrainment\[Presets]\Brainwave Generator\metadrop.wav"
layer "B:\Archive\Entrainment\[Presets]\Brainwave Generator\chant.wav"  "B:\Archive\Entrainment\[Presets]\Brainwave Generator\primal7.wav" "B:\Archive\Entrainment\[Presets]\Brainwave Generator\metadrop.wav"
p "B:\Archive\Entrainment\[Presets]\Brainwave Generator\chant.wav"
p "B:\Archive\Entrainment\[Presets]\Brainwave Generator\metadrop.wav"
"