Seite 1 von 1

Speicherverletzung bei Tag abrufen mit FMODex..

Verfasst: 27.04.2006 10:01
von Arrag0n
Hallo
Könnt Ihr mir bitte helfen? Habe begonnen mit FMODex einen kleinen Player zu schreiben. Abspielen usw funktioniert sehr gut, jedoch beim abrufen des TAG's bekomme ich alle paar Titel eine Speicherverletzung. :( :( :(
Hier die Strucktur für den Tagabruf:

Code: Alles auswählen

Structure strucFMOD_TAG
  FMOD_TAGTYPE.l
  FMOD_TAGDATATYPE.l
  TAG_Name.s
  TAG_Data.s
  TAG_Datalen.l
  FMOD_BOOL.b
EndStructure
Hier die Funktion zum abrufen des Tags:

Code: Alles auswählen

Procedure.b FMOD_GetTag(*pointTAG.structFTag, Plsound.l)
  Protected NumTags.l, NumTagsUp.l, TagOK.b, TagI.strucFMOD_TAG
  TagOK = 0
  Result = FMOD_Sound_GetNumTags(Plsound, @NumTags, @NumTagsUp)
  FMOD_ErrCheck(Result)
  If Result = #FMOD_OK  
    If NumTags > 0
      Result = FMOD_Sound_GetTagByIndex(Plsound, 0, 0, @TagI)
      FMOD_ErrCheck(Result)
      Select TagI\FMOD_TAGTYPE
        Case #FMOD_TAGTYPE_ID3V1           ;/ mp3
          
        Case #FMOD_TAGTYPE_ID3V2           ;/ mp3
          
        Case #FMOD_TAGTYPE_ASF             ;/ Windows Media
          For a = 0 To NumTags -1
            Result = FMOD_Sound_GetTagByIndex(Plsound, 0, a, @TagI)
            If TagI\TAG_Name = "TITLE"
              *pointTAG\Title = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "AUTHOR"
              *pointTAG\Artist = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "WM/AlbumTitle"
              *pointTAG\AlbumTitle = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "WM/AlbumArtist"
              *pointTAG\AlbumArtist = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "WM/Year"
              *pointTAG\Release = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "WM/Genre"
              *pointTAG\Genre = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "COMMENT"
              *pointTAG\Comment = TagI\TAG_Data
            ElseIf TagI\TAG_Name = "WM/TrackNumber"
              *pointTAG\NumberOnAlbum = Val(TagI\TAG_Data)
            EndIf
          Next a
          TagOK = 1
          
        Case #FMOD_TAGTYPE_VORBISCOMMENT   ;/ flac, ogg
          
      EndSelect
    EndIf
  EndIf
  Testtxt$ = "Titel " + *pointTAG\Title + #crlf
  Testtxt$ + "Interpret " + *pointTAG\Artist + #crlf
  Testtxt$ + "Albumtitel " + *pointTAG\AlbumTitle + #crlf
  Testtxt$ + "Jahr " + *pointTAG\Release + #crlf
  Testtxt$ + "Musikrichtung " + *pointTAG\Genre + #crlf
  Testtxt$ + "Kommentar " + *pointTAG\Comment + #crlf
  Testtxt$ + "Titelnummer " + Str(*pointTAG\NumberOnAlbum) + #crlf
  ;MessageRequester(#Caption, Testtxt$)
  ProcedureReturn TagOK
EndProcedure
und hier die Funktion zum aufruf der .dll

Code: Alles auswählen

ProcedureDLL.l FMOD_Sound_GetTagByIndex(a.l,b.l,c.l,d.l)
  ProcedureReturn CallFunctionFast(FMOD_Sound_GetTag,a,b,c,d)
EndProcedure
Hoffe von euch hat jemand eine Lösung...

Verfasst: 27.04.2006 16:26
von SoS
Ich hatte mal das selbe Problem und es lag nicht am Tags-auslesen.

Füge folgenden Code in die 1.zeile ein

Code: Alles auswählen

Procedure OnError() 
  Protected Msg$ 
  
  Msg$ = "There was an error:"+Chr(13)+Chr(10)+Chr(13)+Chr(10) 
  Msg$ + "Description: " + GetErrorDescription()+Chr(13)+Chr(10) 
  Msg$ + "Addr: " + Str(GetErrorAddress())+Chr(13)+Chr(10) 
  Msg$ + "Module: "+GetErrorModuleName()+Chr(13)+Chr(10) 
  Msg$ + "LineNR: " + Str(GetErrorLineNR())+Chr(13)+Chr(10) 
  Msg$ + "Total number of errors: "+Str(GetErrorCounter())+Chr(13)+Chr(10)+Chr(13)+Chr(10) 
  Msg$ + "Continue program ?" 
  SetClipboardText(Msg$) 
  
  If MessageRequester("Error!",Msg$,16|#PB_MessageRequester_YesNo) = 6 
    ProcedureReturn #True 
  Else 
    End 
  EndIf 
EndProcedure 

OnErrorGosub(@OnError())
und compiliere mit onerror-unterstützung.So bekommst Du schon mal die Zeilennummer wo der Fehler auftritt.

2. Tip
Nutze die Fehlerauswertung so oft wie möglich.

Hier mal kurzes Beispiel von mir

Code: Alles auswählen

IncludeFile "myfmodex.pb" 

tag.FMOD_TAG 
system.l 
sound.l 
file.s 
suchtag.s 

If Not FMod_ERRCHECK ( FMOD_System_Create(@system)) 
  
  If Not FMod_ERRCHECK ( FMOD_System_Init(system, 32, #FMOD_INIT_NORMAL, 0)) 
    
    file=OpenFileRequester("MP3","","FMOD - MP3 | *.MP3",0) 
    
    If file 
      
      If Not FMod_ERRCHECK ( FMOD_System_CreateSound(system,@file , #FMOD_SOFTWARE | #FMOD_2D | #FMOD_CreateSTREAM | #FMOD_OPENONLY,0, @sound)) 
        
        suchtag="TIT2" 
        tag\Data=0 
        If Not FMod_ERRCHECK(FMOD_Sound_GetTag(sound,suchtag , 0, @tag)) And tag\Data 
          Debug PeekS(tag\Data) ; ID3V2 Tag 
        Else 
          suchtag="TITLE" 
          tag\Data=0 
          If Not FMod_ERRCHECK(FMOD_Sound_GetTag(sound,suchtag , 0, @tag)) And tag\Data 
            Debug PeekS(tag\Data) ; ID3V1 Tag 
          EndIf 
        Else 
          Debug "keine Tag-daten" 
        EndIf 
        
        FMOD_Sound_Release(sound) 
        
      EndIf 
      
    EndIf 
    
  EndIf 
  
  FMOD_System_Release(system) 
  
EndIf 
Das dazugehörende (nicht ganz fehlerlose ;) ) include http://people.freenet.de/n83u13/fmodex/myfmodex.zip

Verfasst: 28.04.2006 09:06
von Arrag0n
@SOS

Vielen Dank, das hat mir sehr geholfen!!

Das ist ein Beispiel für perfekte Hilfe! :allright: :allright:

Grüße Arrag0n