Re: tags des fichiers audio
Publié : dim. 20/juin/2010 21:12
Sans avoir testé le code, essaye Bin(TagTailleBin)
Code : Tout sélectionner
Procedure BinVal(a$); - Convert a String in binary-format in numeric value
a$=Trim(UCase(a$))
If Asc(a$)='%'
a$=Trim(Mid(a$,2,Len(a$)-1))
EndIf
Result=0
*adr.Byte=@a$
For i=1 To Len(a$)
Result<<1
Select *adr\b
Case '0'
Case '1':Result+1
Default:i=Len(a$)
EndSelect
*adr+1
Next
ProcedureReturn Result
EndProcedure
Comment ça ???la fonction marche et donne une valeur qui est un peu plus grande que le tag mais jamais plus petite et jamais dans le chant
Bah, c'est normalplutot que de me casser la tete a changer le tag, j'ai pese a l'effacer et le reecrire
le probleme est que je perd l'image
Code : Tout sélectionner
; ****
; **** Lecture Frame APIC En-tête ID3v2
; **** Auteur : Boddhi
; ****
EnableExplicit
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseJPEG2000ImageDecoder()
Enumeration ; Fenêtres
#FENETRE
EndEnumeration
Enumeration ; Gadgets
#TitCpMP3
#CpMP3
#TitDescription
#CpDescription
#TitType
#CpType
#ImgAPIC
EndEnumeration
Enumeration ; Images
#Image1
EndEnumeration
Procedure.f Fc_MinF(ArgNombre1.f,ArgNombre2.f)
If ArgNombre1>ArgNombre2:ProcedureReturn ArgNombre2:Else:ProcedureReturn ArgNombre1:EndIf
EndProcedure
Procedure.s Fc_TypeImage(ArgTypeImage.i)
Define.s Chaine
Select ArgTypeImage
Case $00:Chaine="Autre"
Case $01:Chaine="Icône PNG 32x32"
Case $02:Chaine="Autre fichier icône"
Case $03:Chaine="Jaquette avant"
Case $04:Chaine="Jaquette arrière"
Case $05:Chaine="Feuillet intérieur"
Case $06:Chaine="Média"
Case $07:Chaine="Soliste/Responsable graphique" ; Lead artist/Lead performer/soloist
Case $08:Chaine="Artiste/Interprète"
Case $09:Chaine="Chef d'orchestre"
Case $0A:Chaine="Groupe/Orchestre"
Case $0B:Chaine="Compositeur"
Case $0C:Chaine="Parolier"
Case $0D:Chaine="Lieu d'enregistrement"
Case $0E:Chaine="Durée d'enregistrement"
Case $0F:Chaine="Durée du concert"
Case $10:Chaine="Capture vidéo"
Case $11:Chaine="Poisson coloré lumineux" ; => ???? => Sont fous ces anglo-saxons !!!
Case $12:Chaine="Illustration"
Case $13:Chaine="Logo artiste/groupe"
Case $14:Chaine="Logo studio/maison d'édition"
Default:Chaine="Type inconnu"
EndSelect
ProcedureReturn Chaine
EndProcedure
Procedure.i Fc_LireFrameAPIC(ArgNofichier.i,ArgNomFichier.s)
Define.i Position ; Position 0 du tag APIC dans le fichier
Define.i TagTaille,TagFlag,TailleChaine,Resultat,NoImage,TailleMemImage,TailleImageX,TailleImageY
Define.b Unicode,TagTypeAPIC
Define.i *Tampon
Define.s TagNom,TagDescAPIC,TagDescImage
Define.f Ratio
Position=Loc(ArgNofichier)
; **** Lecture En-tête Tag ****
*Tampon=AllocateMemory(10)
ReadData(ArgNofichier,*Tampon,10)
TagNom=PeekS(*Tampon,4,#PB_Ascii)
If UCase(TagNom)<>"APIC"
Resultat=#False
Goto Fc_LireFrameAPIC_Fin
EndIf
TagTaille=PeekL(*Tampon+4)
TagTaille=((TagTaille&$FF)<<24)+((TagTaille&$FF00)<<8)+((TagTaille&$FF0000)>>8)+((TagTaille>>24)&$FF)
TagFlag=PeekB(*Tampon+8)<<8+PeekB(*Tampon+9)
FreeMemory(*Tampon)
; Lecture Description Image
Unicode=ReadByte(ArgNofichier)
Position=Loc(ArgNofichier)
*Tampon=AllocateMemory(64)
ReadData(ArgNofichier,*Tampon,64)
TagDescAPIC=PeekS(*Tampon,64*(Unicode+1),#PB_Ascii+Unicode)
If TagDescAPIC="-->"
TagTypeAPIC=0
TagDescImage="Lien URL"
; ==> Code à compléter => J'ai jamais eu un type de genre sous la main pour tester
Else
Position+Len(TagDescAPIC)*(Unicode+1)+1
FileSeek(ArgNofichier,Position)
TagTypeAPIC=ReadByte(ArgNofichier)&$FF
TagDescImage=Fc_TypeImage(TagTypeAPIC)
; Capture Image
Position+2
FileSeek(ArgNofichier,Position)
FreeMemory(*Tampon)
TailleMemImage=TagTaille;-Position
*Tampon=AllocateMemory(TagTaille)
ReadData(ArgNofichier,*Tampon,TagTaille)
Resultat=CatchImage(NoImage,*Tampon,TagTaille,#PB_Image_DisplayFormat)
If Resultat
If OpenWindow(#FENETRE,220,0,410,479,"APIC",#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#FENETRE))
TextGadget(#TitCpMP3, 16, 20, 68, 20, "Fichier MP3")
StringGadget(#CpMP3, 96, 20, 300, 20, ArgNomFichier, #PB_String_ReadOnly)
TextGadget(#TitDescription, 16, 52, 64, 20, "Description")
StringGadget(#CpDescription, 96, 52, 300, 20, TagDescAPIC, #PB_String_ReadOnly)
TextGadget(#TitType, 16, 84, 64, 20, "Type")
StringGadget(#CpType, 96, 84, 300, 20, TagDescImage, #PB_String_ReadOnly)
TailleImageX=ImageWidth(NoImage)
TailleImageY=ImageHeight(NoImage)
If TailleImageX>300 Or TailleImageY>300
Ratio=Fc_MinF(300/TailleImageX,300/TailleImageY)
TailleImageX=TailleImageX*Ratio:TailleImageY=TailleImageY*Ratio
ResizeImage(NoImage,TailleImageX,TailleImageY)
EndIf
ImageGadget(#ImgAPIC, 56, 132, 300,300,ImageID(#Image1),#PB_Image_Border)
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
EndIf
EndIf
EndIf
Fc_LireFrameAPIC_Fin:
FreeMemory(*Tampon)
ProcedureReturn Resultat
EndProcedure
Fc_LireFrameAPIC(NoFichier,"Ici : Nom du fichier déjà ouvert et fileseek() sur le début du Tag APIC !!!!")