Forum: Mikrocontroller und Digitale Elektronik Mehrere Sounddateien mit ATmega


von Sven W. (sven_w18)


Lesenswert?

Hallo !

Ich habe einen ATmega168 so programmiert, dass dieser Sounddateien von 
einer SD-Karte liest und über PWM ausgibt.

Mein Problem ist, dass zwischen den einzelnen Sound-Tracks eine kurze 
Pause entsteht.

Hat jemand eine Idee???


Ich benutze das Filesystem von Roland Riegel. Kann ich damit irgendwie 
mehrere Dateien gleichzeitig öffnen?

von Ralf (Gast)


Lesenswert?

> Hat jemand eine Idee???
Hmmm... Entweder ein Gesamtlied machen oder kurz vor Erreichen des Endes 
vom aktuellen Lied das nächste in nem Buffer bereits zwischenspeichern.

Ralf

von Sven W. (sven_w18)


Lesenswert?

Gesamtlied geht nicht, da die Reihenfolge nicht immer gleich ist, d.h. 
von Aussen mit Tastern beeinflusst wird. Und das in den Buffer laden 
setzt voraus, dass ich mehrere Dateien gleichzeitig öffnen kann. Was 
bisher nicht funktioniert.


Ist es Möglich mehrere Dateien zu öffnen indem ich dieses hier ändere?:

fat16_config.h
#define FAT16_FILE_COUNT 1   --> z.B. in 5

und anstatt im Programm dann

fat16_close_file(x);

einfach

fat16_seek_file(x, &file_pos, FAT16_SEEK_SET);


Geht das ???? Macht das Sinn ?

von Karl H. (kbuchegg)


Lesenswert?

Sven W. schrieb:

> Ist es Möglich mehrere Dateien zu öffnen indem ich dieses hier ändere?:
>
> fat16_config.h
> #define FAT16_FILE_COUNT 1   --> z.B. in 5

sieht wohl so aus

> und anstatt im Programm dann
>
> fat16_close_file(x);
>
> einfach
>
> fat16_seek_file(x, &file_pos, FAT16_SEEK_SET);
>
>
> Geht das ???? Macht das Sinn ?

Nein,
das macht keinen Sinn.

Wenn du mehrere Files öffnen willst, dann wäre wohl fat_open_file bzw. 
fat_close_file der logische Ansatzpunkt.

http://www.roland-riegel.de/sd-reader/doc/fat_8h.html

von Sven W. (sven_w18)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn du mehrere Files öffnen willst, dann wäre wohl fat_open_file bzw.
>
> fat_close_file der logische Ansatzpunkt.
>
>
>
> http://www.roland-riegel.de/sd-reader/doc/fat_8h.html

OK. Das mit fat_open_file bzw. fat_close_file war schon klar.
Mit fat16_seek_file(x, &file_pos, FAT16_SEEK_SET); wollte ich auch nur 
den Pointer wieder auf den Anfang der Datei setzen, um diese ggf. 
nochmals abspielen zu können.

Gibt es eine Begrenzung für die Anzahl der geöffneten Dateien ?

Und kann ich irgendwie alle auf einmal schließen ?

von Karl H. (kbuchegg)


Lesenswert?

Sven W. schrieb:
> Karl Heinz Buchegger schrieb:
>> Wenn du mehrere Files öffnen willst, dann wäre wohl fat_open_file bzw.
>>
>> fat_close_file der logische Ansatzpunkt.
>>
>>
>>
>> http://www.roland-riegel.de/sd-reader/doc/fat_8h.html
>
> OK. Das mit fat_open_file bzw. fat_close_file war schon klar.
> Mit fat16_seek_file(x, &file_pos, FAT16_SEEK_SET); wollte ich auch nur
> den Pointer wieder auf den Anfang der Datei setzen, um diese ggf.
> nochmals abspielen zu können.

Wenn du eine Datei schliesst und wieder öffnest, wird sie sowieso von 
Anfang an abgespielt.

> Gibt es eine Begrenzung für die Anzahl der geöffneten Dateien ?

Musst du die Doku lesen. Aber das von dir angeführte #define klingt doch 
schon mal nicht schlecht. An deiner Stelle, würde ich mir mal im Source 
Code ansehen, wozu dieses #define benutzt wird. Du hast ja den Source 
Code, da darf man ruhig hineinschauen.

> Und kann ich irgendwie alle auf einmal schließen ?

Du musst doch sowieso über alle vom System angeforderten File-Handles 
Buch führen.

Irgendwie hab ich den Eindruck, du erwartest da etwas zu viel vom 
File-System. Ein File-System ist normalerweise eine einfache Sache:
Du öffnest ein File und kriegst einen 'Handle' zurück. Dieser Handle 
repräsentiert in weitere Folge das File. Bei jedem Write, bei jedem 
Read, bei jedem Close, bei jeder Operation auf dem File identifiziert 
dieser Handle, welches der geöffneten Files gemeint ist.
Mehr steckt da nicht dahinter. Und daher musst du dir selbstverständlich 
auch dieses Handle aufheben.

von Sven W. (sven_w18)


Lesenswert?

Erstmal Danke für die Antworten...


Karl Heinz Buchegger schrieb:
> Wenn du eine Datei schliesst und wieder öffnest, wird sie sowieso von
>
> Anfang an abgespielt.

Aber genau das Schließen und wieder Öffnen will ich ja vermeiden. Ich 
denke, dass das diese Pause zwischen den Tracks ausmacht.


>
>> Gibt es eine Begrenzung für die Anzahl der geöffneten Dateien ?
>
>
>
> Musst du die Doku lesen. Aber das von dir angeführte #define klingt doch
>
> schon mal nicht schlecht. An deiner Stelle, würde ich mir mal im Source
>
> Code ansehen, wozu dieses #define benutzt wird. Du hast ja den Source
>
> Code, da darf man ruhig hineinschauen.

Es sollte passen:
1
...
2
/**
3
 * \ingroup fat_config
4
 * Maximum number of file handles.
5
 */
6
#define FAT_FILE_COUNT 1
7
...


>
>> Und kann ich irgendwie alle auf einmal schließen ?
>
>
>
> Du musst doch sowieso über alle vom System angeforderten File-Handles
>
> Buch führen.
>

Ist soweit klar, wenn das Programm ein Ende hat und ich nicht wie 
beschrieben, eigendlich alle Dateien geöffnet halten will.

von Karl H. (kbuchegg)


Lesenswert?

Sven W. schrieb:
> Erstmal Danke für die Antworten...
>
>
> Karl Heinz Buchegger schrieb:
>> Wenn du eine Datei schliesst und wieder öffnest, wird sie sowieso von
>>
>> Anfang an abgespielt.
>
> Aber genau das Schließen und wieder Öffnen will ich ja vermeiden. Ich
> denke, dass das diese Pause zwischen den Tracks ausmacht.

Ich hab dich immer noch nicht.
Da gibt es doch noch einen Buffer (eine FIFO) dazwischen. Du liest aus 
einem File und stellst das Gelesene erst mal in einen Zwischenbuffer, 
von wo aus es dann an die Soundausgabe geht.

Dieser Buffer ist groß genug, dass er die Pause überbrücken kann, die 
das Filesystem braucht um das nächste File zu öffnen. D.h. während sich 
das SD-System damit abmüht, das File zu finden, düdelt im Hintergrund 
(Interrupt?) das Soundsystem vor sich hin. Das File wird nicht erst dann 
geöffnet, wenn das vorhergehende Lied komplett abgespielt wurde, sondern 
wenn das vorhergehende komplett gelesen wurde. Das ist nicht dasselbe, 
denn wenn die letzten Daten vom vorhergehenden File gelesen sind, sind 
sie ja noch nicht abgespielt worden. Du hast also hier deine Zeitreserve 
um das nächste File zu öffnen und die ersten Daten zu lesen, während 
noch das letzte File abgespielt wird.

von Sven W. (sven_w18)


Lesenswert?

Hm, das mit dem Buffer ist zu überlegen...
Das könnte mir die nötige Zeit verschaffen.

Momentan werden die Daten direkt von SD in den Timer geladen.

Danke für den Tipp!

Jetzt muss ich nur noch grübeln, wie ich diesen Zwischenschritt über den 
Buffer einbaue...

von Harald (Gast)


Lesenswert?

Vielleicht mal ein paar Projekte zum Vergleich, evtl. Kann man daraus 
Erkenntnisse ziehen:

http://elm-chan.org/he_a_e.html

Z.B. Portable PCM Player

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.