Mp3 Player

  • hallo,
    ich bin gerade dabei ein Programm zum abspielen von .mp3 zu schreiben. Habe nun schon einiges geschafft, komme an manchen Punkten jedoch nicht mehr weiter.

    Zum einen flackert die Anzeige des Aktuellen Position im Lied. Ich vermute, dass dies von der Aktualisierung durch die While-Schlaufe kommt. Ich wollte dies mittels Sleep verlangsamen, kann dann jedoch nichts mehr im Programm klicken, da das komplette Script "stehen" bleibt.
    Auch habe ich eine Suchfunktion, welche soweit funktioniert, dass die den Suchbegriff in der ListView sucht, zu diesem springt, ihn jedoch nicht blau hinterlegt. Sollte der Begriff mehrfach in der List sein, so wir auch immer nur der erste angewählt und nicht zum nächsten übergesprungen.
    Dann habe ich noch das Problem, dass das Lied nicht umgeschalten wird, wenn es zu ende ist. Wollte dies über eine If-Abfrage der Aktuellen Position sowie der Gesamtlänge realisieren, was jedoch nicht hingehauen hat.
    Auch bräuchte ich noch einen Denkanstoß für einen Slider, welcher die aktuelle Position anzeigt und über den gespult werden kann.
    Die Webradiofunktion spielt hier keine Rolle.

    Ich bedanke mich bei allen fürs lesen und hoffe das mir der ein oder andere vllt auch helfen kann.

    Hier mein Script:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.0
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $abspiel,$titel
    $test = @ScriptDir & "\play.gif"

    [/autoit] [autoit][/autoit] [autoit]

    $playing=false

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 610, 225, 209, 315)
    ;~ $bg = GUICtrlCreatePic("bg.jpg", 0, 0, 0, 0)
    ;~ GUIctrlsetState($bg, $GUI_DISABLE)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    $pic1=GUICtrlCreatePic(@ScriptDir & "\next.gif", 560, 150, 36, 36)
    $pic2=GUICtrlCreatePic(@ScriptDir & "\back.gif", 410, 150, 36, 36)
    $pic3=GUICtrlCreatePic(@ScriptDir & "\stop.gif", 510, 150, 37, 37)
    $ListView1=GUICtrlCreateListView("Song|Pfad", 413, 50, 178, 75)
    $ListView2=GUICtrlCreateListView("Song|Pfad", 20, 50, 350, 135)
    $Search=GUICtrlCreateInput("",20, 17, 250, 20)
    $SearchButton=GUICtrlCreateButton("Suchen", 291, 17, 80, 20)
    GUICtrlSetState($listview1, $GUI_DROPACCEPTED)
    $Menu=GUICtrlCreateMenu("Datei")
    $Menumedia=GUICtrlCreateMenu("Medienbibliothek")
    $MediaAktualisieren=guictrlcreatemenuitem("Medienbiliothek aktualisieren",$Menumedia)
    $Pfad=guictrlcreatemenuitem("Pfad zum Medienordner festlegen",$Menumedia)
    $show=guictrlcreatemenuitem("Pfad zum Medienordner anzeigen",$Menumedia)
    $Beenden=guictrlcreatemenuitem("Beenden",$Menu)
    $Radio=GUICtrlCreateMenu("Internetradio")
    $add=guictrlcreatemenuitem("Link hinzufügen",$Radio)
    guictrlcreatemenuitem("",$Radio)
    $Label=GUICtrlCreateLabel("00:00:00", 412, 1 ,100 ,100)
    $Label1=GUICtrlCreateLabel("Titel", 412, 14 ,150 ,100)
    $Label2=GUICtrlCreateLabel("00:00:00", 412, 27 ,43 ,12)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    start()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    if $playing = true Then
    guictrlsetdata($label2,_SoundPos($abspiel))
    EndIf

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_DROPPED
    $ar = _GUICtrlListView_GetSelectedIndices($listview2, True)
    For $i = 1 To $ar[0]
    $sItem = _GUICtrlListView_GetItemTextString($listview2, $ar[$i])
    GUICtrlCreateListViewItem($sItem, $listview1)
    Next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview1, $i, $LVSCW_AUTOSIZE)
    Next
    case $SearchButton
    search()
    case $add
    addradio()
    case $pic2
    _back()
    case $pic1
    _next()
    case $pic3
    _stop()
    pausebutton()
    case $pic
    if $test = @ScriptDir & "\play.gif" Then
    sound()
    if $playing = true then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    else
    _pause()
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    case $beenden
    exit
    case $Pfad
    $MediaPfad=FileSelectFolder("Medienorder auswählen", "")
    IniWrite("config.ini", "Einstellungen","Medienpfad", $MediaPfad)
    case $show
    $mediapfadread = IniRead("config.ini", "Einstellungen","Medienpfad", "")
    MsgBox(0, "Medienordner", "Aktuell ist folgender Medienordner ausgewählt:"&@crlf&@crlf&$mediapfadread)
    case $MediaAktualisieren
    $folder=IniRead("config.ini", "Einstellungen","Medienpfad", "")
    $Result=media($folder, ".+\.mp3", 1)
    FileDelete("media.ini")
    _GUICtrlListView_DeleteAllItems($ListView2)
    for $i = 1 to $result[0]
    $Song1=stringsplit($Result[$i],"\")
    $Song=StringSplit($Song1[$Song1[0]],".")
    GUICtrlCreateListViewItem($Song[1]&"|"&$result[$i] , $ListView2)
    IniWrite("media.ini", "Media", ""&$i&"", $Song[1]&"|"&$result[$i])
    next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    While 2
    Local $lenght, $SoundPos
    If $lenght = $SoundPos Then
    _next()
    endif
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    func sound()
    $SongPlay=_GUICtrlListView_GetItemTextString($Listview1)
    $SongRoot=StringSplit($SongPlay, "|")
    if IsArray($abSpiel) then
    _SoundResume($abspiel)
    else
    $abspiel=_SoundOpen($SongRoot[2])
    if $abspiel="" Then
    Msgbox(4096,"Datei","Es wurde keine Datei ausgewählt")
    else
    $playing=true
    $playsound=_SoundPlay($abspiel, 0)
    $lenght=_SoundLength($abspiel)
    $SoundPos=_SoundPos($abspiel, 1)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    endif
    endif

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _Pause()
    _SoundPause($abspiel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _stop()
    _SoundStop($abspiel)
    $abspiel=""
    $playing=false
    GUICtrlSetData($label2, "00:00:00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func media($sSD, Const $sPat = '', Const $iF = 3)
    Local $sRet = "", $sSubD = '|' & $sSD
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0],0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func start()
    If FileExists(@ScriptDir & "\media.ini") Then
    $var = IniReadSection(@ScriptDir & "\media.ini", "Media")
    If @error Then
    MsgBox(4096, "Error", "Unable to read section.")
    Else
    For $i = 1 To $var[0][0]
    GUICtrlCreateListViewItem($var[$i][1] , $ListView2)
    Next
    EndIf
    Else
    MsgBox(4096, "Medienbibliothek", "Es konnte keine Medienbibliotek geladen werden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    for $p = 1 to $res[0][0]
    guictrlcreatemenuitem($res[$p][1],$Radio)
    next
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _next()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] < (_GUICtrlListView_GetItemCount($listview1) -1) Then
    $sel[1] += 1
    Else
    $sel[1] = 0
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _back()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] > 0 Then
    $sel[1] -= 1
    Else
    $sel[1] = _GUICtrlListView_GetItemCount($listview1) -1
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func playbutton()
    if $test = @ScriptDir & "\play.gif" Then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    Endif
    Endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func pausebutton()
    if $test = @ScriptDir & "\pause.gif" then
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func search()
    $read = guictrlread($Search)
    $text = _GUICtrlListView_FindInText($ListView2, $read)
    $text1 = _GUICtrlListView_EnsureVisible($ListView2, $text)
    _GUICtrlListView_SetItemDropHilited($ListView2, $text1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func addradio()
    $addRadioLink=InputBox("Link hinzufügen", "Geben Sie hier den Link zur Internetradiostation ein:","","",150,130)
    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    iniwrite("Radio.ini", "Stations", "Radio"&$res[0][0] + 1, $addRadioLink)
    Else
    iniwrite("Radio.ini", "Stations", "Radio1", $addRadioLink)
    endif
    EndFunc

    [/autoit]
  • Folgender Fehler:

    (246) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    if $sel[1] > 0 Then
    if ^ ERROR

    Das Flackern könntest du mit

    [autoit]

    AdlibRegister

    [/autoit]


    Umgehen!

    Jura

  • hallo JuraX,

    die Fehlermeldung erscheint, da du nicht die Dateien der Buttons hast.
    Ich habe soeben versuch deinen Vorschlag mit der Funktion AdlibRegister umzusetzen, was leider nicht funktioniert. Kannst du dir vllt. anschauen, ob ich die Funktion falsch verwende?
    Komischerweise wird immer ein Teil des Liednamens hinter die "00:00:00" gesetzt, dies selbst ändert sich jedoch nicht.

    Funktion:

    Spoiler anzeigen
    [autoit]

    ...
    ...
    ...
    While 1
    AdlibRegister("_time", 1000)
    ...
    ...
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func _time()
    guictrlsetdata($label2,_SoundPos($abspiel))
    EndFunc

    [/autoit]

    Gesamtes Script:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.0
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $abspiel,$titel
    $test = @ScriptDir & "\play.gif"

    [/autoit] [autoit][/autoit] [autoit]

    $playing=false

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 610, 225, 209, 315)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    $pic1=GUICtrlCreatePic(@ScriptDir & "\next.gif", 560, 150, 36, 36)
    $pic2=GUICtrlCreatePic(@ScriptDir & "\back.gif", 410, 150, 36, 36)
    $pic3=GUICtrlCreatePic(@ScriptDir & "\stop.gif", 510, 150, 37, 37)
    $ListView1=GUICtrlCreateListView("Song|Pfad", 413, 50, 178, 75)
    $ListView2=GUICtrlCreateListView("Song|Pfad", 20, 50, 350, 135)
    $Search=GUICtrlCreateInput("",20, 17, 250, 20)
    $SearchButton=GUICtrlCreateButton("Suchen", 291, 17, 80, 20)
    GUICtrlSetState($listview1, $GUI_DROPACCEPTED)
    $Menu=GUICtrlCreateMenu("Datei")
    $Menumedia=GUICtrlCreateMenu("Medienbibliothek")
    $MediaAktualisieren=guictrlcreatemenuitem("Medienbiliothek aktualisieren",$Menumedia)
    $Pfad=guictrlcreatemenuitem("Pfad zum Medienordner festlegen",$Menumedia)
    $show=guictrlcreatemenuitem("Pfad zum Medienordner anzeigen",$Menumedia)
    $Beenden=guictrlcreatemenuitem("Beenden",$Menu)
    $Radio=GUICtrlCreateMenu("Internetradio")
    $add=guictrlcreatemenuitem("Link hinzufügen",$Radio)
    guictrlcreatemenuitem("",$Radio)
    $Label=GUICtrlCreateLabel("00:00:00", 412, 1 ,100 ,100)
    $Label1=GUICtrlCreateLabel("Titel", 412, 14 ,150 ,100)
    $Label2=GUICtrlCreateLabel("00:00:00", 412, 27 ,43 ,12)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    start()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    AdlibRegister("_time", 1000)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_DROPPED
    $ar = _GUICtrlListView_GetSelectedIndices($listview2, True)
    For $i = 1 To $ar[0]
    $sItem = _GUICtrlListView_GetItemTextString($listview2, $ar[$i])
    GUICtrlCreateListViewItem($sItem, $listview1)
    Next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview1, $i, $LVSCW_AUTOSIZE)
    Next
    case $SearchButton
    search()
    case $add
    addradio()
    case $pic2
    _back()
    case $pic1
    _next()
    case $pic3
    _stop()
    pausebutton()
    case $pic
    if $test = @ScriptDir & "\play.gif" Then
    sound()
    if $playing = true then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    else
    _pause()
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    case $beenden
    exit
    case $Pfad
    $MediaPfad=FileSelectFolder("Medienorder auswählen", "")
    IniWrite("config.ini", "Einstellungen","Medienpfad", $MediaPfad)
    case $show
    $mediapfadread = IniRead("config.ini", "Einstellungen","Medienpfad", "")
    MsgBox(0, "Medienordner", "Aktuell ist folgender Medienordner ausgewählt:"&@crlf&@crlf&$mediapfadread)
    case $MediaAktualisieren
    $folder=IniRead("config.ini", "Einstellungen","Medienpfad", "")
    $Result=media($folder, ".+\.mp3", 1)
    FileDelete("media.ini")
    _GUICtrlListView_DeleteAllItems($ListView2)
    for $i = 1 to $result[0]
    $Song1=stringsplit($Result[$i],"\")
    $Song=StringSplit($Song1[$Song1[0]],".")
    GUICtrlCreateListViewItem($Song[1]&"|"&$result[$i] , $ListView2)
    IniWrite("media.ini", "Media", ""&$i&"", $Song[1]&"|"&$result[$i])
    next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func _time()
    guictrlsetdata($label2,_SoundPos($abspiel))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func sound()
    $SongPlay=_GUICtrlListView_GetItemTextString($Listview1)
    $SongRoot=StringSplit($SongPlay, "|")
    if IsArray($abSpiel) then
    _SoundResume($abspiel)
    else
    $abspiel=_SoundOpen($SongRoot[2])
    if $abspiel="" Then
    Msgbox(4096,"Datei","Es wurde keine Datei ausgewählt")
    else
    $playing=true
    $playsound=_SoundPlay($abspiel, 0)
    $lenght=_SoundLength($abspiel)
    $SoundPos=_SoundPos($abspiel, 1)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    endif
    endif

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _Pause()
    _SoundPause($abspiel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _stop()
    _SoundStop($abspiel)
    $abspiel=""
    $playing=false
    GUICtrlSetData($label2, "00:00:00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func media($sSD, Const $sPat = '', Const $iF = 3)
    Local $sRet = "", $sSubD = '|' & $sSD
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0],0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func start()
    If FileExists(@ScriptDir & "\media.ini") Then
    $var = IniReadSection(@ScriptDir & "\media.ini", "Media")
    If @error Then
    MsgBox(4096, "Error", "Unable to read section.")
    Else
    For $i = 1 To $var[0][0]
    GUICtrlCreateListViewItem($var[$i][1] , $ListView2)
    Next
    EndIf
    Else
    MsgBox(4096, "Medienbibliothek", "Es konnte keine Medienbibliotek geladen werden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    for $p = 1 to $res[0][0]
    guictrlcreatemenuitem($res[$p][1],$Radio)
    next
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _next()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] < (_GUICtrlListView_GetItemCount($listview1) -1) Then
    $sel[1] += 1
    Else
    $sel[1] = 0
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _back()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] > 0 Then
    $sel[1] -= 1
    Else
    $sel[1] = _GUICtrlListView_GetItemCount($listview1) -1
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func playbutton()
    if $test = @ScriptDir & "\play.gif" Then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    Endif
    Endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func pausebutton()
    if $test = @ScriptDir & "\pause.gif" then
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func search()
    $read = guictrlread($Search)
    $text = _GUICtrlListView_FindInText($ListView2, $read)
    $text1 = _GUICtrlListView_EnsureVisible($ListView2, $text)
    _GUICtrlListView_SetItemDropHilited($ListView2, $text1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func addradio()
    $addRadioLink=InputBox("Link hinzufügen", "Geben Sie hier den Link zur Internetradiostation ein:","","",150,130)
    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    iniwrite("Radio.ini", "Stations", "Radio"&$res[0][0] + 1, $addRadioLink)
    Else
    iniwrite("Radio.ini", "Stations", "Radio1", $addRadioLink)
    endif
    EndFunc

    [/autoit]
  • Ich bin der Meinung, dass man AdlibRegister nur einmal aufrufen muss.
    Danach ruft er die Funktion automatisch (auch ohne, dass sie in der while-Schleife vorkommt) nach der eingegebenen Periode auf (bei dir 1000ms).

  • Stimmt du hast recht, danke dir.

    So funktioniert es nun:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.0
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $abspiel,$titel
    $test = @ScriptDir & "\play.gif"

    [/autoit] [autoit][/autoit] [autoit]

    $playing=false

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 610, 225, 209, 315)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    $pic1=GUICtrlCreatePic(@ScriptDir & "\next.gif", 560, 150, 36, 36)
    $pic2=GUICtrlCreatePic(@ScriptDir & "\back.gif", 410, 150, 36, 36)
    $pic3=GUICtrlCreatePic(@ScriptDir & "\stop.gif", 510, 150, 37, 37)
    $ListView1=GUICtrlCreateListView("Song|Pfad", 413, 50, 178, 75)
    $ListView2=GUICtrlCreateListView("Song|Pfad", 20, 50, 350, 135)
    $Search=GUICtrlCreateInput("",20, 17, 250, 20)
    $SearchButton=GUICtrlCreateButton("Suchen", 291, 17, 80, 20)
    GUICtrlSetState($listview1, $GUI_DROPACCEPTED)
    $Menu=GUICtrlCreateMenu("Datei")
    $Menumedia=GUICtrlCreateMenu("Medienbibliothek")
    $MediaAktualisieren=guictrlcreatemenuitem("Medienbiliothek aktualisieren",$Menumedia)
    $Pfad=guictrlcreatemenuitem("Pfad zum Medienordner festlegen",$Menumedia)
    $show=guictrlcreatemenuitem("Pfad zum Medienordner anzeigen",$Menumedia)
    $Beenden=guictrlcreatemenuitem("Beenden",$Menu)
    $Radio=GUICtrlCreateMenu("Internetradio")
    $add=guictrlcreatemenuitem("Link hinzufügen",$Radio)
    guictrlcreatemenuitem("",$Radio)
    $Label=GUICtrlCreateLabel("00:00:00", 412, 1 ,100 ,100)
    $Label1=GUICtrlCreateLabel("Titel", 412, 14 ,150 ,15)
    $Label2=GUICtrlCreateLabel("00:00:00", 412, 27 ,43 ,12)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    start()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_DROPPED
    $ar = _GUICtrlListView_GetSelectedIndices($listview2, True)
    For $i = 1 To $ar[0]
    $sItem = _GUICtrlListView_GetItemTextString($listview2, $ar[$i])
    GUICtrlCreateListViewItem($sItem, $listview1)
    Next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview1, $i, $LVSCW_AUTOSIZE)
    Next
    case $SearchButton
    search()
    case $add
    addradio()
    case $pic2
    _back()
    case $pic1
    _next()
    case $pic3
    _stop()
    pausebutton()
    case $pic
    if $test = @ScriptDir & "\play.gif" Then
    sound()
    if $playing = true then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    else
    _pause()
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    case $beenden
    exit
    case $Pfad
    $MediaPfad=FileSelectFolder("Medienorder auswählen", "")
    IniWrite("config.ini", "Einstellungen","Medienpfad", $MediaPfad)
    case $show
    $mediapfadread = IniRead("config.ini", "Einstellungen","Medienpfad", "")
    MsgBox(0, "Medienordner", "Aktuell ist folgender Medienordner ausgewählt:"&@crlf&@crlf&$mediapfadread)
    case $MediaAktualisieren
    $folder=IniRead("config.ini", "Einstellungen","Medienpfad", "")
    $Result=media($folder, ".+\.mp3", 1)
    FileDelete("media.ini")
    _GUICtrlListView_DeleteAllItems($ListView2)
    for $i = 1 to $result[0]
    $Song1=stringsplit($Result[$i],"\")
    $Song=StringSplit($Song1[$Song1[0]],".")
    GUICtrlCreateListViewItem($Song[1]&"|"&$result[$i] , $ListView2)
    IniWrite("media.ini", "Media", ""&$i&"", $Song[1]&"|"&$result[$i])
    next
    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func _time()
    if $playing = true then
    $soundpos=_SoundPos($abspiel)
    guictrlsetdata($label2,$soundpos)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func sound()
    $SongPlay=_GUICtrlListView_GetItemTextString($Listview1)
    $SongRoot=StringSplit($SongPlay, "|")
    if IsArray($abSpiel) then
    _SoundResume($abspiel)
    else
    $abspiel=_SoundOpen($SongRoot[2])
    if $abspiel="" Then
    Msgbox(4096,"Datei","Es wurde keine Datei ausgewählt")
    else
    $playing=true
    $playsound=_SoundPlay($abspiel, 0)
    $lenght=_SoundLength($abspiel)
    $SoundPos=_SoundPos($abspiel, 1)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    AdlibRegister("_time", 1000)
    endif
    endif

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _Pause()
    _SoundPause($abspiel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _stop()
    _SoundStop($abspiel)
    $abspiel=""
    $playing=false
    GUICtrlSetData($label2, "00:00:00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func media($sSD, Const $sPat = '', Const $iF = 3)
    Local $sRet = "", $sSubD = '|' & $sSD
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0],0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func start()
    If FileExists(@ScriptDir & "\media.ini") Then
    $var = IniReadSection(@ScriptDir & "\media.ini", "Media")
    If @error Then
    MsgBox(4096, "Error", "Unable to read section.")
    Else
    For $i = 1 To $var[0][0]
    GUICtrlCreateListViewItem($var[$i][1] , $ListView2)
    Next
    EndIf
    Else
    MsgBox(4096, "Medienbibliothek", "Es konnte keine Medienbibliotek geladen werden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 1
    _GUICtrlListView_SetColumnWidth($Listview2, $i, $LVSCW_AUTOSIZE)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    for $p = 1 to $res[0][0]
    guictrlcreatemenuitem($res[$p][1],$Radio)
    next
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _next()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] < (_GUICtrlListView_GetItemCount($listview1) -1) Then
    $sel[1] += 1
    Else
    $sel[1] = 0
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _back()
    playbutton()
    Local $sel = _GUICtrlListView_GetSelectedIndices($listview1,True)
    if $sel[1] > 0 Then
    $sel[1] -= 1
    Else
    $sel[1] = _GUICtrlListView_GetItemCount($listview1) -1
    EndIf
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    _GUICtrlListView_SetItemSelected ($ListView1, $sel[1])
    $SongRoot=_GUICtrlListView_GetItemTextArray($Listview1,$sel[1])
    if IsArray($abSpiel) Then _SoundStop($abspiel)
    $abspiel=_SoundOpen($SongRoot[2])
    $playsound=_SoundPlay($abspiel, 0)
    $playing=true
    $lenght=_SoundLength($abspiel)
    GUICtrlSetData($label, $lenght)
    guictrlsetdata($Label1, $SongRoot[1])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func playbutton()
    if $test = @ScriptDir & "\play.gif" Then
    $test = @ScriptDir & "\pause.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    Endif
    Endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func pausebutton()
    if $test = @ScriptDir & "\pause.gif" then
    $test = @ScriptDir & "\play.gif"
    GUICtrlDelete($pic)
    $pic=GUICtrlCreatePic($test, 460, 150, 37, 37)
    endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func search()
    $read = guictrlread($Search)
    $text = _GUICtrlListView_FindInText($ListView2, $read)
    $text1 = _GUICtrlListView_EnsureVisible($ListView2, $text)
    _GUICtrlListView_SetItemDropHilited($ListView2, $text1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func addradio()
    $addRadioLink=InputBox("Link hinzufügen", "Geben Sie hier den Link zur Internetradiostation ein:","","",150,130)
    if FileExists("Radio.ini") then
    $res=IniReadSection("Radio.ini", "Stations")
    iniwrite("Radio.ini", "Stations", "Radio"&$res[0][0] + 1, $addRadioLink)
    Else
    iniwrite("Radio.ini", "Stations", "Radio1", $addRadioLink)
    endif
    EndFunc

    [/autoit]

    Sind noch folgende Fragen offen:
    - Blaue Hinterlegung bei Suche | Bei mehreren gleichen Suchbegriffen weiterspringen bei erneuter Betätigung der "Suchebutton"
    - Nächstes Lied, wenn eines zu Ende ist
    - Denkanstoß für einen Slider der den Liedfortschritt anzeigt sowie Spulen ermöglicht

    Einmal editiert, zuletzt von descent (15. Mai 2010 um 22:47)

  • Hallo descent,

    hier die Suchfunktion:

    [autoit]

    Func search()
    Local $iStart, $aSel = _GUICtrlListView_GetSelectedIndices($ListView2, True)
    If $aSel[0] > 0 Then
    $iStart = $aSel[1]
    Else
    $iStart = -1
    EndIf
    Local $read = GUICtrlRead($Search)
    Local $iFound = _GUICtrlListView_FindInText($ListView2, $read, $iStart, True)
    If $iFound <> -1 Then
    ;ConsoleWrite($iFound & @CRLF)
    _GUICtrlListView_EnsureVisible($ListView2, $iFound)
    _GUICtrlListView_SetItemSelected($ListView2, $iFound)
    EndIf
    EndFunc ;==>search

    [/autoit]

    falls du Adlib umgehen willst kannst du die Anzeige der Spieldauer so in der Schleife machen:

    [autoit]

    While 1
    If $playing = True Then
    $iSoundPos = _SoundPos($abspiel)
    If $iSoundPos <> GUICtrlRead($Label2) Then GUICtrlSetData($Label2, _SoundPos($abspiel))
    EndIf
    ;....
    Wend

    [/autoit]

    du musst dann Zeile 25 so ändern:

    [autoit]

    Global $playing = False, $iSoundPos = 0

    [/autoit]

    mfg (Auto)Bert

  • @ JuraX
    Ich habe bisher noch nicht mit einer Dll gearbeitet. Gibt es dafür womöglich eine Beschreibung, wie das funktioniert und was ich zu beachten habe?

    @ AutoBert
    Vielen Dank für deine Hilfe. Die Suchfunktion mach nun genau das, was ich mir vorgestellt habe. Deine Lösung mit der Abspielzeit funktioniert auch einwandfrei.

    Jedoch tritt bei beiden Lösungswegen ein merkwürdiges Phänomen auf. Seit ich diese Aktualisierung eingefügt habe, egal ob mit einer Schlaufe oder Adlib, verschwindet beim erstmaligen Betätigen des Playbutton der transparente Hintergrund des Pausebutton. Dies tritt auch beim betätigen des Stopbuttons eins. Hier verschwindet die Transparenz des Playbuttons und ein weißer Hintergrund erscheint, welcher bei einer Betätigung wieder verschwindet.

  • Ich hatte mir deine UDF schon angeschaut, bevor ich überhaupt angefangen hatte, einen Musikplayer zu erstellen. Leider bin ich damit aufgrund mangelnder Erfahrung nicht so gut zu recht gekommen. Gibt es für diese UDF auch eine Hilfe wie beispielsweise für die FireFox UDF?

  • Noch nicht, das wichtigste aber mal hier

    Spoiler anzeigen

    Parameter:
    $Dllpath - Der Pfad zu den DLLs mit abschließendem "\"

    $playbutton - Der Playbutton
    $pausebutton - Der Pausebutton
    $stopbutton - Der Stopbutton
    $volumeslider- Der Lautstärkeslider
    $newfilebutton - [optional] Der Button zum öffnen einer neuen Datei (default:"")
    $applicationname - [optional] Der Name der Anwendung (default:@ScriptName)

    Wichtig:
    Der Lautstärkeregler muss die variable $hSlider haben

  • Ich habe mir soeben noch einmal die UDF mit den Bass Sachen heruntergeladen und versucht das Beispiel aus deinem Thread nachzuvollziehen. Ich kann das Script soweit auch ausführen, nur ist ein hinzufügen von .mp3 Dateien nicht möglich.
    Wenn ich den Button "Neue Datei" betätige, eine Datei auswähle und öffne, erscheint diese nicht in der Playlist und ich kann diese auch nicht über den Button Play/Pause ausführen.

    Ist es möglich einen Fortschrittbalken mittels deiner UDF zu erzeugen?

  • Wie ich sehe hängt die UDF mit den Bassscripten zusammen. Da ich aber bisher alles über SoundPlay/Open etc. gemacht habe, werde ich jetzt nicht diese Funktionen verwenden können oder?

  • Habe es nun selbst geschafft, eine Progressbar zu erstellen, welche den Fortschritt im Lied anzeigt. Leider kann ich mit dieser nicht spulen.

    Sind noch folgende Fragen offen:
    - Nächstes Lied, wenn aktuelles zu Ende ist
    - Ist es möglich die Farbe der Menüleiste sowie der Hintergrund der ListView´s zu ändern?
    - Ist es möglich die Anzahl der Fortschrittsbalken einer Progressbar zu ändern?
    - Hintergrundbild :
    Ich habe versuch ein Hintergrundbild einzufügen. Hierbei wurden jedoch einige Objekte teilweise überlagert. Habe das Bild wie folgt eingefügt:

    [autoit]

    $bg = GUICtrlCreatePic("bg.jpg", 0, 0, 0, 0)
    GUIctrlsetState($bg, $GUI_DISABLE)

    [/autoit]


    Was mache ich hier falsch?

    2 Mal editiert, zuletzt von descent (17. Mai 2010 um 16:26)