Thema: Delphi FMOD: getTag

Einzelnen Beitrag anzeigen

Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

FMOD: getTag

  Alt 14. Apr 2008, 18:05
Hi,

ich weiß, es ist ein Delphi-Forum und ich könnte die Frage viel besser im FMOD-Forum stellen. Aber ich glaube das Problem ist Pascal und nicht FMOD in diesem Fall. Ich möchte die Tags einer Audiodatei (MP3) auslesen. Macht der folgende Code vorallem in Bezug auf die vorher gezeigten Deklarationen und das unten stehende Codebeispiel in C Sinn ? ShowMessage(String(tag.data)) liefert mir grundsätzlich nur die ersten beiden Zeichen. Nehme man sich als Beispiel die Band Celldweller, wird nur Ce ausgegeben (bei Static-X dementsprechend nur St usw.). Dies trifft nicht nur auf den Artisten zu, sondern auf alle Taginformationen.
Delphi-Quellcode:
type
  FMOD_TAGTYPE =
  (
    FMOD_TAGTYPE_UNKNOWN,
    FMOD_TAGTYPE_ID3V1,
    FMOD_TAGTYPE_ID3V2,
    FMOD_TAGTYPE_VORBISCOMMENT,
    FMOD_TAGTYPE_SHOUTCAST,
    FMOD_TAGTYPE_ICECAST,
    FMOD_TAGTYPE_ASF,
    FMOD_TAGTYPE_MIDI,
    FMOD_TAGTYPE_PLAYLIST,
    FMOD_TAGTYPE_FMOD,
    FMOD_TAGTYPE_USER,
    FMOD_TAGTYPE_MAX
  );

  FMOD_TAGDATATYPE =
  (
    FMOD_TAGDATATYPE_BINARY,
    FMOD_TAGDATATYPE_INT,
    FMOD_TAGDATATYPE_FLOAT,
    FMOD_TAGDATATYPE_STRING,
    FMOD_TAGDATATYPE_STRING_UTF16,
    FMOD_TAGDATATYPE_STRING_UTF16BE,
    FMOD_TAGDATATYPE_STRING_UTF8,
    FMOD_TAGDATATYPE_CDTOC
  );

  FMOD_TAG = record
    tagtype: FMOD_TAGTYPE; (* [out] The type of this tag. *)
    datatype: FMOD_TAGDATATYPE; (* [out] The type of data that this tag contains *)
    name: PChar; (* [out] The name of this tag i.e. "TITLE", "ARTIST" etc. *)
    data: Pointer; (* [out] Pointer to the tag data - its format is determined by the datatype member *)
    datalen: Cardinal; (* [out] Length of the data contained in this tag *)
    updated: FMOD_BOOL; (* [out] True if this tag has been updated since last being accessed with FMOD_Sound_GetTag *)
  end;

function FMOD_Sound_GetNumTags(sound: FMOD_SOUND; var numtags: Integer; var numtagsupdated: Integer): FMOD_RESULT; stdcall;
function FMOD_Sound_GetTag(sound: FMOD_SOUND; const name: PChar; index: Integer; var tag: FMOD_TAG): FMOD_RESULT; stdcall;
Delphi-Quellcode:
var fmods : FMOD_SOUND;
    i, numtags, numtagsupdated : Integer;
    tag : FMOD_TAG;
begin
  fmodr := FMOD_System_CreateStream(fmod, PAnsiChar(f), FMOD_DEFAULT, nil, fmods);
  Fehler;

  fmodr := FMOD_Sound_GetNumTags(fmods, numtags, numtagsupdated);
  Fehler;

  for i := 0 to Pred(numtags) do
  begin
    fmodr := FMOD_Sound_GetTag(fmods, nil, i, tag);
    Fehler;

    if tag.datatype = FMOD_TAGDATATYPE_STRING then
      ShowMessage(String(tag.data));
  end;

  FMOD_Sound_Release(fmods);
Auszug aus dem bei FMODEx mitgelieferten Beispiel namens Readtags, von welchem ich die nötigen Zeilen oben übersetzt habe:
Code:
int main(int argc, char *argv[])
{
    FMOD_SYSTEM    *system;
    FMOD_SOUND     *sound;
    FMOD_RESULT     result;
    FMOD_TAG        tag;
    int             numtags, numtagsupdated, count;
    unsigned int    version;

    // ...

    /*
        Read all the tags regardless of whether they're updated or not. Also show the tag type.
    */
    result = FMOD_Sound_GetNumTags(sound, &numtags, &numtagsupdated);
    ERRCHECK(result);
    for (count=0; count < numtags; count++)
    {
        result = FMOD_Sound_GetTag(sound, 0, count, &tag);
        ERRCHECK(result);

        if (tag.datatype == FMOD_TAGDATATYPE_STRING)
        {
            printf("%s = %s (%d bytes)\n", tag.name, tag.data, tag.datalen);
        }
        else
        {
            printf("%s = ??? (%d bytes)\n", tag.name, tag.datalen);
        }
    }
  Mit Zitat antworten Zitat