Informations Media [Résolu]

Signaler
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006
-
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006
-
Salut !



Je suis en train de faire un mini lecteur avec FMOD, sous Windows.

Dans ma classe CLecteur, interface
avec FMOD, je récupère les tags avec FSOUND_Stream_GetTagField, masi
j'ai une erreur 0x0005 qui apparait (violation d'accés)



Voici le code :

bool CLecteur::Recuperation_Informations( INFORMATIONS_PISTE* Infos )

{

int NbChamps = 0;

if( !FSOUND_Stream_GetNumTagFields( Son, &NbChamps ) )

return false;



if( NbChamps == 0 )

return false;



char *Nom_Champ;

int type_tag = 0;

int len = 0;

void* Val_Champ;



memset( &Infos, 0, sizeof(INFORMATIONS_PISTE) );



for( int i=0; i<NbChamps; i++ )

{

FSOUND_Stream_GetTagField(
Son, i, &type_tag, &Nom_Champ, &Val_Champ, &len );



MessageBoxA( NULL, (char*)Val_Champ, "Val Champ", 0 );



// Titre

if( !strcmp(Nom_Champ,"TITLE") )

strncpy( Infos->Titre, (char*)Val_Champ, len );

// Album

if( !strcmp(Nom_Champ,"ALBUM") )

strncpy( Infos->Album, (char*)Val_Champ, len );

// Artiste

if( !strcmp(Nom_Champ,"ARTIST") )

strncpy( Infos->Artiste, (char*)Val_Champ, len );

// Année

if( !strcmp(Nom_Champ,"YEAR") )

strncpy( Infos->Annee, (char*)Val_Champ, len );

// Commentaire

if( !strcmp(Nom_Champ,"COMMENT") )

strncpy( Infos->Commentaires, (char*)Val_Champ, len );

}

return true:

}







La structure d'infos :

struct INFORMATIONS_PISTE

{

char Album[50];

char Artiste[50];

char Titre[50];

char Commentaires[100];

char Annee[5];

char Piste[5];

char Duree[10];

};





J'ai vérifié, le void* Val_Champ renvoie une chaine de caractère
(toujours), mais je ne peux pas utiliser directement char* Val_Champ,
je ne sais pas comment faire



Merci de répondre !

5 réponses

Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

Ca y est, j'ai trouvé !

C'était un pb avec les allocations successives (je pense) et le passage du pointeur sur Retour_Infos en argument



Pour ceux que ça interesse :



bool CLecteur::Recuperation_Informations( INFORMATIONS_PISTE* Retour_Infos )

{

int NbChamps;

char *Nom_Champ;

void *Val_Champ;

int type_tag;

int len;

char Tampon[512];

INFORMATIONS_PISTE Infos;



if( !FSOUND_Stream_GetNumTagFields( Son, &NbChamps ) )

return false;



if( NbChamps == 0 )

return false;



memset( &Infos, 0, sizeof(INFORMATIONS_PISTE) );



for( int i=0; i<NbChamps; i++ )

{

FSOUND_Stream_GetTagField(
Son, i, &type_tag, &Nom_Champ, &Val_Champ, &len );



//MessageBoxA( NULL, (char*)Nom_Champ, "Nom Champ", 0 );



// Titre

if( !strcmp(Nom_Champ,"TITLE") )

strncpy( Infos.Titre, (char*)Val_Champ, len );

// Album

else if( !strcmp(Nom_Champ,"ALBUM") )

strncpy( Infos.Album, (char*)Val_Champ, len );

// Artiste

else if( !strcmp(Nom_Champ,"ARTIST") )

strncpy( Infos.Artiste, (char*)Val_Champ, len );

// Année

else if( !strcmp(Nom_Champ,"YEAR") )

strncpy( Infos.Annee, (char*)Val_Champ, len );

// Commentaire

else if( !strcmp(Nom_Champ,"COMMENT") )

strncpy( Infos.Commentaires, (char*)Val_Champ, len );

/*else

continue;*/



//MessageBoxA( NULL, Tampon, "Val Champ", 0 );

}

memcpy( Retour_Infos, &Infos, sizeof(Infos) );

return true;

}
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Il faut allouer de la memoire !!!! De facon dynamique (malloc) ou pas !
Declare en char*, et caste quand il le faut.

FSOUND_Stream_GetTagField( Son, i, &type_tag, &Nom_Champ, &Val_Champ, &len );

Pour passer Val_Champ en parametre, tu fais soit &Val_champ[0], ou bien Val_champ tout court. Idem pour les autres variables (je parle des tableaux.)

+2(p - n)
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

J'ai essayé de faire un cast; mais j'obtiens toujours la même erreur, en faisant comme ça :



char *Nom_Champ;

char *Val_Champ;

int type_tag = 0;

int len = 0;



memset( &Infos, 0, sizeof(INFORMATIONS_PISTE) );



for( int i=0; i<NbChamps; i++ )

{

FSOUND_Stream_GetTagField( Son, i, &type_tag, &Nom_Champ, (void**)&Val_Champ, &len );

...

}

...



Il ne faut pas allouer la memoire, voici le contenu de l'aide la fonction :



signed char F_API
FSOUND_Stream_GetTagField(
FSOUND_STREAM
*stream,
int num,
int
*type,
char **name,
void
**value,
int *length
);



Parameters


stream,
The stream to get the tag field from.,
----

num,
The number of the tag field to retrieve.,
----

type,
Pointer to a variable that will receive the type of the tag field that was
retrieved. See FSOUND_TAGFIELD_TYPE.,
----

name,
Pointer to a variable that will receive the name of the tag field as a
null-terminated ASCII string.,
----

value,
Pointer to a variable that will receive a pointer to the tag field
data.,
----

length,
Pointer to a variable that will receive the length of the tag field
data.



Do not attempt to modify or free any pointers returned by this function

If this function returns successfully, "value" will contain a pointer to a piece
of tag-field-specific data - do not assume it will always point to a
null-terminated ASCII string.
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

Comme ça non plus, ça ne marche pas :



char *Nom_Champ;

void *Val_Champ;

int type_tag;

int len;



Buffer = new char[2048];



memset( &Infos, 0, sizeof(INFORMATIONS_PISTE) );



for( int i=0; i<NbChamps; i++ )

{

FSOUND_Stream_GetTagField(
Son, i, &type_tag, &Nom_Champ, &Val_Champ, &len );



sprintf( Buffer, "%s", Val_Champ );

//MessageBoxA( NULL, (char*)Val_Champ, "Val Champ", 0 );



// Titre

if( !strcmp(Nom_Champ,"TITLE") )

strncpy( Infos->Titre, (char*)Buffer, len );

......



Buffer étant une variable globale.
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

JE VIENS D'IDENTIFIER L'ERREUR !!!



ça viens de
Infos->Titre et tout ce qui est Infos->, je ne sais pas pourquoi...