Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi FMOD: getTag (https://www.delphipraxis.net/112067-fmod-gettag.html)

Nils_13 14. Apr 2008 18:05


FMOD: getTag
 
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);
        }
    }

Nils_13 18. Apr 2008 20:46

Re: FMOD: getTag
 
Bearbeiten geht nicht mehr, also einfach eine neue Nachricht....

StrPas anstelle vom String-Cast ist die Lösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz