mikrocontroller.net

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


Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rainer Unsinn (r-u)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie lautet denn Deine Frage?

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

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer Unsinn (r-u)
Datum:

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

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Rainer, aber was ist denn an meiner Frage so missdeutbar?

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Johannes H. (menschenskind)
Datum:

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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 (Youtube-Video "mp3 stream client with AVR and LCD") 
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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde ich nicht machen

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.