IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Problème FmodEx CallBack avec mon composant


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Points : 57
    Points
    57
    Par défaut Problème FmodEx CallBack avec mon composant
    Bonsoir

    Je suis nouveau et j'aurai besoin d'un coups de main à propos d'un petit problème avec fmodex et un composant que je construis.

    Je vous explique le tout. Je développe une application et il y a beaucoup de code un peu partout. J'ai décidé de construire un composant pour fmod pour réduire mes pertes de temps.

    J'ai un problème avec les callbacks de fmodex.

    J'ai une classe défini comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    type
     
    TOnEnd = procedure(Sender:TObject) of Object;
     
    TFmodPlayer = class (TComponent)
    private
    FOnEnd:TOnEnd;
    published
    property OnEnd:TOnEnd read FOnEnd write FOnEnd;
    end;
     
     
    implementation
     
    function OnChannelCallBack(channel: Pointer; callbacktype: FMOD_CHANNEL_CALLBACKTYPE; commanddata1: Word; commanddata2: Word):FMOD_RESULT;stdcall;
    begin
      case callbacktype of
      FMOD_CHANNEL_CALLBACKTYPE_END:showmessage('');
      end;
      Result:=FMOD_OK;
    end;
     
    procedure TFmodPlayer.Play;
    begin
    FRESULT:=Fmod_System_CreateStream(FSYSTEM,PAnsiChar(FFile),FMOD_UNICODE,NIL,FSOUND);
    ON_FMOD_ERROR(FRESULT);
    FRESULT:=Fmod_System_PlaySound(FSYSTEM,FMOD_CHANNEL_FREE,FSOUND,false,FCHANNEL);
    ON_FMOD_ERROR(FRESULT);
    FRESULT:=FMOD_Channel_SetCallback(FCHANNEL,OnChannelCallBack);
    ON_FMOD_ERROR(FRESULT);
    end;
    Je vous explique le problème maintenant. Le callback fonctionne mais j'aurai aimé remplacé le showmessage('') par ce qu'il y a dans l'évènement OnEnd.
    J'ai alors voulu placer la procédure OnChannelCallBack dans ma classe mais j'obtiens le message d'erreur suivant :

    Types incompatibles : 'procédure normale et pointeur de méthode'

    Je voudrai remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FMOD_CHANNEL_CALLBACKTYPE_END:showmessage('');
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FMOD_CHANNEL_CALLBACKTYPE_END:if assigned(FOnEnd) then FOnEnd(Self);
    J'espère qu'on pourra m'aider
    Merci

    NB: désolé si je me suis gourré dans l'endroit ou je post

  2. #2
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    salut,
    Comme pour les threads créés par BeginThread ou CreateThread depuis une classe, la fonction Callback ne peut pas être une méthode de classe. Par contre, laisse la telle qu'elle est et essaye de passer (Self) dans le paramètre Channel de cette dernière.

    Dans la méthode Play, tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TFmodPlayer.Play;
    begin
    FRESULT:=Fmod_System_CreateStream(FSYSTEM,PAnsiChar(FFile),FMOD_UNICODE,NIL,FSOUND);
    ON_FMOD_ERROR(FRESULT);
    FRESULT:=Fmod_System_PlaySound(FSYSTEM,FMOD_CHANNEL_FREE,FSOUND,false,FCHANNEL);
    ON_FMOD_ERROR(FRESULT);
    FRESULT:=FMOD_Channel_SetCallback(Self,OnChannelCallBack);
    ON_FMOD_ERROR(FRESULT);
    end;
    Dans la fonction Callback:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function OnChannelCallBack(channel: Pointer; callbacktype: FMOD_CHANNEL_CALLBACKTYPE; commanddata1: Word; commanddata2: Word):FMOD_RESULT;stdcall;
    var Obj: TFmodPlayer;
    begin
      Obj:= TFmodPlayer(Channel);
      with Obj do
       case callbacktype of
        FMOD_CHANNEL_CALLBACKTYPE_END: if assigned(FOnEnd) then FOnEnd(Obj)
       end;
     // FCHANNEL est accessible via Obj.fChannel (s'il s'agit bien d'un membre de la classe TFmodPlayer
      Result:=FMOD_OK;
    end;
    J'ai pas essayé, mais je pense que ça va marcher

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Points : 57
    Points
    57
    Par défaut
    Salut,

    J'ai suivi tes modifications et j'ai bien réussi à compiler sauf que:
    fmodex me renvoyait une erreur comme quoi self était un paramètre invalide.

    Mais ton code m'a permi de me mettre sur la piste.
    J'ai déclarer une variable FOwner:TComponent à l'extèrieur de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Constructor TFmodPlayer.Create(AOwner: TComponent);
    begin
    FOwner:=self;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function OnChannelCallBack(channel: Pointer; callbacktype: FMOD_CHANNEL_CALLBACKTYPE; commanddata1: Word; commanddata2: Word):FMOD_RESULT;stdcall;
    var Obj: TFmodPlayer;
    begin
    Obj:= TFmodPlayer(FOwner);
    with Obj do
    case callbacktype of
    FMOD_CHANNEL_CALLBACKTYPE_END:if assigned(FOnEnd) then FOnEnd(FOwner)
    end;
    Result:=FMOD_OK;
    end;
    En tout cas ca marche parfaitement maintenant. Mais je suis pas sur que ca soit bien propre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB2] Problème de connection avec mon premier EJB..
    Par gelinp dans le forum Java EE
    Réponses: 7
    Dernier message: 02/05/2007, 18h06
  2. Problème de rapidité avec mon pc
    Par Ganak dans le forum Windows XP
    Réponses: 8
    Dernier message: 05/12/2006, 15h11
  3. Problème d'affichage avec mon BBCode
    Par magic33 dans le forum Langage
    Réponses: 4
    Dernier message: 01/05/2006, 17h30
  4. Problème de syntaxe avec le composant TCppWebBrowser
    Par Ptite Développeuse dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/04/2006, 16h48
  5. Problème d'affichage avec le composant JTable
    Par vidocq dans le forum Composants
    Réponses: 2
    Dernier message: 03/04/2006, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo