Forum: Mikrocontroller und Digitale Elektronik Zufallswiedergabe für MP3-Player


von Johannes (menschenskind)


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

von Rainer U. (r-u)


Lesenswert?

Wie lautet denn Deine Frage?

Zufall ist so wie beim Würfel. Da kommen Zahlen schonmal mehrmals vor.. 
:-)

von Johannes (menschenskind)


Lesenswert?

>Wie lautet denn Deine Frage?

Na das soll doch wohl ein Scherz sein, oder?! Scherz lass nach!

Ich habe laut gedacht, dies aufgeschrieben und ihr sollt euch nun 
darüber hermachen.
Genau das hatte ich in der Frage formuliert.

So und jetzt das Ganze nochmal :)

von holger (Gast)


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.

von Rainer U. (r-u)


Lesenswert?

Es sollte kein Scherz sein, aber vielleicht funktioniert Deine 
Vorgehensweise ja und alle stürzen sich auf dieses Thema.. bin gespannt! 
:-)

von Johannes (menschenskind)


Lesenswert?

Sorry Rainer, aber was ist denn an meiner Frage so missdeutbar?

von Tony R. (tony)


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...

von Johannes (menschenskind)


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.

von holger (Gast)


Lesenswert?

>Geht das denn, dass ich nach dem Zählen ein Feld mit der Anzahl der
>Dateien deklariere?

Wenn dein Speicher groß genug ist geht das.
Für jede Datei aber nur EIN Kreuz, äh Bit;)

von Johannes (menschenskind)


Lesenswert?

Kann ich denn ein Feld erstellen, das als Elemente wirklich nur jeweils 
einzelne Bits enthält?

von Andi (Gast)


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

von Volker S. (volkerschulz)


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

von Johannes (menschenskind)


Lesenswert?

Das Problem, was sich aber gerade auftat ist nämlich:
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?

von holger (Gast)


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()

von Volker S. (volkerschulz)


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

von Johannes (menschenskind)


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.

von Malte _. (malte) Benutzerseite


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.

von Tobi (Gast)


Lesenswert?

Würde ich nicht machen

von Johannes (menschenskind)


Lesenswert?

Ich präsentiere: die wahrscheinlich längste Praline..ääähh...kürzeste 
Antwort seit es uC.net gibt.
Der Preis geht an Tobi! Herzlichen Glückwunsch.

Du darfst wohl am Tag eine bestimmte Anzahl getippter Zeichen nicht 
überschreiten, wie? :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.