Ich möchte einen Player für Musikdateien schreiben und stoße dabei auf 2 Probleme.
1. Die Dateien eines Ordners sollen der Reihe nach gespielt werden (Klassische Musik...) und sind mit Track 1.wav, Track 2.wav usw. benannt. Liest man sie mit For each aus, wird aber zuerst Track 10 gespielt. Die Filenames in ein Array zu stopfen und es zu sortieren, hilft nix - auch dann wird alfabetisch sortiert.
Als Lösung fand ich, die Filenames in ein ListView zu schreiben und dieses zu sortieren. Dann stehen sie zwar richtig drin, können aber nur mit MoveFirst/MoveNext richtig ausgelesen werden, weil der Index ja gleich bleibt. Weiß jemand eine bessere/einfachere Lösung?
2. Es braucht eine Schleife, um alle files abzuspielen, und die darf erst weitermachen, wenn ein file fertig abgespielt ist. Der folgende Code beginnt nur dann Track 1 zu spielen, wenn die While-Schleife auskommentiert ist - MIT ihr beginnt er mit Track 10, dem letzten. Das bedeutet wohl, dass die Schleife voll durchläuft und erst dann zu spielen beginnt? gbHandbuch zu MoveNext: "Returns TRUE if there is no child item left." Was funktioniert da nicht, das MoveNext oder das Music.Stopped?
Vielen Dank schon mal für eure Antworten!
Verwendete Komponenten: gb.media, gb.sdl2.audio
gambas code
Public Sub PLAY_Click() Dim FIL As String ' File zum abspielen Dim PFA As String ' Kompletter Pfad Dim N As String ' IndexNr Dim I As Integer = 1 For Each FIL In Dir(ORD) ' Public Ordner vom DirChooser If FIL Ends "wav" Or FIL Ends "mp3" Or FIL Ends "ogg" Then N = CStr(I) LV.Add(N, FIL) ' Alle files in ListView schreiben I = I + 1 Endif Next LV.Sorted = True ' ListView sortieren LV.MoveFirst While LV.MoveNext() = False ' lt. Handbuch FIL = CString(LV.Item.Text) PFA = ORD &/ FIL ' Pfad + Filename LB.Text = "Playing " & FIL ' Label anzeigen Music.Load(PFA) Music.Play Wait If Music.Stopped = 0 Then LV.MoveNext() ' Etwas davon funktioniert nicht Wend End