Hallo.
Ich habe gestern angefangen einen kleinen Musikplayer zu schreiben.
Dabei wird ein Treeview mit allen Ordnern im gleichen Verzeichnis erstellt (auch Unterordner). Eine Listview zeigt die Dateien im ausgewählten Ordner.
Um mp3-Dateien abzuspielen verwende ich die Sound.au3.
Allerdings lassen sich nicht alle mp3-Lieder von mir öffnen, bei vielen kommt der MCI Openerror. Liegt das am Codec, an der Bitrate?
Ein zweites Problem ist, dass generell eine falsche Gesamtzeit der Lieder angezeigt wird.
Beispiel: Madcon - Freaky like me -> geht in Wirklichkeit 3 Min und 9 Sek, _SoundGetLength spuckt aber 3 Min und 12 Sekunden aus. Bei anderen Liedern liegt AutoIt um über eine Minute daneben...
Hier ist das Script:
Spoiler anzeigen
Dim $vMExt = "*.mp3", $vOldSelectedFolder, $vPath
Dim $vSound
#include <GUIListView.au3>
#Include <GuiTreeView.au3>
#Include <Sound.au3>
$hGUI = GUICreate("Musikplayer", 600, 400)
$hFolderList = GUICtrlCreateTreeView(0, 0, 200, 400)
$hFolderListHandle = GUICtrlGetHandle($hFolderList)
$hFileList = GUICtrlCreateListView("Name|Titel|Interpret|Album", 200, 0, 400, 370)
$hFileListHandle = GUICtrlGetHandle($hFileList)
_GUICtrlListView_SetColumnWidth($hFileListHandle, 0, 200)
$hGUIButtonPlayPause = GUICtrlCreateButton("Play", 205, 372, 50)
$hGUIButtonStop = GUICtrlCreateButton("Stop", 260, 372, 50)
$hGUILabelPos = GUICtrlCreateLabel("", 350, 375, 100, 15)
GUISetState()
CreateFolderTreeView($hFolderList)
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg($hGUI)
Case -3
_SoundClose($vSound)
Exit
Case $hGUIButtonPlayPause
If GUICtrlRead($hGUIButtonPlayPause) = "Pause" Then
_SoundPause($vSound)
GUICtrlSetData($hGUIButtonPlayPause, "Play")
Else
If _SoundResume($vSound) = 0 Then
$vSound = _SoundOpen($vPath & "\" & _GUICtrlListView_GetItemText($hFileListHandle, _GUICtrlListView_GetSelectedIndices($hFileListHandle), 0))
If $vSound = 0 Then
MsgBox(16, "Datei kann nicht wiedergegeben werden", "Die ausgewählte Datei kann nicht widergegeben werden.")
Else
_SoundResume($vSound)
GUICtrlSetData($hGUIButtonPlayPause, "Pause")
EndIf
$vSoundLength = _SoundLength($vSound)
Else
GUICtrlSetData($hGUIButtonPlayPause, "Pause")
EndIf
EndIf
Case $hGUIButtonStop
_SoundClose($vSound)
If GUICtrlRead($hGUIButtonPlayPause) <> "Play" Then GUICtrlSetData($hGUIButtonPlayPause, "Play")
EndSwitch
If GUICtrlRead($hGUIButtonPlayPause) = "Pause" Then
$vPos = _SoundPos($vSound) & " - " & $vSoundLength
If GUICtrlRead($hGUILabelPos) <> $vPos Then GUICtrlSetData($hGUILabelPos, $vPos)
EndIf
_RefreshPlayList()
WEnd
Func _RefreshPlayList()
$vSelectedFolder = GUICtrlRead($hFolderList)
If $vSelectedFolder <> $vOldSelectedFolder Then
$vOldSelectedFolder = $vSelectedFolder
$vPath = GUICtrlRead($vSelectedFolder, 1)
$vCurrentFolder = $vSelectedFolder
While 1
$vParentID = _GUICtrlTreeView_GetParentParam($hFolderList, $vCurrentFolder)
If $vParentID = False Then ExitLoop
$vPath = GUICtrlRead($vParentID, 1) & "\" & $vPath
$vCurrentFolder = $vParentID
WEnd
;List Files
_GUICtrlListView_DeleteAllItems($hFileListHandle)
$hSearch = FileFindFirstFile($vPath & "\" & $vMExt)
While 1
$vFileFound = FileFindNextFile($hSearch)
If @error = 1 Then ExitLoop
GUICtrlCreateListViewItem($vFileFound, $hFileList)
WEnd
FileClose($hSearch)
EndIf
EndFunc
;$h_TreeView = id of treeview
;$v_Folder = the folder to scan, leave it empty if you wanna scan the scriptdir
Func CreateFolderTreeView($h_TreeView, $v_Folder = "")
If $v_Folder <> "" And StringRight($v_Folder, 1) <> "\" Then $v_Folder &= "\"
$hSearch = FileFindFirstFile($v_Folder & "*")
While 1
$vFolderFound = FileFindNextFile($hSearch)
If @error = 1 Then ExitLoop
If FileGetAttrib($v_Folder & $vFolderFound) = "D" Then
$vDirInfo = DirGetSize($v_Folder & $vFolderFound, 1)
$vSubItem = GUICtrlCreateTreeViewItem($vFolderFound, $h_TreeView)
If IsArray($vDirInfo) And $vDirInfo[2] >= 1 Then CreateFolderTreeView($vSubItem, $v_Folder & $vFolderFound)
EndIf
WEnd
FileClose($hSearch)
EndFunc
Ich danke für jede Hilfe.