1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 228
    Points : 11 648
    Points
    11 648
    Billets dans le blog
    5

    Par défaut Jouer un son sans retard lorsque le son est joué pour la première fois

    Bonjour !

    Je voudrais intégrer un son dans un jeu (sous Windows). Le son est chargé depuis un fichier WAV.

    J'ai d'abord essayé la fonction PlaySound de l'unité MMSystem. Le problème est que la première fois que le son est joué, il y a un délai entre l'événement et le moment où le son est effectivement joué. La longueur de ce délai varie d'une exécution à l'autre. Quelquefois le délai est presque imperceptible, quelquefois c'est vraiment gênant.

    Alors je me suis tourné vers la bibliothèque BASS. Résultat : même phénomène. J'ai posé la question sur le forum consacré à cette bibliothèque. On m'a proposé des modifications à mon code mais aucune n'a résolu le problème et finalement mon interlocuteur, qui paraît pourtant maîtriser son sujet, m'a dit qu'il ne savait pas d'où venait le problème !

    Avez-vous une expérience ou des idées sur le sujet ? Pouvez-vous me confirmer que ce problème existe et n'est pas une hallucination de ma part ? Connaissez-vous une bibliothèque qui permettrait de faire ce que je souhaite ?

    Je joins mon projet dans son état actuel, au cas où quelqu'un voudrait faire des essais. Attention, le projet utilise les bibliothèques BGRABitmap et BASS.

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 051
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 051
    Points : 9 877
    Points
    9 877

    Par défaut

    Bonsoir,

    Citation Envoyé par Roland Chastain Voir le message
    Le son est chargé depuis un fichier WAV.
    et il faut donc le temps de le charger, pour qu'il soit ensuite joué.
    Pour les autres lectures il doit être pris dans un cache (le genre de chose à laquelle nous n'avons pas accès) et ça va beaucoup plus vite pour y accéder.

    La solution que je tenterais (non, je n'ai pas téléchargé ton .zip) serait de mettre le fichier en mémoire au lancement du programme (dans un stream ? Et appeler le lecteur en lui passant le stream ?)

    Et si ça ralentit le lancement du programme (tu ne nous dis rien de ce fichier son, particulièrement sa taille), déléguer son chargement à un thread secondaire.

    Mes 2 cts,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 228
    Points : 11 648
    Points
    11 648
    Billets dans le blog
    5

    Par défaut

    @Jipété

    Merci pour ta réponse. Je me rends bien compte qu'il faut charger le son avant de le jouer, et c'est d'ailleurs ce que fait le code que j'ai posté.

    Il se trouve que j'ai résolu le problème en remplaçant BASS.DLL par la dernière version, sur le conseil qui m'avait été donné dans l'autre forum. La raison de la différence entre les deux versions restera un mystère.

    Bonne soirée !

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 228
    Points : 11 648
    Points
    11 648
    Billets dans le blog
    5

    Par défaut

    Au cas où cela intéresserait quelqu'un, voici le code que j'utilise. Il y a deux versions, qui fonctionnent pareillement. On m'a dit qu'il pouvait être préférable d'utiliser un sample plutôt qu'un stream, si le son devait être joué de nombreuses fois. Ne m'en demandez pas plus !

    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
    33
    34
    35
    36
     
    unit sound1;
     
    {$MODE objfpc}{$H+}
     
    interface
     
    type
      TSnakeSound = (ssEat, ssDie, ssHighScore);
     
    procedure Play(const aSound: TSnakeSound);
     
    implementation
     
    uses
      SysUtils, Bass;
     
    var
      stream1: HSTREAM;
     
    procedure Play(const aSound: TSnakeSound);
    begin
      case aSound of
        ssEat:
          BASS_ChannelPlay(stream1, FALSE);
        ssDie:;
        ssHighScore:;
      end;
    end;
     
    initialization
      BASS_Init(-1, 44100, 0, {Handle}0, nil);
      stream1 := BASS_StreamCreateFile(FALSE, pchar('sfx_coin_double5.wav'), 0, 0, 0);
    finalization
      BASS_Free;
    end.
    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
    33
    34
    35
    36
     
    unit sound2;
     
    {$MODE objfpc}{$H+}
     
    interface
     
    type
      TSnakeSound = (ssEat, ssDie, ssHighScore);
     
    procedure Play(const aSound: TSnakeSound);
     
    implementation
     
    uses
      SysUtils, Bass;
     
    var
      sample1: HSAMPLE;
     
    procedure Play(const aSound: TSnakeSound);
    begin
      case aSound of
        ssEat:
          BASS_ChannelPlay(BASS_SampleGetChannel(sample1, FALSE), FALSE);
        ssDie:;
        ssHighScore:;
      end;
    end;
     
    initialization
      BASS_Init(-1, 44100, 0, {Handle}0, nil);
      sample1 := BASS_SampleLoad(FALSE, pchar('sfx_coin_double5.wav'), 0, 0, 1, 0);
    finalization
      BASS_Free;
    end.

  5. #5
    Membre chevronné
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 756
    Points : 1 797
    Points
    1 797
    Billets dans le blog
    2

    Par défaut

    Bonjour,
    Vu que tu as réglé ton problème. Petite question, pourquoi ne pas utiliser OpenAL plutôt que BASS ? Ton programme marcherait également sous Unix. Si jamais fais-moi signe : j'ai tout le code qu'il faut pour OpenAL (formats supportés wav, mp3 et ogg). Sinon jette un œil pour un code plus simple et un peu moins complet que le mien.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 228
    Points : 11 648
    Points
    11 648
    Billets dans le blog
    5

    Par défaut

    @BeanzMaster

    Oui, ça m'intéresse, pour ce projet-là ou pour un autre. J'avais essayé le code présenté sur cette page : ça fonctionnait bien mais ça m'avait paru un peu compliqué.

    Si tu as un exemple d'utilisation, je suis preneur.

  7. #7
    Membre chevronné
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 756
    Points : 1 797
    Points
    1 797
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Roland Chastain Voir le message
    @BeanzMaster

    Oui, ça m'intéresse, pour ce projet-là ou pour un autre. J'avais essayé le code présenté sur cette page : ça fonctionnait bien mais ça m'avait paru un peu compliqué.

    Si tu as un exemple d'utilisation, je suis preneur.
    Oui effectivement, c'est un peu long pour gérer toutes les possibilités d'OpenAl (c'est comme avec OpenGL). Je joint le zip de OpenALSoundManager qui est beaucoup plus simple que mes sources comme je le disais. Il y a un exemple d'utilisation fournis avec. Mais suivant si tu désires pouvoir appliquer des effets comme le reverb, flanger, echo, filtre lo/hi pass, support de fichiers encodés en surround, 5.1, 6.1, wav, mp3, ogg fais moi signe et je te ferai un zip de mes sources. Mais je me répète ma librairie étant un peu plus complète, il y a beaucoup plus de dépendances. Mais elle permet si je le désire d'interfacer Bass, ou tout autre gestionnaire audio en plus, et d'ajouter aisément d'autres formats de fichier.

    OpenALSoundManager : OALSoundManager.7z
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/12/2017, 19h14
  2. [Batch] Comment jouer un son sans lecteur?
    Par groovyboy dans le forum Scripts/Batch
    Réponses: 10
    Dernier message: 26/03/2010, 09h36
  3. Jouer du son sans activex
    Par piaichpi dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 11/12/2009, 17h30
  4. jouer un sons sans stopper l'autre
    Par darkmalak01 dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2005, 23h54

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