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

C Discussion :

Pointeur de données d'un fichier en ressource


Sujet :

C

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut Pointeur de données d'un fichier en ressource
    Bonjour,

    Pour les programmes Windows avec des lib comme SDL et FMOD, j'utilise un fichier de ressource .rc (dans le but d'inclure un maximum de fichiers dans l'exécutable).
    J'ai réalisé une fonction (voir code ci-dessous) pour charger une surface SDL à partir d'une ressource fichier image.

    Je voudrais pouvoir le faire aussi pour les ressources audio.
    Je cherche à faire une fonction qui me donne un pointeur de data à partir de la ressource afin par exemple de l'utiliser dans la fonction FMOD :
    FSOUND_STREAM *FSOUND_Stream_Open(pData, FSOUND_LOADMEMORY, 0, 0);
    Je n'ai pas réussi et je recherche des indications, merci.

    Voici la fonction pour SDL :
    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
    SDL_Surface *Rsc2surf(LPCTSTR hID)  // retourne une surface à partir d'une ressource
    {
        SDL_Surface *surface;
        SDL_Surface *temp;
        HMODULE hExe;
        HRSRC hResInfo;
        DWORD taille = 0;
        HGLOBAL hMem;
        void *pData;
        SDL_RWops *rw;
        hExe = GetModuleHandle(NULL);
        hResInfo = FindResource(hExe, hID, "RT_RCDATA");
        taille = SizeofResource(hExe, hResInfo);
        hMem = LoadResource(hExe, hResInfo);
        pData = LockResource(hMem);
        rw = SDL_RWFromMem(pData, taille);
        temp = SDL_LoadBMP_RW(rw,0);
        SDL_FreeRW(rw);
        surface = SDL_DisplayFormat(temp);
        SDL_FreeSurface(temp);
        return surface;
    }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Bonjour,

    Pour lire un fichier son en ressource avec FMOD j'ai essayé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FSOUND_STREAM *stream = NULL;
        DWORD tab;
        LPVOID ptr=&tab;
        Rsc2ptr("WV3", ptr);
        stream = FSOUND_Stream_Open(ptr, FSOUND_LOADMEMORY, 0, 0);
        if (stream != NULL)
            {
                printf(" ouvert");
                FSOUND_Stream_Play(FSOUND_FREE, stream);
            }
    avec la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Rsc2ptr(LPCTSTR hID, DWORD* ptr)
    {
        HMODULE hMod = GetModuleHandle(NULL);
        HRSRC   hRes = FindResource(hMod, hID, "RT_RCDATA");
        DWORD taille = SizeofResource(hMod, hRes);
        //printf("%u",taille);  // =>  OK = 8418596
        HGLOBAL hExe = LoadResource(hMod, hRes);
        LPVOID  *pExe = LockResource(hExe);
        ptr=malloc(taille*sizeof(DWORD));
        memcpy(ptr,pExe,taille);
        FreeResource(pExe);
        return;
    }
    Ce code compile, il ne plante pas mais il ne marche pas non plus !
    (la fonction récupère bien la taille de mon fichier en ressource (.rc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 ICON "MSico.ico"
    CB RT_BITMAP "cb.bmp"
    WV3 RT_RCDATA "boule.wav"
    Pouvez-vous m'aider? merci

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Avec des recherches sur MSDN et des forums j'ai réussi à faire une fonction (mon 1er post) qui marche pour les fichiers images : elle retourne une surface SDL.

    Pour les fichiers audio, je voulais faire une fonction qui retourne un stream FMOD. Je n'y suis pas arrivé.
    Mais ce n'est peut être pas la bonne solution : cela prend de la mémoire si le fichier est volumineux, je me dis que le fichier existe déjà dans l’exécutable, ne peut_on pas le lire à partir de son emplacement ?

    Il existe dans FMOD une fonction "FSOUND_Stream_OpenFromHandle" malheureusement elle ne fonctionne que pour XBOX , pas sur Windows.
    Quelqu'un à une idée ?

    PS : pour la taille avec DWORD, c'est une erreur de débutant.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    OpenFromMemory est bien la fonction à utiliser, mais pourquoi dupliquer la ressource au lieu de simplement la garder chargée et lockée?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Pour exploiter un stream avec FMOD, je pense que je dois utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FSOUND_STREAM * F_API FSOUND_Stream_Open(
    const char *name_or_data,
    unsigned int mode,
    int offset,
    int length
    );
    avec name_or_data : Name of the file to open, or pointer to data if FSOUND_LOADMEMORY is used.

    Comment passer de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPVOID  *pExe = LockResource(hExe);
    vers ce paramètre name_or_data ?

    Et (question spécifique FMOD) lorsque l'on utilise un pointeur vers les données : ces données sont-elles le fichier lui_même ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Déjà, appelle-le hWav au lieu de hExe. Ensuite, oui, normalement le pointeur retourné par LockResource() pointe sur une copie du fichier boule.wav en mémoire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Le code ci-dessous (0 warning) ne marche pas :
    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
        HMODULE hMod = GetModuleHandle(NULL);
        HRSRC   hRes = FindResource(hMod, "WV3", "RT_RCDATA");
        //DWORD taille = SizeofResource(hMod, hRes);
        //printf("%u",taille);  // =>  OK = 8418596
        HGLOBAL hGlo = LoadResource(hMod, hRes);
        //LPVOID  *pWav = LockResource(hGlo);
     
        FSOUND_STREAM *stream = NULL;
        //stream = FSOUND_Stream_Open("boule.wav", 0, 0, 0);
        stream = FSOUND_Stream_Open(hGlo, FSOUND_LOADMEMORY, 0, 0);
        if (stream != NULL)
            {
                printf(" stream ouvert \n");
                FSOUND_Stream_Play(FSOUND_FREE, stream);
            }
    Si j'insère la ligne 6 et remplace hGlo par pWav j'ai un warning et cela ne fonctionne pas non plus (avec ou sans le flag FSOUND_LOADMEMORY dans les 2 cas).
    Cela fait un moment que je tourne la dessus sans succès.

    Mais je pense que la fonction FSOUND_Stream_Open ne permet peut être pas d'ouvrir un fichier en mémoire ?
    J'ai cherché, je n'ai pas trouvé suffisamment de doc. sur ce point.
    Qu'en penses-tu ?
    Y a t-il moyen de lui donner un nom de fichier "virtuel" depuis la mémoire et non depuis le disque ?
    Autre solution ?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Je ne connais pas vraiment FMOD, mais ça devrait pourtant marcher avec la ligne 6. Quel warning obtiens-tu?

    Aussi, c'est LPVOID ou void*, mais pas LPVOID *.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Aussi, c'est LPVOID ou void*
    Effectivement, dans les 2 cas je n'ai plus de warning.

    Mais cela ne marche pas, cela ne plante pas mais le stream reste NULL.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Apparemment, le dernier paramètre de FSOUND_Stream_Open() doit être le résultat du SizeofResource().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    OK,
    J'ai le même résultat avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        HMODULE hMod = GetModuleHandle(NULL);
        HRSRC   hRes = FindResource(hMod, "WV3", "RT_RCDATA");
        DWORD taille = SizeofResource(hMod, hRes);
        //printf("%u",taille);  // =>  OK = 8418596
        HGLOBAL hGlo = LoadResource(hMod, hRes);
        void  *pWav = LockResource(hGlo);
     
        FSOUND_STREAM *stream = NULL;
        //stream = FSOUND_Stream_Open("boule.wav", 0, 0, 0);
        stream = FSOUND_Stream_Open(pWav, 0, 0, taille);

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    On dirait que tu as oublié le FSOUND_LOADMEMORY cette fois-ci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Yes

    (à force d'essayer diverses choses , j'ai négligé mes acquis de départ)

    Merci beaucoup pour ton support

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

Discussions similaires

  1. [Fichier] Récupérer donnée d'un fichier
    Par johnlehardos dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 11/05/2004, 13h42
  2. [Struts]Fichier de ressource
    Par Ho(c)ine. dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/04/2004, 14h10
  3. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  4. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53
  5. Temps d'accès à des données dans un fichier
    Par TONIAPEL dans le forum Assembleur
    Réponses: 5
    Dernier message: 28/09/2003, 15h21

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