Seite 1 von 1

Erledigt: Frage zu Pointern/Speicher

Verfasst: Sa 24. Jun 2006, 15:20
von Elle4u
Hallo zusammen,

ich habe da irgendwie mal wieder ein Problemchen :wink: .

Ich lese den Header der MP3s so aus:

Code: Alles auswählen

openedFile = TAP_Hdd_Fopen(pItem->File.name);
if (openedFile) {
	TAP_Hdd_Fseek(openedFile, -128, SEEK_END);
	TAP_Hdd_Fread(TAG, 3, 1, openedFile);
	TAG[3] = 0;
	if (!strcmp(TAG, "TAG")) {
		TAP_Hdd_Fread(pItem->songTitle, sizeof(pItem->songTitle), 1, openedFile);
		TAP_Hdd_Fread(pItem->songInterpreter, sizeof(pItem->songInterpreter), 1, openedFile);
		TAP_Hdd_Fread(pItem->songAlbum, sizeof(pItem->songAlbum), 1, openedFile);
		TAP_Hdd_Fread(pItem->songYear, sizeof(pItem->songYear), 1, openedFile);

		TAP_Print("%s\n", pItem->songTitle);
		TAP_Print("%s\n", pItem->songInterpreter);
		TAP_Print("%s\n", pItem->songAlbum);
		TAP_Print("%s\n\n", pItem->songYear);
	}
	TAP_Hdd_Fclose(openedFile);
}
Wenn ich mir nur mit TAP_Print den Inhalt anzeigen lasse, dann steht in songTitle:

Code: Alles auswählen

Das Spiel [Radiomix]          Annett Louisan                Boheme          2004Datum: 03.02.2005 11:27 Uhr
in songInterpreter:

Code: Alles auswählen

Annett Louisan                Boheme                        2004Datum: 03.02.2005 11:27 Uhr
in songAlbum:

Code: Alles auswählen

Boheme                        2004Datum: 03.02.2005 11:27 Uhr
und in songYear:

Code: Alles auswählen

2004Datum: 03.02.2005 11:27 Uhr
Wie ihr seht steht immer noch der Inhalt der folgenden Variablen mit drin :( .

Und in Year steht noch das Feld "Datum" (welches im Anschluß kommt).

pItem ist * auf tItem:

Code: Alles auswählen

typedef struct {
	TYPE_File File;
	int status;
	bool bVideo;
	bool bAudio;
	bool bText;
	bool bDeleted;
	dword dwFiles;
	dword dwSubDir;
	char ServiceName[24];
	char EventName[64];
	char EventDescription[64];
	word duration;
	dword LastBlock;
	char songTitle[30];
	char songInterpreter[30];
	char songAlbum[30];
	char songYear[4];
	char cDate[64];
	char cSize[30];
} tItem;
Könnt ihr mir sagen, woran das liegt und wie ich das beheben kann, daß in songTitle auch nur der Title ist?

DANKE!

Verfasst: Sa 24. Jun 2006, 15:53
von Happy
Hallo,

bei den Tags besteht keine Sicherheit, dass sie nullterminiert sind.
Sieht man schon daran, dass das Jahr 4-stellig ist und auch 4stellig im Tag definiert ist. Also ist gar kein Platz für einen Nullterminator.
Du solltest also deinen Struct so definieren, dass auch noch ein Nullterminator zusätzlich Platz hat.

Wenn dann das letzte Zeichen kein Leerzeichen ist, dann mach das nächste Zeichen (z.B. pItem->songTitle[30] ) zum Nullterminator. Ansonsten lies jeweils zurück und schneide auch noch Leerzeichen ab.
Vergiss nicht die Ausdrücke sizeof(pItem->songTitle) usw. durch die jeweilige Konstante, in diesem Fall 30, zu ersetzen.

Gruß,
Happy

Verfasst: Sa 24. Jun 2006, 16:00
von Elle4u
Also erhöhe ich im Struct alles um 1:

Code: Alles auswählen

char songTitle[31];
char songInterpreter[31];
char songAlbum[31];
char songYear[5];
Und beim Einlesen dann fest die original-Größe:

Code: Alles auswählen

TAP_Hdd_Fread(pItem->songTitle, 30, 1, openedFile);
TAP_Hdd_Fread(pItem->songInterpreter, 30, 1, openedFile);
TAP_Hdd_Fread(pItem->songAlbum, 30, 1, openedFile);
TAP_Hdd_Fread(pItem->songYear, 4, 1, openedFile);
Richtig?

Verfasst: Sa 24. Jun 2006, 16:05
von Elle4u
Danke!

Funktioniert!!! :hello: :hello: :hello:

Verfasst: Sa 24. Jun 2006, 16:30
von Elle4u
Noch eine Frage (paßt zwar nicht ganz zum Thema):

Steht irgendwo im MP3 wie lange die Spieldauer ist?
Konnte in den Spezifikationen nichts finden...

Verfasst: Sa 24. Jun 2006, 16:38
von Sigittarius-E
:thinker: steht die bitrate im header? dann kann man sich's ja über die Filegröße ausrechnen.

Verfasst: Sa 24. Jun 2006, 16:42
von Elle4u
Sigittarius-E hat geschrieben: :thinker: steht die bitrate im header? dann kann man sich's ja über die Filegröße ausrechnen.
Nicht, daß ich wüßte...

Verfasst: Sa 24. Jun 2006, 16:44
von Bonni
Elle4u hat geschrieben:Noch eine Frage (paßt zwar nicht ganz zum Thema):

Steht irgendwo im MP3 wie lange die Spieldauer ist?
Konnte in den Spezifikationen nichts finden...

Auch nicht bei http://www.id3.org/ ?

Verfasst: Sa 24. Jun 2006, 16:47
von Sigittarius-E
Bonni hat geschrieben:Kennst Du http://www.id3.org/ ? Da gibt's alle Spezifikationen, z.B http://www.id3.org/id3v2.4.0-frames.txt
da war ich gerade. Glaubte zuerst es ist eine Domain die zum Kauf angeboten wird :eek:

Edit: Sorry, Bonni. Jetzt hab ich deine 1. AW vor dem Edit gequotet.

Verfasst: Sa 24. Jun 2006, 17:06
von Bonni
Sigittarius-E hat geschrieben:Edit: Sorry, Bonni. Jetzt hab ich deine 1. AW vor dem Edit gequotet.
Macht ja nix, ich hatte editiert, nach dem ich Elle4u noch mal genau gelesen hatte :wink:

Verfasst: Sa 24. Jun 2006, 17:39
von Elle4u
Bonni hat geschrieben:Auch nicht bei http://www.id3.org/ ?
Da war ich schon kam aber nicht mit klar...

Ich werde mir das nochmal anschauen. Ist erstmal nicht so wichtig...

Danke!

Verfasst: Sa 24. Jun 2006, 17:51
von Bonni
Wenn die Spezifikationen da richtig verstehe (braucht echt Einarbeitung!) geht das erst mit V2.4.0...

Verfasst: Sa 24. Jun 2006, 17:55
von Elle4u
Bonni hat geschrieben:Wenn die Spezifikationen da richtig verstehe (braucht echt Einarbeitung!) geht das erst mit V2.4.0...
OK. Danke.

Der Topf kann von sich aus eh nur V1 :(

Verfasst: Sa 24. Jun 2006, 20:25
von Happy
Elle4u hat geschrieben:Noch eine Frage (paßt zwar nicht ganz zum Thema):

Steht irgendwo im MP3 wie lange die Spieldauer ist?
Konnte in den Spezifikationen nichts finden...
Bei Version 2 gibt es einen Tag dafür, aber es nocht mal sicher, dass dieser auch immer geschrieben wird, da es kein Pflichttag ist.

Die Bitrate steht im Header jedes MP3-Frames. Geht man von konstanter Bitrate aus, braucht man nur den ersten Frame zu lesen.
Ich verwende vor allem MP3s mit variabler Bitrate, da müßte man dann schon alle Frames anschauen, oder zumindest eine hinreichend große Zahl zum hochrechnen.

Gruß,
Happy

Verfasst: Sa 24. Jun 2006, 20:27
von Elle4u
Danke Happy.

Dann laß ich es erstmal :D

Verfasst: Sa 24. Jun 2006, 20:40
von Sigittarius-E
Happy hat geschrieben: Ich verwende vor allem MP3s mit variabler Bitrate
Wußte gar nicht daß es VBR auch bei MP3 gibt. Unterstützen das alle Player?

Verfasst: Sa 24. Jun 2006, 23:49
von Wheeljack
Sigittarius-E hat geschrieben:Wußte gar nicht daß es VBR auch bei MP3 gibt. Unterstützen das alle Player?
Als Besitzer eines der ersten MP3-Player (ein Diamond RIO), kann ich nur sagen: darauf funzt VBR auch. Bloß die die Anzeige zeigt völlig falsche Werte an.
Das ist natürlich keine wirkliche Antwort auf die Frage... keine Ahnung was spätere Player-Hersteller verzapft haben. Der Topfield hat ja auch so seine Probleme mit speziellen MP3s. Vor allem mit Mono-Dateien mein ich.

Verfasst: So 25. Jun 2006, 00:01
von Bonni
Wheeljack hat geschrieben:Der Topfield hat ja auch so seine Probleme mit speziellen MP3s. Vor allem mit Mono-Dateien mein ich.
Naja, ehrlich gesagt ist der Topf ja auch nicht als mp3-Spieler konzipiert. Seh ich halt als Goodie, dass er das überhaupt kann, und deswegen nehm ich ihm das auch nicht krumm, wenn mal eine Datei nicht klappt...

Verfasst: Mo 26. Jun 2006, 09:53
von Sigittarius-E
Bonni hat geschrieben:Naja, ehrlich gesagt ist der Topf ja auch nicht als mp3-Spieler konzipiert. Seh ich halt als Goodie, dass er das überhaupt kann, und deswegen nehm ich ihm das auch nicht krumm, wenn mal eine Datei nicht klappt...
So sehe ich es auch. Nett, gelegentlich ein paar MP3s abzuspielen.