Zufallswiedergabe für MP3-Player

OP #1569656
Lesenswert?

Hallo

In einem Laufwerk mit FAT-Struktur gibt es ja eine Liste des 
Ordnerinhalts. Und hoffentlich auch eine Indexnummer dieser Einträge.
Dann könnte man es ja so machen, dass man mittels einer Zufallsanweisung 
eine Indexnummer generiert und den korrespondierenden Titel dann 
abspielt.
Dann muss ich aber noch irgendwie dafür sorgen, dass der gespielte Titel 
in eine "Blacklist" wandert, damit er natürlich nicht 2x abgespielt 
wird.

Habt ihr da andere Ideen/Ansätze für diese Problematik?

Dankeschön
Gast #1569708
Lesenswert?

>In einem Laufwerk mit FAT-Struktur gibt es ja eine Liste des
>Ordnerinhalts. Und hoffentlich auch eine Indexnummer dieser Einträge.

Nö, gibt es nicht. Die Einträge stehen einfach nur hintereinander.
Also immer vom Anfang des Verzeichnisses nach Dateien suchen
und Index selber mitzählen. LFN (LongFileName) Einträge und Directory
Einträge sollte man da natürlich nicht mitzählen. Sonst gehts daneben.
#1569772
Lesenswert?

Ich habe sowas selber auch schon implementiert. Folgendermaßen vorgehen:
1. MP3s im Ordner/Root zählen.
2. File abspielen und Nummer merken.
3. Neu würfeln, wenns die gemerkte ist weiterwürfeln.

So wird vermieden, dass dieselbe zwei mal hintereinander kommt. Wenns 
mehrere Files werden sollen, würde ich für jede Filenummer ein Bit in 
ein paar Bytes setzen. Das müsste der effizienteste Weg sein...
OP #1572558
Lesenswert?

Hallo Tajas,

Aber das Problem ist ja, wenn ich mir die Nummer merken will, dann muss 
ich die ja irgendwo abspeichern.
Problematisch, da ich ja erst nach dem Zählen weiß, wie viele MP3s auf 
meiner SD-Karte sind.
Geht das denn, dass ich nach dem Zählen ein Feld mit der Anzahl der 
Dateien deklariere? Das würde ja dann mitten im Programm geschehen und 
nicht am Anfang.
Gast #1573136
Lesenswert?

Deklariere doch einfach ein Array von z.B. 16 Elementen, und merk dir 
darin die 16 zuletzt gespielten Nummern. Jede neue Zufallszahl 
vergleichst du dann mit den 16 Einträgen, und würfelst neu, wenn sie 
schon vorhanden ist. So wird der gleiche Titel frühestens nach etwa 1 
Stunde wiederholt.

Andi
#1573354
Lesenswert?

Tajas R. schrieb:
> Ich habe sowas selber auch schon implementiert. Folgendermaßen vorgehen:
> 1. MP3s im Ordner/Root zählen.
> 2. File abspielen und Nummer merken.
> 3. Neu würfeln, wenns die gemerkte ist weiterwürfeln.
>
> So wird vermieden, dass dieselbe zwei mal hintereinander kommt. Wenns
> mehrere Files werden sollen, würde ich für jede Filenummer ein Bit in
> ein paar Bytes setzen. Das müsste der effizienteste Weg sein...

Effizient wohl kaum... Werden die ungespielten Files weniger, wuerfelt 
der sich ja im Zweifel tot! ;)

Im Allgemeinen sucht man eine Zufallszahl X zwischen 1 und Anzahl 
ungespielter Titel und nimmt dann das X-te ungespielte Lied.

Volker
Gast #1579416
Lesenswert?

>Der Compiler meckert rum, wenn ich die Felddeklaration im Hauptprogramm
>mache.
>Geht aber gar nicht anders, da ja erst die Anzahl der nötigen
>Feldelemente ermittelt werden muss :(
>
>Habt ihr da ne Idee, wie ich das zum Laufen bekomme?

malloc()
#1579440
Lesenswert?

holger schrieb:
>>Der Compiler meckert rum, wenn ich die Felddeklaration im Hauptprogramm
>>mache.
>>Geht aber gar nicht anders, da ja erst die Anzahl der nötigen
>>Feldelemente ermittelt werden muss :(
>>
>>Habt ihr da ne Idee, wie ich das zum Laufen bekomme?
>
> malloc()

... und ich haette erstmal gefragt, in welcher Sprache auf welcher 
Plattform er da ueberhaupt was programmiert... ;)

Volker
OP #1651851
Lesenswert?

Folgende Idee:

Ich erstelle vor dem Abspielen einfach eine zufällige Liste, die dann 
zum Abspielen genutzt wird.
Zum Erstellen dieser Liste muss ich natürlich aus der Menge der 
MP3-Files sukzessive eins auswählen und diesen Index in die 
Wiedergabeliste packen.
Danach verkleinere ich die Liste der noch übrig gebliebenen Dateien in 
dem ich die entstandene "Lücke" schließe. Somit wird dieses Feld 
schrittweise kleiner und jede Zufallszahl, die ich danach neu aus dem 
Pool der ungespielten Dateinen generiere trifft dann natürlich auch eine 
ungespielte Datei.
Somit umgehe ich theoretisch das Problem, dass die Suchzeit stark 
ansteigt, wenn die Zahl der ungespielten Titel abnimmt.

Gebt bitte mal eure Meinung dazu ab.
Persönliche Seite #1651865
Lesenswert?

Funktionieren würde es. Aber ich vermute mal, dass das ganze auf einem 
Mikrocontroller laufen soll? Dann dauerts erstmal ein wenig die Liste 
aufzubauen und es muss genügend Speicher für die Liste vorhanden sein.

Ich habs bei meinem Player (http://www.youtube.com/watch?v=N-m6TGZMfso) 
so gelöst, dass ich jeder Datei eine fortlaufende 16 Bit Nummer zuordne. 
Damit ist auch die Dateianzahl bekannt. (dauert auch am Anfang ein paar 
Sekunden und die Zuordnung braucht ein paar KB RAM) Bei der 
Zufallswiedergabe habe ich eine Liste der letzten 10 gespielten Dateien 
und wenn eine Nummer aus der Liste getroffen wird, wird (bis zu 10x) 
nochmal neu eine Zufällige Nummer genommen. Das verhindert zwar 
doppeltes Abspielen nicht, reduziert es aber soweit dass es mich nicht 
mehr stört.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren