Synapsee

AutoIt Radio Player v0.0.0.8 Update of 30 apr 2016

25 posts in this topic

#1 ·  Posted (edited)

AutoIt Radio Player
Last : v0.0.0.8
Tested only on W7X64

Screenshot.jpg.6f20062c096ab558c90d37d66

Changelog :

Spoiler

v0.0.0.8 - last version

v0.0.0.7 - first public version

==========>  AutoIt Radio Player v0.0.0.8.zip <==========

Personal Message :

     This is my first script posted. Any comment are welcome. Give me your best web radio i will try add them !

Install/Use :

Spoiler

-Unzip
-Run "AutoIt Radio Player.au3"
-Use MouseWheel for change volume
          Note : On first start : volume = 4%
-Use MouseLeft for drag gui
-Use RightClick for change station

Add a station :

Spoiler

How add a station :

-Go to config.ini

-Add : [Station Name]

-Possible optional label start key :
CurrentArtist
CurrentAlbum
CurrentTitle
NextArtist
NextAlbum
NextTitle
ListenersCount

-Possible optional label end key :
Link=URL
Start=StringBefore
End=StringAfter
BetweenNum=TargetOccurence (def=0)
Split=StringForSplit
NumSplit=TargetSplitNumber

-Necessary
SoundLink=URL

-Optional
CoverLink=URL
CoverLinkStart=StringBefore
CoverLinkEnd=StringAfter
CoverLinkBetweenNum=TargetOccurence (def=0)
CoverLinkBefore=PathBefore

Unsolved problem :

      When the coverGUI go outside the monitor and comeback inside, a part of current cover disapear : I have no idea how fix that
    
TODO :

     Make coverGUI mouse resizable (while script running) : any idea are welcome
     Crop some pixel of cover : any idea are welcome

Related Posts/Bin :

Main Code :

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7;All Warning
;-w 5 = local var declared but not used : Removed for Curl.au3
;-d = as Opt("MustDeclareVars", 1) : Removed for Bass.au3
#AutoIt3Wrapper_Au3Check_Parameters=-w 1 -w 2 -w 3 -w- 4 -w 6 -w- 7

#Region ;==> #include

    #include <Array.au3>;_ArrayAdd
    #include <GuiButton.au3>;_GUICtrlButton_SetImage()
    #include <GuiMenu.au3>;$MNS_MODELESS
    #include <GUIConstants.au3>;$WS_POPUP
    #include <GDIplus.au3>;_GDIPlus_BitmapCreateFromStream()
    #include <Memory.au3>;$GMEM_MOVEABLE
    #include <String.au3>;_StringBetween()

    #include <AutoIt Radio Player\include\Bass.au3>;_BASS_ChannelPlay()
    #include <AutoIt Radio Player\include\BassConstants.au3>;$BASS_CONFIG_NET_PLAYLIST
    #include <AutoIt Radio Player\include\Curl.au3>;Curl_Data_Get()

#EndRegion ;==> #include

#Region ;==> Func for Bass.au3

Local $MusicHandle

Func _Audio_play($MusicHandle)
    _BASS_ChannelPlay($MusicHandle, 1)
EndFunc

Func _Audio_stop($MusicHandle)
    _BASS_ChannelStop($MusicHandle)
EndFunc

Func _Audio_init_stop($MusicHandle)
    _BASS_StreamFree($MusicHandle)
    _BASS_Free()
EndFunc

Func _Audio_init_start()
    If _BASS_STARTUP(@ScriptDir & "\AutoIt Radio Player\include\bass.dll") Then
        If _BASS_Init(0, -1, 44100, 0) Then
            If _BASS_SetConfig($BASS_CONFIG_NET_PLAYLIST, 1) = 0 Then
                SetError(3)
            EndIf
        Else
            SetError(2)
        EndIf
    Else
        SetError(@error)
    EndIf
EndFunc

Func _Set_volume($volume)
    _BASS_SetConfig($BASS_CONFIG_GVOL_STREAM, $volume * 100)
EndFunc

Func _Set_url($file)
    If FileExists($file) Then
        $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0)
    Else
        $MusicHandle = _BASS_StreamCreateURL($file, 0, 1)
    EndIf
    If @error Then
        Return SetError(1)
    EndIf
    Return $MusicHandle
EndFunc

#EndRegion ;==> Func for Bass.au3

Global Const $SC_DRAGMOVE = 0xF012;Global

#Region ;==> Func from AutoIt Forum

; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayMultiColSort
; Description ...: Sort 2D arrays on several columns
; Syntax.........: _ArrayMultiColSort(ByRef $aArray, $aSortData[, $iStart = 0[, $iEnd = 0]])
; Parameters ....: $aArray    - The 2D array to be sorted
;                  $aSortData - 2D array holding details of the sort format
;                               Format: [Column to be sorted, Sort order]
;                                   Sort order can be either numeric (0/1 = ascending/descending) or a ordered string of items
;                                   Any elements not matched in string are left unsorted after all sorted elements
;                  $iStart    - Element of array at which sort starts (default = 0)
;                  $iEnd      - Element of array at which sort endd (default = 0 - converted to end of array)
; Requirement(s).: v3.3.8.1 or higher
; Return values .: Success: No error
;                  Failure: @error set as follows
;                            @error = 1 with @extended set as follows (all refer to $sIn_Date):
;                                1 = Array to be sorted not 2D
;                                2 = Sort data array not 2D
;                                3 = More data rows in $aSortData than columns in $aArray
;                                4 = Start beyond end of array
;                                5 = Start beyond End
;                            @error = 2 with @extended set as follows:
;                                1 = Invalid string parameter in $aSortData
;                                2 = Invalid sort direction parameter in $aSortData
; Author ........: Melba23
; Remarks .......: Columns can be sorted in any order
; Example .......; Yes
; ===============================================================================================================================
Func _ArrayMultiColSort(ByRef $aArray, $aSortData, $iStart = 0, $iEnd = 0)

    ; Errorchecking
    ; 2D array to be sorted
    If UBound($aArray, 2) = 0 Then
        Return SetError(1, 1, "")
    EndIf
    ; 2D sort data
    If UBound($aSortData, 2) <> 2 Then
        Return SetError(1, 2, "")
    EndIf
    If UBound($aSortData) > UBound($aArray) Then
        Return SetError(1, 3)
    EndIf
    ; Start element
    If $iStart < 0 Then
        $iStart = 0
    EndIf
    If $iStart >= UBound($aArray) - 1 Then
        Return SetError(1, 4, "")
    EndIf
    ; End element
    If $iEnd <= 0 Or $iEnd >= UBound($aArray) - 1 Then
        $iEnd = UBound($aArray) - 1
    EndIf
    ; Sanity check
    If $iEnd <= $iStart Then
        Return SetError(1, 5, "")
    EndIf

    Local $iCurrCol, $iChunk_Start, $iMatchCol

    ; Sort first column
    __AMCS_SortChunk($aArray, $aSortData, 0, $aSortData[0][0], $iStart, $iEnd)
    If @error Then
        Return SetError(2, @extended, "")
    EndIf
    ; Now sort within other columns
    For $iSortData_Row = 1 To UBound($aSortData) - 1
        ; Determine column to sort
        $iCurrCol = $aSortData[$iSortData_Row][0]
        ; Create arrays to hold data from previous columns
        Local $aBaseValue[$iSortData_Row]
        ; Set base values
        For $i = 0 To $iSortData_Row - 1
            $aBaseValue[$i] = $aArray[$iStart][$aSortData[$i][0]]
        Next
        ; Set start of this chunk
        $iChunk_Start = $iStart
        ; Now work down through array
        For $iRow = $iStart + 1 To $iEnd
            ; Match each column
            For $k = 0 To $iSortData_Row - 1
                $iMatchCol = $aSortData[$k][0]
                ; See if value in each has changed
                If $aArray[$iRow][$iMatchCol] <> $aBaseValue[$k] Then
                    ; If so and row has advanced
                    If $iChunk_Start < $iRow - 1 Then
                        ; Sort this chunk
                        __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1)
                        If @error Then
                            Return SetError(2, @extended, "")
                        EndIf
                    EndIf
                    ; Set new base value
                    $aBaseValue[$k] = $aArray[$iRow][$iMatchCol]
                    ; Set new chunk start
                    $iChunk_Start = $iRow
                EndIf
            Next
        Next
        ; Sort final section
        If $iChunk_Start < $iRow - 1 Then
            __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1)
            If @error Then
                Return SetError(2, @extended, "")
            EndIf
        EndIf
    Next

EndFunc   ;==>_ArrayMultiColSort

; #FUNCTION# ====================================================================================================================
; Name...........: __AMCS_SortChunk
; Description ...: Sorts array section
; Author ........: Melba23
; Remarks .......:
; ===============================================================================================================================
Func __AMCS_SortChunk(ByRef $aArray, $aSortData, $iRow, $iColumn, $iChunkStart, $iChunkEnd)

    Local $aSortOrder

    ; Set default sort direction
    Local $iSortDirn = 1
    ; Need to prefix elements?
    If IsString($aSortData[$iRow][1]) Then
        ; Split elements
        $aSortOrder = StringSplit($aSortData[$iRow][1], ",")
        If @error Then
            Return SetError(1, 1, "")
        EndIf
        ; Add prefix to each element
        For $i = $iChunkStart To $iChunkEnd
            For $j = 1 To $aSortOrder[0]
                If $aArray[$i][$iColumn] = $aSortOrder[$j] Then
                    $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn]
                    ExitLoop
                EndIf
            Next
            ; Deal with anything that does not match
            If $j > $aSortOrder[0] Then
                $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn]
            EndIf
        Next
    Else
        Switch $aSortData[$iRow][1]
            Case 0, 1
                ; Set required sort direction if no list
                If $aSortData[$iRow][1] Then
                    $iSortDirn = -1
                Else
                    $iSortDirn = 1
                EndIf
            Case Else
                Return SetError(1, 2, "")
        EndSwitch
    EndIf

    ; Sort the chunk
    Local $iSubMax = UBound($aArray, 2) - 1
    __ArrayQuickSort2D($aArray, $iSortDirn, $iChunkStart, $iChunkEnd, $iColumn, $iSubMax)

    ; Remove any prefixes
    If IsString($aSortData[$iRow][1]) Then
        For $i = $iChunkStart To $iChunkEnd
            $aArray[$i][$iColumn] = StringTrimLeft($aArray[$i][$iColumn], 3)
        Next
    EndIf

EndFunc   ;==>__AMCS_SortChunk

Func _ReduceMemory()
    Local $aReturn = DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
    If @error = 1 Then
        Return SetError(1, 0, 0)
    EndIf
    Return $aReturn[0]
EndFunc   ;==>_ReduceMemory

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlus_ImageLoadFromHGlobal
; Description ...: Creates an Image object based on movable HGlobal memory block
; Syntax.........: _GDIPlus_ImageLoadFromHGlobal($hGlobal)
; Parameters ....: $hGlobal - Handle of a movable HGlobal memory block
; Return values .: Success    - Pointer to a new Image object
;                 Failure     - 0 and either:
;                 |@error and @extended are set if DllCall failed:
;                 | -@error = 1 if could not create IStream
;                 | -@error = 2 if DLLCall to create image failed
;                 |$GDIP_STATUS contains a non zero value specifying the error code
; Author ........: ProgAndy
; Modified.......:
; Remarks .......: After you are done with the object, call _GDIPlus_ImageDispose to release the object resources.
;                 The HGLOBAL will be owned by the image and freed automatically when the image is disposed.
; Related .......: _GDIPlus_ImageLoadFromStream, _GDIPlus_ImageDispose
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _GDIPlus_ImageLoadFromHGlobal($hGlobal)
    Local $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $hGlobal, "bool", True, "ptr*", 0)
    If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(1, @error, 0)
    Local $hImage = DllCall($__g_hGDIPDll, "uint", "GdipLoadImageFromStream", "ptr", $aResult[3], "int*", 0)
    Local $error = @error
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    Local $aCall = DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
    If $error Then Return SetError(2, $error, 0)
    If $hImage[2] = 0 Then Return SetError(3, 0, $hImage[2])
    Return $hImage[2]
EndFunc   ;==>_GDIPlus_ImageLoadFromHGlobal

; #FUNCTION# ====================================================================================================================
; Name...........: _MemGlobalAllocFromBinary
; Description ...: Greates a movable HGLOBAL memory block from binary data
; Syntax.........: _MemGlobalAllocFromBinary($bBinary)
; Parameters ....: $bBinary - Binary data
; Return values .: Success    - Handle of a new movable HGLOBAL
;                 Failure     - 0 and set @error:
;                 |1  - no data
;                 |2  - could not allocate memory
;                 |3  - could not set data to memory
; Author ........: ProgAndy
; Modified.......:
; Remarks .......:
; Related .......: _MemGlobalAlloc, _MemGlobalFree, _MemGlobalLock
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _MemGlobalAllocFromBinary(Const $bBinary)
    Local $iLen = BinaryLen($bBinary)
    If $iLen = 0 Then Return SetError(1, 0, 0)
    Local $hMem = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
    If @error Or Not $hMem Then Return SetError(2, 0, 0)
    DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
    If @error Then
        _MemGlobalUnlock($hMem)
        _MemGlobalFree($hMem)
        Return SetError(3, 0, 0)
    EndIf
    _MemGlobalUnlock($hMem)
    Return $hMem
EndFunc   ;==>_MemGlobalAllocFromBinary

#EndRegion ;==> Func from AutoIt Forum

;INI Location
Local $Config_INI = "AutoIt Radio Player\Config.ini"
Local $Save_INI = "AutoIt Radio Player\Save.ini"

;Get $aRadio and $aLabel <===========================================That part need improve
Local $aINISections = IniReadSectionNames($Config_INI)
Local $aRadio[0][8]
Local $aLabel[0][11]
For $i = 1 To UBound($aINISections) - 1
    If $aINISections[$i] <> "GUI" Then

        ;For $aRadio
        Local $SoundLink = "", $CoverLink = "", $CoverLinkStart = "", $CoverLinkEnd = "", $CoverLinkBetweenNum = "", $CoverLinkBefore = "", $Default = 0

        ;For $aLabel
        Local $CurrentArtistLink = "", $CurrentArtistStart = "", $CurrentArtistEnd = "", $CurrentArtistBetweenNum = 0, $CurrentArtistSplit = "", $CurrentArtistNumSplit = ""
        Local $CurrentAlbumLink = "", $CurrentAlbumStart = "", $CurrentAlbumEnd = "", $CurrentAlbumBetweenNum = 0, $CurrentAlbumSplit = "", $CurrentAlbumNumSplit = ""
        Local $CurrentTitleLink = "", $CurrentTitleStart = "", $CurrentTitleEnd = "", $CurrentTitleBetweenNum = 0, $CurrentTitleSplit = "", $CurrentTitleNumSplit = ""
        Local $NextArtistLink = "", $NextArtistStart = "", $NextArtistEnd = "", $NextArtistBetweenNum = 0, $NextArtistSplit = "", $NextArtistNumSplit = ""
        Local $NextAlbumLink = "", $NextAlbumStart = "", $NextAlbumEnd = "", $NextAlbumBetweenNum = 0, $NextAlbumSplit = "", $NextAlbumNumSplit = ""
        Local $NextTitleLink = "", $NextTitleStart = "", $NextTitleEnd = "", $NextTitleBetweenNum = 0, $NextTitleSplit = "", $NextTitleNumSplit = ""
        Local $ListenersCountLink = "", $ListenersCountStart = "", $ListenersCountEnd = "", $ListenersCountBetweenNum = 0, $ListenersCountSplit = "", $ListenersCountNumSplit = ""
        Local $controlID1 = "", $controlID2 = ""

        Local $Sec = IniReadSection($Config_INI, $aINISections[$i])
        For $y = 1 To UBound($Sec) - 1
            Assign($Sec[$y][0], $Sec[$y][1])
        Next

        ;$aRadio
        _ArrayAdd($aRadio, $aINISections[$i] & "|" & $SoundLink & "|" & $CoverLink & "|" & $CoverLinkStart & "|" & $CoverLinkEnd & "|" & $CoverLinkBetweenNum & "|" & $CoverLinkBefore & "|" & $Default)

        ;$aLabel
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Artist" & "|" & $CurrentArtistLink & "|" & $CurrentArtistStart & "|" & $CurrentArtistEnd & "|" & $CurrentArtistBetweenNum & "|" & $CurrentArtistSplit & "|" & $CurrentArtistNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Album" & "|" & $CurrentAlbumLink & "|" & $CurrentAlbumStart & "|" & $CurrentAlbumEnd & "|" & $CurrentAlbumBetweenNum & "|" & $CurrentAlbumSplit & "|" & $CurrentAlbumNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Title" & "|" & $CurrentTitleLink & "|" & $CurrentTitleStart & "|" & $CurrentTitleEnd & "|" & $CurrentTitleBetweenNum & "|" & $CurrentTitleSplit & "|" & $CurrentTitleNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Artist" & "|" & $NextArtistLink & "|" & $NextArtistStart & "|" & $NextArtistEnd & "|" & $NextArtistBetweenNum & "|" & $NextArtistSplit & "|" & $NextArtistNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Album" & "|" & $NextAlbumLink & "|" & $NextAlbumStart & "|" & $NextAlbumEnd & "|" & $NextAlbumBetweenNum & "|" & $NextAlbumSplit & "|" & $NextAlbumNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Title" & "|" & $NextTitleLink & "|" & $NextTitleStart & "|" & $NextTitleEnd & "|" & $NextTitleBetweenNum & "|" & $NextTitleSplit & "|" & $NextTitleNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Listeners" & "|" & "Count" & "|" & $ListenersCountLink & "|" & $ListenersCountStart & "|" & $ListenersCountEnd & "|" & $ListenersCountBetweenNum & "|" & $ListenersCountSplit & "|" & $ListenersCountNumSplit & "|" & $controlID1 & "|" & $controlID2)

    EndIf
Next
Global $aRadio_Sort[][] = [[0, 0], [1, 0]]
_ArrayMultiColSort($aRadio, $aRadio_Sort)
Local $aLabel2[0][11]
For $i = 0 To UBound($aLabel) - 1
    If $aLabel[$i][3] <> "" Then
        Local $fill = $aLabel[$i][0]
        For $y = 1 To UBound($aLabel, 2) - 1
            $fill = $fill & "|" & $aLabel[$i][$y]
        Next
        _ArrayAdd($aLabel2, $fill)
    EndIf
Next
$aLabel = $aLabel2
;_ArrayDisplay($aRadio)
;_ArrayDisplay($aLabel)

;Init/Opt
Opt("GUIOnEventMode", 1)
_Audio_init_start()
_GDIPlus_Startup()

;Icon
Local $IcoFile = @ScriptDir & "\AutoIt Radio Player\img\icon.ico"
Local $IcoNumber = -1
TraySetIcon($IcoFile, $IcoNumber)

;Get Default Station
Local $def_selected = 0
For $r = 0 To UBound($aRadio) - 1
    If $aRadio[$r][0] = IniRead($Save_INI, @ComputerName, "Default_Radio", "default") Then
        $def_selected = 1
        $aRadio[$r][7] = 1
    EndIf
Next
If $def_selected = 0 Then
    $aRadio[0][7] = 1
EndIf

;ConsoleWrite("Start" & @CRLF)

;Get $Radio_Name, $Radio_SoundLink, $Radio_CoverLink, $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
Local  $Radio_Name, $Radio_SoundLink, $Radio_CoverLink
Local  $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
For $r = 0 To UBound($aRadio) - 1
    If $aRadio[$r][7] = 1 Then
        $Radio_Name = $aRadio[$r][0]
        $Radio_SoundLink = $aRadio[$r][1]
        $Radio_CoverLink = $aRadio[$r][2]
        $Radio_CoverLink_Start = $aRadio[$r][3]
        $Radio_CoverLink_End = $aRadio[$r][4]
        $Radio_CoverLink_BetweenNum = $aRadio[$r][5]
        $Radio_CoverLink_Before = $aRadio[$r][6]
    EndIf
Next

;Declare
Local $PlayerGUI, $CoverGUI;GUI
Local $PlayPause, $Close;Button
Local $Play = 1;PlayStatus ($Play = 1 = Autoplay)
Local $Volume_Label, $VolumePercent, $Previous_VolumePercent;Volume
Local $Previous_Cover_Read;PreviousRead
Local $BASS_ErrorGetCode

;$Config_INI\GUI
Local $CoverSize = IniRead($Config_INI, "GUI", "CoverSize", 150)
Local $PlayerBorder = IniRead($Config_INI, "GUI", "PlayerBorder", 10)

;ConsoleWrite("Build GUI" & @CRLF)

;Build GUI
_Build_PlayerGUI()
_Build_CoverGUI()

;ConsoleWrite("Show GUI" & @CRLF)

GUISetState(@SW_SHOW, $PlayerGUI)
If $Radio_CoverLink <> "" Then
    GUISetState(@SW_SHOW, $CoverGUI)
EndIf

_Set_volume(0)

;GetPlayerDATA() - GetCoverDATA() - Start Sound
GetPlayerDATA();Start Sound too with resume on disconnect
AdlibRegister("GetPlayerDATA", 8000)
If $Radio_CoverLink <> "" Then
    GetCoverDATA()
    AdlibRegister("GetCoverDATA", 8000)
EndIf

;ConsoleWrite("GUIRegisterMsg" & @CRLF)
GUIRegisterMsg($WM_MOUSEWHEEL, "_WM_MOUSEWHEEL");for set volume
GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN");for drag gui

#Region ;==> Internal Func

Func _Build_CoverGUI()

    ;ConsoleWrite("Build CoverGUI" & @CRLF)

    If $Radio_CoverLink <> "" Then
        $CoverGUI = GUICreate("AutoIt Radio Cover", _;Title
                $CoverSize, _ ;X
                $CoverSize, _ ;Y
                IniRead($Save_INI, @ComputerName, "Cover_X", -1), _;Left
                IniRead($Save_INI, @ComputerName, "Cover_Y", -1), _;Top
                $WS_POPUP, $WS_EX_TOPMOST);Style
        GUISetBkColor(0x000000, $CoverGUI);Black BkColor
        GUISetIcon($IcoFile, $IcoNumber, $CoverGUI)
    Else
        $CoverGUI = ""
    EndIf

EndFunc ;==>_Build_CoverGUI

Func _Build_PlayerGUI()

    ;ConsoleWrite("Build PlayerGUI" & @CRLF)

    ;Clean previous stored ControlID
    For $r = 0 To UBound($aLabel) - 1
        $aLabel[$r][9] = ""
        $aLabel[$r][10] = ""
    Next

    ;$LabelCount
    Local $LabelCount = 0
    For $r = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$r][0] Then
            $LabelCount = $LabelCount + 1
        EndIf
    Next

    ;$LabelY
    If $LabelCount * 13 + $PlayerBorder * 2 < 50 Then
        Local $LabelY = 10 * 3
    Else
        $LabelY = $LabelCount * 13
    EndIf

    ;$PlayerGUI
    $PlayerGUI = GUICreate("AutoIt Radio Player", _
            $PlayerBorder + 260 + 50 + 10 + $PlayerBorder * 2, _;X
            $PlayerBorder + $LabelY + $PlayerBorder, _;Y
            IniRead($Save_INI, @ComputerName, "Title_X", -1), _;Left
            IniRead($Save_INI, @ComputerName, "Title_Y", -1), _;Top
            $WS_POPUP, $WS_EX_TOPMOST);Style
    GUISetBkColor(0x000000, $PlayerGUI);Black BkColor
    GUISetIcon($IcoFile, $IcoNumber, $PlayerGUI)

    ;$Contextmenu
    Local $ContextMenu = GUICtrlCreateContextMenu(-1)
    Local $hCM = GUICtrlGetHandle($ContextMenu)
    _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
    Local $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
    GUICtrlSetOnEvent($ContextMenu_Item1, "ContextMenu_ChangeRadio")
    GUICtrlCreateMenuItem("", $ContextMenu);Add separator
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 0 Then
            GUICtrlCreateMenuItem($aRadio[$r][0], $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
        EndIf
    Next

    ;GUICtrlCreateLabel
    $LabelCount = 0
    Local $Previous_Type = ""
    For $r = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$r][0] Then
            If $Previous_Type <> $aLabel[$r][1] Then
                $Previous_Type = $aLabel[$r][1]
                $aLabel[$r][10] = GUICtrlCreateLabel($aLabel[$r][1], $PlayerBorder, 13 * $LabelCount + $PlayerBorder, 50, 13, $SS_CENTERIMAGE)
                GUICtrlSetColor($aLabel[$r][10], 0xFFFFFF);White TextColor
                GUICtrlSetOnEvent($aLabel[$r][10], "_WM_LBUTTONDOWN")
                $ContextMenu = GUICtrlCreateContextMenu($aLabel[$r][10])
                $hCM = GUICtrlGetHandle($ContextMenu)
                _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
                $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
                GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                GUICtrlCreateMenuItem("", $ContextMenu);Add separator
                For $r2 = 0 To UBound($aRadio) - 1
                    If $aRadio[$r2][7] = 0 Then
                        GUICtrlCreateMenuItem($aRadio[$r2][0], $ContextMenu)
                        GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                    EndIf
                Next
            EndIf
            $aLabel[$r][9] = GUICtrlCreateLabel("", $PlayerBorder + 50, 13 * $LabelCount + $PlayerBorder, 260, 13, $SS_CENTERIMAGE)
            $LabelCount = $LabelCount + 1
            GUICtrlSetColor($aLabel[$r][9], 0xFFFFFF);White TextColor
            GUICtrlSetOnEvent($aLabel[$r][9], "_WM_LBUTTONDOWN")
            $ContextMenu = GUICtrlCreateContextMenu($aLabel[$r][9])
            $hCM = GUICtrlGetHandle($ContextMenu)
            _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
            $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
            GUICtrlCreateMenuItem("", $ContextMenu);Add separator
            For $r2 = 0 To UBound($aRadio) - 1
                If $aRadio[$r2][7] = 0 Then
                    GUICtrlCreateMenuItem($aRadio[$r2][0], $ContextMenu)
                    GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                EndIf
            Next
        EndIf
    Next

    ;GUICtrlCreateLabel Volume
    $Volume_Label = GUICtrlCreateLabel("0", $PlayerBorder, $PlayerBorder, 260 + 50, $LabelY, "")
    GUICtrlSetColor($Volume_Label, 0xFFFFFF);White TextColor
    GUICtrlSetOnEvent($Volume_Label, "_WM_LBUTTONDOWN")
    GUICtrlSetState($Volume_Label, $GUI_HIDE)

    ;$Volume_Label Contextmenu
    $ContextMenu = GUICtrlCreateContextMenu($Volume_Label)
    $hCM = GUICtrlGetHandle($ContextMenu)
    _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
    $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
    GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
    GUICtrlCreateMenuItem("", $ContextMenu);Add separator
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 0 Then
            Local $Item = GUICtrlCreateMenuItem($aRadio[$r][0], $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
        EndIf
    Next

    ;$Close
    $Close = GUICtrlCreateButton("Close", _
            $PlayerBorder * 2 + 260 + 50, _;Left
            $PlayerBorder, _;Top
            10, _;X
            10, _;Y
            $BS_BITMAP);Style
    _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Close.bmp")
    GUICtrlSetOnEvent($Close, "_Close")
    GUICtrlSetOnEvent($GUI_EVENT_CLOSE, "_Close")

    ;$PlayPause
    $PlayPause = GUICtrlCreateButton("Play/Pause", _
            $PlayerBorder * 2 + 260 + 50, _;Left
            $PlayerBorder + 10 + 10, _;Top
            10, _;X
            10, _;Y
            $BS_BITMAP);Style
    _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\Stop.bmp")
    GUICtrlSetOnEvent($PlayPause, "_PlayPause")

EndFunc ;==>_Build_PlayerGUI

Func _Close()
    _Audio_init_stop($MusicHandle)
    _GDIPlus_Shutdown()
    Exit
EndFunc ;==>_Close

Func _PlayPause()

    ;Change $Play
    If $Play = 1 Then
        $Play = 0
    Else
        $Play = 1
    EndIf

    Local $Msg = GUIGetCursorInfo($PlayerGUI)

    ;Change Button Image
    If $Play = 1 Then
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopp.bmp");Mouse Pressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopo.bmp");Mouse Over
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stop.bmp");Nothing
        EndIf
    Else
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playp.bmp");Mouse Pressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playo.bmp");Mouse Over
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\play.bmp");Nothing
        EndIf
    EndIf

    ;Play Sound
    If $Play = 0 Then
        _Audio_stop($MusicHandle)
    Else
        $MusicHandle = _Set_url($Radio_SoundLink)
        _Audio_play($MusicHandle)
    EndIf

EndFunc ;==>_PlayPause

Func _RemoveVolumeLabel()

    AdlibUnRegister("_RemoveVolumeLabel")

    ;Show Others Label
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            GUICtrlSetState($aLabel[$i][9], $GUI_SHOW)
        EndIf
    Next
    Local $Previous_Type = ""
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            If $Previous_Type <> $aLabel[$i][1] Then
                $Previous_Type = $aLabel[$i][1]
                GUICtrlSetState($aLabel[$i][10], $GUI_SHOW)
            EndIf
            GUICtrlSetState($aLabel[$i][9], $GUI_SHOW)
        EndIf
    Next

    ;Hide Volume Label
    GUICtrlSetState($Volume_Label, $GUI_HIDE)

EndFunc ;==>_RemoveVolumeLabel

Func _Save_Change_Volume()

    AdlibUnRegister("_Save_Change_Volume")

    _Set_volume($VolumePercent);Set

    IniWrite($Save_INI, @ComputerName, "Volume", $VolumePercent);Save

EndFunc ;==>_Save_Change_Volume

Func _WM_LBUTTONDOWN()

    ;Move GUI
    If WinActive("AutoIt Radio Cover") Then
        _SendMessage($CoverGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    Else
        _SendMessage($PlayerGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndIf

    ;Save GUI pos
    Local $Player_pos = WinGetPos("AutoIt Radio Player")
    Local $Cover_pos = WinGetPos("AutoIt Radio Cover")
    IniWrite($Save_INI, @ComputerName, "Title_X", $Player_pos[0])
    IniWrite($Save_INI, @ComputerName, "Title_Y", $Player_pos[1])
    If $Radio_CoverLink <> "" Then
        IniWrite($Save_INI, @ComputerName, "Cover_X", $Cover_pos[0])
        IniWrite($Save_INI, @ComputerName, "Cover_Y", $Cover_pos[1])
    EndIf

EndFunc   ;==>_WM_LBUTTONDOWN

Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)

    AdlibUnRegister("_RemoveVolumeLabel")

    If GUICtrlGetState($Volume_Label) <> 80 Then

        ;Show $Volume_Label
        GUICtrlSetState($Volume_Label, $GUI_SHOW)

        ;Hide Others Label
        Local $Previous_Type = ""
        For $i = 0 To UBound($aLabel) - 1
            If $Radio_Name = $aLabel[$r][0] Then
                If $Previous_Type <> $aLabel[$i][1] Then
                    $Previous_Type = $aLabel[$i][1]
                    GUICtrlSetState($aLabel[$i][10], $GUI_HIDE)
                EndIf
                GUICtrlSetState($aLabel[$i][9], $GUI_HIDE)
            EndIf
        Next

    EndIf

    ;Change $VolumePercent
    Local $WheelDelta = BitShift($wParam, 16) / 120
    $VolumePercent = $VolumePercent + 4 * $WheelDelta
    If $WheelDelta > 0 Then
        If $VolumePercent > 100 Then $VolumePercent = 100
    Else
        If $VolumePercent < 0 Then $VolumePercent = 0
    EndIf
    If $Previous_VolumePercent <> $VolumePercent Then
        $Previous_VolumePercent = $VolumePercent
        GUICtrlSetData($Volume_Label, $VolumePercent)
    EndIf

    ;Change\Save Sound
    AdlibRegister("_Save_Change_Volume", 50)

    ;Hide $Volume_Label in 3s
    AdlibRegister("_RemoveVolumeLabel", 3000)

    Return $GUI_RUNDEFMSG

EndFunc   ;==>_WM_MOUSEWHEEL

Func ContextMenu_ChangeRadio()

    $Previous_Cover_Read = ""

    Local $NewRadioName = GUICtrlRead(@GUI_CtrlId, 1)

    ;Maybe the next radio have no cover so delete it
    If $Radio_CoverLink <> "" Then
        GUIDelete($CoverGUI)
        AdlibUnRegister("GetCoverDATA")
    EndIf

    ;Maybe the $PlayerGUI need resize so delete it
    GUIDelete($PlayerGUI)
    AdlibUnRegister("GetPlayerDATA")

    _Audio_stop($MusicHandle)

    ;Remove Default Radio Tag
    For $r = 0 To UBound($aRadio) - 1
        $aRadio[$r][7] = 0
    Next

    ;Set $NewRadioName to Default
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][0] = $NewRadioName Then
            $aRadio[$r][7] = 1
            IniWrite($Save_INI, @ComputerName, "Default_Radio", $aRadio[$r][0])
        EndIf
    Next

    ;Get $Radio_Name, $Radio_SoundLink, $Radio_CoverLink, $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 1 Then
            $Radio_Name = $aRadio[$r][0]
            $Radio_SoundLink = $aRadio[$r][1]
            $Radio_CoverLink = $aRadio[$r][2]
            $Radio_CoverLink_Start = $aRadio[$r][3]
            $Radio_CoverLink_End = $aRadio[$r][4]
            $Radio_CoverLink_BetweenNum = $aRadio[$r][5]
            $Radio_CoverLink_Before = $aRadio[$r][6]
        EndIf
    Next

    ;ConsoleWrite("Build GUI" & @CRLF)

    ;Build GUI
    _Build_PlayerGUI()
    _Build_CoverGUI()

    ;ConsoleWrite("Show GUI" & @CRLF)

    GUISetState(@SW_SHOW, $PlayerGUI)
    If $Radio_CoverLink <> "" Then
        GUISetState(@SW_SHOW, $CoverGUI)
    EndIf

    ;GetPlayerDATA() - GetCoverDATA()
    GetPlayerDATA()
    AdlibRegister("GetPlayerDATA", 8000)
    If $Radio_CoverLink <> "" Then
        GetCoverDATA()
        AdlibRegister("GetCoverDATA", 8000)
    EndIf

EndFunc ;==>ContextMenu_ChangeRadio

Func UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")

    Local $Error = ""
    Local $Data = ""
    Local $Curl = Curl_Easy_Init()
    If Not $Curl Then Return

    If $write = 0 Then

        ;Read Mode

        ; How to get html or header data?
        ;   1. Set $CURLOPT_WRITEFUNCTION and $CURLOPT_HEADERFUNCTION to Curl_DataWriteCallback()
        ;   2. Set $CURLOPT_WRITEDATA or $CURLOPT_HEADERDATA to any number as identify
        ;   3. Use Curl_Data_Get() to read the returned data in binary format
        ;   4. Use Curl_Data_Cleanup() to remove the data

        Local $Html = $Curl ; any number as identify
        Local $Header = $Curl + 1 ; any number as identify

        Curl_Easy_Setopt($Curl, $CURLOPT_URL, $Link)
        Curl_Easy_Setopt($Curl, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A')
        Curl_Easy_Setopt($Curl, $CURLOPT_FOLLOWLOCATION, 1)
        Curl_Easy_Setopt($Curl, $CURLOPT_ACCEPT_ENCODING, "")
        Curl_Easy_Setopt($Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback())
        Curl_Easy_Setopt($Curl, $CURLOPT_WRITEDATA, $Html)
        Curl_Easy_Setopt($Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback())
        Curl_Easy_Setopt($Curl, $CURLOPT_HEADERDATA, $Header)
        Curl_Easy_Setopt($Curl, $CURLOPT_COOKIE, "tool=curl; script=autoit; fun=yes;")
        Curl_Easy_Setopt($Curl, $CURLOPT_TIMEOUT, $Timeout)
        Curl_Easy_Setopt($Curl, $CURLOPT_SSL_VERIFYPEER, 0)

        Local $Code = Curl_Easy_Perform($Curl)
        If $Code = $CURLE_OK Then
            ;ConsoleWrite("Content Type: " & Curl_Easy_GetInfo($Curl, $CURLINFO_CONTENT_TYPE) & @LF)
            ;ConsoleWrite("Download Size: " & Curl_Easy_GetInfo($Curl, $CURLINFO_SIZE_DOWNLOAD) & @LF)

            $Data = BinaryToString(Curl_Data_Get($Html))
            $Error = ""

            ;MsgBox(0, 'Header', BinaryToString(Curl_Data_Get($Header)))
            ;MsgBox(0, 'Html', BinaryToString(Curl_Data_Get($Html)))
        Else
            ;ConsoleWrite(Curl_Easy_StrError($Code) & @LF)

            $Data = ""
            $Error = Curl_Easy_StrError($Code)

        EndIf

        Curl_Easy_Cleanup($Curl)
        Curl_Data_Cleanup($Header)
        Curl_Data_Cleanup($Html)

    Else

        ;Write Mode

    EndIf

    Local  $aray[2] = [$Data,$Error]
    return $aray

EndFunc

Func GetCoverDATA()

    ;ConsoleWrite("GetCoverDATA (Start)" & @CRLF)

    ;Get $RealCoverLink
    If $Radio_CoverLink_Start = "" Then
        ;ConsoleWrite("$RealCoverLink = $Radio_CoverLink" & @CRLF)
        Local $RealCoverLink = $Radio_CoverLink
    Else
        ;ConsoleWrite("$RealCoverLink <> $Radio_CoverLink" & @CRLF)
        ;UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")
        Local $aray = UseCurl($Radio_CoverLink, 5)
        Local $Data = $aray[0]
        Local $Error = $aray[1]
        If $Error <> "" then
            ;ConsoleWrite("$Error = " & $Error & @CRLF)
        EndIf
        Local $Between = _StringBetween($Data, $Radio_CoverLink_Start, $Radio_CoverLink_End)
        If @error <> 0 Then
            $Between = ""
        Else
            $Between = $Between[$Radio_CoverLink_BetweenNum]
        EndIf
        $RealCoverLink = $Radio_CoverLink_Before & $Between
        $RealCoverLink = StringReplace($RealCoverLink, " ","%20")
    EndIf
    ;ConsoleWrite("$RealCoverLink = " & $RealCoverLink & @CRLF)

    ;UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")
    Local $Cover_Read = UseCurl($RealCoverLink, 5, 1)

    $Cover_Read = $Cover_Read[0]

    If $Cover_Read <> $Previous_Cover_Read and $Cover_Read <> "" Then

        $Previous_Cover_Read = $Cover_Read

        Local $hMem = _MemGlobalAllocFromBinary($Cover_Read)
        Local $hImage = _GDIPlus_ImageLoadFromHGlobal($hMem)
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($CoverGUI)
        _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $CoverSize, $CoverSize)
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_ImageDispose($hImage)

    EndIf

    ;ConsoleWrite("GetCoverDATA (End)" & @CRLF)

EndFunc ;==>GetCoverDATA()

Func GetPlayerDATA()

    _ReduceMemory()

    ;ConsoleWrite("GetPlayerDATA (Start)" & @CRLF)

    ;Assign
    Local  $Previous_Data, $Previous_DataLink
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then

            If $Previous_DataLink <> $aLabel[$i][3] Then

                Local $aray = UseCurl($aLabel[$i][3], 5)
                Local $Data = $aray[0]
                Local $Error = $aray[1]

                $Previous_Data = $Data
                $Previous_DataLink = $aLabel[$i][3]

            Else

                $Data = $Previous_Data
                $Previous_DataLink = $aLabel[$i][3]

            EndIf

            Local $Between = _StringBetween($Data, $aLabel[$i][4], $aLabel[$i][5])
            If @error <> 0 Then
                $Between = ""
            Else
                If Not ($aLabel[$i][6] > Ubound($Between)-1) Then
                    $Between = $Between[$aLabel[$i][6]]
                Else
                    $Between = ""
                EndIf
            EndIf
            If $aLabel[$i][7] <> "" Then
                Local $Split = StringSplit($Between, $aLabel[$i][7], 1)
                If $Split[0] < $aLabel[$i][8] Then
                    Local $Info = ""
                Else
                    $Info = $Split[$aLabel[$i][8]]
                EndIf
            Else
                $Info = $Between
            EndIf

            If $Data = "" Then
                $Info = $Error
            EndIf

            $Info = StringReplace($Info, "â·", "·")
            $Info = StringReplace($Info, "apos;", "'")
            Assign($aLabel[$i][1] & $aLabel[$i][2], $Info)

        EndIf
    Next

    If _BASS_ChannelIsActive($MusicHandle) <> 1 and $Play = 1 Then

        _Audio_stop($MusicHandle)

        ;ConsoleWrite("Start playing sound" & @CRLF)
        $Play = 1
        $MusicHandle = _Set_url($Radio_SoundLink)
        _Audio_play($MusicHandle)

        ;ConsoleWrite("Set Volume" & @CRLF)
        $VolumePercent = IniRead($Save_INI, @ComputerName, "Volume", 4)
        $Previous_VolumePercent = $VolumePercent
        _Set_volume($VolumePercent)

    EndIf

    ;Update Ctrl
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            If Eval($aLabel[$i][1] & $aLabel[$i][2]) <> GUICtrlRead($aLabel[$i][9]) Then
                GUICtrlSetData($aLabel[$i][9], Eval($aLabel[$i][1] & $aLabel[$i][2]))
            EndIf
        EndIf
    Next

    ;ConsoleWrite("GetPlayerDATA (End)" & @CRLF)

EndFunc ;==>GetPlayerDATA()

#EndRegion ;==> Internal Func

While 1

    Local $Msg = GUIGetCursorInfo($PlayerGUI)

    If $Msg[4] = $Close Then
        If $Msg[2] = 1 Then
            _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Closep.bmp");MousePressed
        Else
            _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Closeo.bmp");MouseOver
        EndIf
    Else
        _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Close.bmp");Nothing
    EndIf

    If $Play = 1 Then
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopp.bmp");MousePressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopo.bmp");MouseOver
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stop.bmp");Nothing
        EndIf
    Else
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playp.bmp");MousePressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playo.bmp");MouseOver
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\play.bmp");Nothing
        EndIf
    EndIf

    Sleep(100)

WEnd


;1075 v0.0.0.8 30/04/2016 01:55

 

Edited by Synapsee

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

I've tryd it but it won't play anything (no sound).

But (since I ran your program) now every program I use that uses bass.dll won't give any sound when not compiled on my pc.

When I compile the script everything works ok but not when I started from the code, everything than works ok but no sound,

So how can I fixed this!!!!

 

EDIT

I've fixed this to run this small script

$VolumeTarget = "autoit3.exe"

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 10, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

I don't think this is the right way to make a program!!!

Edited by nend

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Hi nend and thx for spend time on my script but i can't understand.

Have u try mousewheel up/down ? This don't change the volume ?

Quote

Install/Use :

-Use MouseWheel for change volume
          Note : On first start : volume = 4%

When u use that :

Quote
$VolumeTarget = "autoit3.exe"

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 10, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

 

This set your volume @ 100% or 10% ?

Set the volume @ 50% should be :

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 50/100, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

Edit :

Quote

But (since I ran your program) now every program I use that uses bass.dll won't give any sound when not compiled on my pc.

ok, i understand better, sorry for this problem, i will look arround use bass.dll instead of change the "autoit3.exe" volume lvl.

Edited by Synapsee

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

The problem is that the nircmdc.exe set al the audio volume for all autoit scripts.

If u use Bass.dll for your project it will work a lot better.

When I started this script all my scripts didn't work properly anymore, but by exmanine your script I realized that the command niccmdc take over every au3 script audio.

I will check your script again (with the mouse wheel) and come back on it.

EDIT:

I've try'd it again but the same issue, program won't react and no sound (even with mousewheel)

But now I didn't get the sound back and needed a system recovery to get it work again.

For now I won't test it again until you get rid of nircmdc.

Edited by nend
1 person likes this

Share this post


Link to post
Share on other sites

Hi Synapsee

There is no error message, but I have no sound and i can not exit.

I have tried script and compiled version under Win 8.1 :huh2:

 

1 person likes this

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

Hey, thx for reply <3

This is strange, the script is probably stuck somewhere on spacetime

Can u see gui ? gui is feeded with cover/data ? can u see close button ? can u drag gui ? can u rightclic ? the gui hang ? when u mousewheel u see current volume % appear ?

I work on a new version with more console return, this will help a lot for this case.

Actually i progress on curl stuff, because i can't set timeout for the iniread($coverlink) but with curl i can : )

Edited by Synapsee

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

Here the same problem program hangs and kills the audio I have to kill it in the taskmanager to stop the program (windows 10 64 bits).

I see the gui but the I can do anything, did you see the pm I send you?

It's very simpel to rebuild this app with bass.dll and than you don't have this problem.

Edited by nend

Share this post


Link to post
Share on other sites
Quote

did you see the pm I send you?

No, i don't know how i can see it. I see u posted on my profile but where ? this is the ask ^^ Can't find

Quote

It's very simpel to rebuild this app with bass.dll and than you don't have this problem.

It's sure i need use bass.dll but the program hangs for another reason i think. And I have no hang on start on my computer.

I think the best is wait for another version with more debug stuff for find where the script stuck.

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

1 hour ago, Synapsee said:

Can u see gui ? yes

gui is feeded with cover/data ? yes

can u see close button ? yes, but when i click nothing appens 

can u drag gui ?  no

can u rightclic ? yes

the gui hang ?  no i don't think

when u mousewheel u see current volume % appear ? no

 

20160428151121e6jte.png

Edited by wakillon
1 person likes this

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Last ver : v0.0.0.8

AutoIt Radio Player v0.0.0.8.zip

Changelog :

Spoiler

-Better code practice
          Replace dim with local
          Use #AutoIt3Wrapper_Au3Check_Parameters=-w 1 -w 2 -w 3 -w- 4 -w 6 -w- 7
          Improve some comment

-Replace SoundPlay\nircmd with Bass.dll usage
          SoundPlay\nircmd is a novice usage, Bass.dll usage is better
          Now if an event like disconnect appear the sound resume.
          Thx to nend, ..., No ! Big Thx to nend ;)

-Replace InetRead/_InetGetSource with Curl.au3 usage
          InetRead/_InetGetSource seems limited with timeout management
          Both replaced with Curl_Easy_Perform()
          Set all timeout to 5s
          If timeout is reached about tracktitle for sample you will see now "timeout was reached" (curl error return)

TODO :

Spoiler

-Update first post

-About Timeout/ GUI-blocking
          Curl_Easy_Perform() seems better but not the best for GUI Hang while timeout is not reached.
          I need study about Curl.au3 for use Curl_Multi_Perform() (study the non-GUI-blocking technique sample).
                    This is done. Curl.au3\Curl_Example_Multi.au3 rocks ;)

-Add right clic functionnality for a Website Station shorcut.
          This is done with _WinAPI_AssocQueryString(".html", $ASSOCSTR_EXECUTABLE)

-Add right clic functionnality for a gui for add/del station or any other label.
          i will probably use _FileReadToArray, _FileWriteFromArray for save the gui data.
                    In progress...

 

or any other label explain :

          Current : TrackTiTle
          Coffee Ready : Yes/No
          Weather : 26 Degres

Current RightClic :

          Current Station (onclic station switch)
          Separator
          Station A (onclic station switch)
          Station B (onclic station switch)

Next Target RightClic :

          Current Station
                    Website (open the station url)
                    Load (change to this station)
          Separator
          Station A
                     Website (open the station url)
                     Load (change to this station)
          Station B
                    Website (open the station url)
                    Load (change to this station)
          Separator
          Config (load a nice gui for manage the list station)

Console return :

Spoiler

Console should return :

Start
Build GUI
Build PlayerGUI
Build CoverGUI
Show GUI
GetPlayerDATA (Start)
Start playing sound
Set Volume
GetPlayerDATA (End)
GetCoverDATA (Start)
$RealCoverLink = http://imglink.jpg
GetCoverDATA (End)
GUIRegisterMsg

And a while with :

GetPlayerDATA (Start)
GetPlayerDATA (End)

GetCoverDATA (Start)
$RealCoverLink = http://imglink.jpg
GetCoverDATA (End)

Related link :

bass.dll source : http://www.un4seen.com/bass.html (v2.4.12.1)

bass.au3 source : bass related forum post (patch 9.2/Constant from 9.0)

nice autoit program for help with Curl.au3 usage by wakillon : Mp3SearchEngine

nice autoit program "radio related" by nend : http://trayradio.com/

Edited by Synapsee
1 person likes this

Share this post


Link to post
Share on other sites

#11 ·  Posted

Now i can drag gui and volume is displayed but i have no sound...


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

#12 ·  Posted

10 hours ago, wakillon said:

Now i can drag gui and volume is displayed but i have no sound...

It's probably related to v0.0.0.7 (nircmd.exe use).

Try up sound on the windows mixer panel (While Player running).

%windir%\System32\SndVol.exe

57265693366f6_mixerfix.jpg.ec133a7364418

Share this post


Link to post
Share on other sites

#13 ·  Posted

nice. Why is it:

GetCoverDATA (Start)
$RealCoverLink = http://wcdr.servemp3.com:8112/playingart?sid=2
GetCoverDATA (End)

every second ?

and if you could by default set Opt("TrayAutoPause", 0) while without a tray menu :) 

Thanks for sharing.

Share this post


Link to post
Share on other sites

#14 ·  Posted

hi argumentum,

Quote

every second ?

for the moment it's all 8s :

...
AdlibRegister("GetCoverDATA", 8000)
...
AdlibRegister("GetPlayerDATA", 8000)
...

i will add a config GUI where u can config this timing for each downloaded DATA.

Quote

Opt("TrayAutoPause", 0)

Not a bad idea, just discover that, seems a good improve for make autoit trayicon more easy to use. Thx u for sharing and testing : )

1 person likes this

Share this post


Link to post
Share on other sites

I'm trying some Bass Plugin scripts since yesterday and note that i have no sound !

So, intriged by this problem, I made the connection with your script where i have no sound too.

After having verified my sound card drivers, uninstall and reinstall, there is no changes...

In the meantime i have used my Mp3SearchEngine who use bass.dll and i have sound...

So a bit lost, i did not understand why some scripts "works" and others not !

And i realize that Mp3SearchEngine was compiled and other not.

So i compile my script and run it and...i get sound ! and same for yours too !

So be reassured your last version works well ;)

 

Now, I have to find why i have a sound problem running "Bass" script not compiled...:sweating:


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

Start a not compiled script, start play a sound (you should have no sound). and do that :

 

Edit ; nircmd.exe have set "autoit3.exe" sound to 0%

when u compile a script "yourscript.exe" the sound is at 100% but if not compiled windows see him like "autoit3.exe"  and sound is at 0%

Edited by Synapsee

Share this post


Link to post
Share on other sites

I got it to this path C:\Windows\WinSxS\x86_microsoft-windows-audio-volumecontrol_31bf3856ad364e35_6.3.9600.17415_none_5b14d0ca22da016a\SndVol.exe

and sound is back thanks.

So, it was nircmd.exe who was responsible of this problem ?


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

C:\Windows\WinSxS\x86_microsoft-windows-audio-volumecontrol_31bf3856ad364e35_6.3.9600.17415_none_5b14d0ca22da016a\SndVol.exe

good job !

 

Not really, u start my v0.0.0.7, nircmd set autoit3.exe @ 0%, after a error appear, you close the script, the sound is always at 0%

set the autoit3.exe volume directly is just a bad idea because this affect all not compiled script.

But nircmd.exe have do the good job, its more a bad use of him. Bass seems set volume only for the current script so it's clearly better.

I'm really sorry for that problem, im happy see you resolve it ; )

 

I'm continue dev my script, i learn a lot every day, i have add some functionnality with a gui for config, etc...

My dream now it's add something like that : https://autoit.de/index.php/Thread/23204-Audio-Visualization-Collection/ while playing radio ; )

Share this post


Link to post
Share on other sites

Something like this ?


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Yeah, like that : ) You will clearly inspire me again with that TinyMp3Player ^^

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • wakillon
      By wakillon
      Mp3SearchEngine v2.0.0.6

      May be some of you know Songr .
      This script do the same job, it can find more mp3 files but is not as fast as Songr.
       
       



      Sites used are music search engine Websites designed for LEGAL entertainment purposes only.
      Thanks to Brett Francis, Prog@ndy and Eukalyptus for >Bass Udf, trancex for >WinHttp Udf and the AutoIt Community for his help.

       
      Changes of v1.0.8.5
       
      Three websites replaced cause they are dead or use now js.
      All search engines updated ( not without difficulties for audiodump)
      I use RAGrid.dll for the first listview (more fast and stable, but with some inconvenients to manage the no-edit of cells)
      Input queries are saved ( the twenty latest)
      I use now an mp3 pre-Load management before playing and a double progressbar for visualize pre-load and play, where you can click for directly go play in the loaded part.
      Most includes needed are embedded and all external files are embedded in script with >BinaryToAu3Kompressor .
      Multi downloads available with embedded downloader.exe
       
      Changes of v1.0.8.8
      Search on audiodump and myfreemp3 fixed.
      New buttons.
      Added Gui Menu.
      Titles are no more editable.
      New "About" with >TaskDialog (Thanks Prog@andy)
      Query button permit now to check / uncheck all checkboxes
      And some few fixes and cleaning.
      Really more stable now.
      Changes of v1.0.9.2
      Dilandau is replaced by mp3chief and mp3ili by mp3clan 
      Search on mp3juices, baseofmp3 and soundcloud fixed.
      Soso now provide m4a (aac) instead of mp3 ( m4a can be played by MSE)
      Added possibility to encode automaticaly to mp3, aac or ogg ( at the end of download) using bassenc.dll and command line tools : lame, faac and oggenc.
       
      Changes of v1.0.9.3   mp3skull fixed mp3chief fixed myfreemp3 fixed mp3clan changed to tusmp3  mp3juices changed to emp3world baseofmp3 changed to imp3 and some minor improvements.  
      Version 2.0.0.6
      Most previous websites used are dead or have changed the way to get links, 
      so instead of try to repair the previous version, i have created a complete new version.
      The main tendency is the simplification :
      Only one website : audiodump (Up to 500 results by request)
      Script use now the little pearl created by Ward : curl.au3
      It permit to create tasks (get source and get multi mp3) in asynchronous mode.
      So now, no need to use several executables and no more gui who do not respond in case of connection problems. 
      Script use Bass.dll X86 loaded in memory for play songs.
      Result is light and fast, but don't abuse of audiodump servers who are not beasts of race.
      Warning : For avoid errors with curl.au3, you'll need to comment the line 63 : ;~ #Include <BinaryCall.au3>
      @AutoItX64 not supported and only tested on Win7X64 and Win8.1X64.
      As your browser, use Ctrl+w for remove the current Tab.(if there is no search or download running from it)
      And also Ctrl+q for set/remove Gridlines.
      Events are displayed to the bottom of the Gui.
       
      Version 2.0.1.1
      Added a Paste Button.
      Querry list is now correctly saved.
      Querry Combo is now sorted in alphabetical order
      After a 'No match', the next search will use the previous empty listview.
      Bug when removing tabs is corrected.
      Added string correction for the request that, in the previous version, was not always able to return a correct result.
       
      A big thanks to Ward for his great UDF, and Nina my favorite tester, (who between us is also my third daughter), for his precious advices .
      previous downloads : 1703
       
      As there is no more script downloads count, source and executable are available in the downloads section

      Enjoy ! 
      July 2017 Project Discontinued due to website changes
    • AndyS19
      By AndyS19
      I created 3 radio buttons and when the script is run, the selected buttons display the text on the right of the actual button.  Also, it appears like the radio button occupies space around it, as it obscures part of the other controls when I hover the mouse around it.  I would like to group the buttons closer together and put other controls on the right of them.  I also wanted to make the button text display on the left side of the button.
      Here is my test code:
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 Opt("GUICloseOnESC", 1) ; ESC closes GUI? (0 = no, 1 = yes) Opt("GUIOnEventMode", 1) ; Change to OnEvent mode Opt('MustDeclareVars', 1) OnAutoItExitRegister("ExitStageLeft") Opt("GUIEventOptions", 1) ;0=default, 1=just notification, 2=GuiCtrlRead tab index _Main() Func _Main() GUICreate("test", 300, 300, -1, -1, -1, -1) GUIStartGroup() local $x = 50, $y = 10, $w = 40, $h = 15,$spcY = 15 GUICtrlCreateRadio("", $x, $y, $w, $h) GUICtrlCreateRadio("ABC", $x, $y + ($spcY*1), $w, $h) GUICtrlCreateRadio("", $x, $y + ($spcY*2), $w, $h) GUIStartGroup() GUICtrlCreateInput("An Input Control", 70, 10, 110, 30) GUICtrlCreateInput("Another Input Control", 10, 73, 110, 20) GUISetOnEvent(-3, 'ExitStageLeft') GUISetState(@SW_SHOW) While (1) Sleep(251) WEnd EndFunc Func ExitStageLeft() Exit EndFunc I want "ABC" to display on the left of the 2nd radio button.
       

    • Jibberish
      By Jibberish
      Hi,
      I am maybe an intermediate AutoIt script writer, but have no experience creating GUIs.
      I have a script with two functions. One for Checkboxes and another with radio buttons. Each function creates it's own window.
      I'd like to use one window with both checkboxes and radio buttons.
      I pulled samples from AutoIt Help and other places and worked it into this: (RadioCheck still uses the example Case and MsgBoxes. I will clean this up soon)
      Func CheckOptions() ; Create a GUI with various controls. Local $hGUI = GUICreate("SGX4CP Options", 275, 250) ; Create a checkbox control. Local $iLoopCheckbox = GUICtrlCreateCheckbox("Loop", 10, 10, 185, 25) Local $iFullScreenCheckbox = GUICtrlCreateCheckbox("Fullscreen", 10, 40, 185, 25) Local $iRestartPlaybackCheckbox = GUICtrlCreateCheckbox("Restart Playback from Sleep", 10, 70, 185, 25) GUICtrlSetState($iRestartPlaybackCheckbox, $GUI_CHECKED) Local $iDisableSleepCheckbox = GUICtrlCreateCheckbox("Disable Sleep", 10, 100, 185, 25) Local $iLogCheckbox = GUICtrlCreateCheckbox("Show Log", 10, 130, 185, 25) GUICtrlSetState($iLogCheckbox, $GUI_CHECKED) Local $idClose = GUICtrlCreateButton("Next", 110, 220, 85, 25) ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idClose ExitLoop Case $iLoopCheckbox If _IsChecked($iLoopCheckbox) Then $bLoopChecked = True Else $bLoopChecked = False EndIf Case $iFullScreenCheckbox if _IsChecked($iFullScreenCheckbox) Then $bFullScreenChecked = True Else $bFullScreenChecked = False EndIf Case $iRestartPlaybackCheckbox if _IsChecked($iRestartPlaybackCheckbox) Then $bRestartPlaybackChecked = True Else $bRestartPlaybackChecked = False EndIf Case $iDisableSleepCheckbox if _IsChecked($iDisableSleepCheckbox) Then $bDisableSleepChecked = True Else $bDisableSleepChecked = False EndIf Case $iLogCheckbox if _IsChecked($iLogCheckbox) Then $bLogChecked = True Else $bLogChecked = False EndIf EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc Func RadioCheck() GUICreate("Select Test",300,180) ; will create a dialog box that when displayed is centered Local $idRadio1 = GUICtrlCreateRadio("Loop Forever", 10, 10) Local $idRadio2 = GUICtrlCreateRadio("Play each video 3 times", 10, 40) Local $idRadio3 = GUICtrlCreateRadio("Play each video separately", 10, 70) GUICtrlSetState($idRadio1, $GUI_CHECKED) Local $idClose = GUICtrlCreateButton("Start Test", 120,100) GUISetState(@SW_SHOW) Local $idMsg ; Loop until the user exits. While 1 $idMsg = GUIGetMsg() Select Case $idMsg = $GUI_EVENT_CLOSE ExitLoop Case $idMsg = $idRadio1 And BitAND(GUICtrlRead($idRadio1), $GUI_CHECKED) = $GUI_CHECKED MsgBox($MB_SYSTEMMODAL, 'Info:', 'The app will run forever, playing each video once, then looping back to the first video.') $bTestSelectForever = True Case $idMsg = $idRadio2 And BitAND(GUICtrlRead($idRadio2), $GUI_CHECKED) = $GUI_CHECKED MsgBox($MB_SYSTEMMODAL, 'Info:', 'Each video will loop 3 times then move to the next video.') $bTestSelect3Times = True Case $idMsg = $idRadio3 And BitAND(GUICtrlRead($idRadio2), $GUI_CHECKED) = $GUI_CHECKED MsgBox($MB_SYSTEMMODAL, 'Info:', 'Player opens, first video plays, player closes. Player opens, second video plays, player closes, etc.') $bTestSelectSingleVideo = True EndSelect WEnd EndFunc I would like to combine the checkbox "Loop" and the radio button $idRadio2. Radio2 requires Loop to be checked.
      I planned to remove the Loop checkbox and only enable it if Radio2 is selected.
      Can I combine these two functions into one with one window with both Checkboxes and Radio Buttons?
      Thanks
      Jibberish
    • 5ervant
      By 5ervant
      What's the best way to receive file from a desktop app?
      app.exe will execute a cmd with "au3file.exe /path/of/the/file.xml" and the au3file.exe will get and delete that. Or else? THE MOST IMPORTANT PART OF THE QUESTION
      And best way to transfer file to a desktop app?
      au3file.exe do a $_POST request and the app.exe MUST HAVE a local HTTP server that can receive $_POST, but it looks heavy 'cause the app must have a server such XAMPP. au3file.exe execute a cmd with "app.exe /path/of/the/file.xml" and the app.exe will now get that file and delete. Or else?  
    • ur
      By ur
      I have below screen when I launch the application.

      By default the first radio button is checked.
      I want to select the second radio button as highlighted.
      And when it is selected, the textbox highlighted will be enabled and we need to enter the license details.
       
      To do that, I tried to get the control id with windo info tool , but I am getting the second section(Concurrent Licenses) completely as "Button" class with ID 12.But not that radiobutton ID.
      Even I tried with that as below.
      $hwd =WinWaitActivate("erwin Data Modeler Licensing","Acquire concurrent u") ControlCommand($hwd,"","[CLASS:Button; INSTANCE:12]","Check") But not working.
      Any suggestions please.