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 :

[Visual Studio][C#]Problèmes de performance à la lecture d'un échantillon sonore


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut [Visual Studio][C#]Problèmes de performance à la lecture d'un échantillon sonore
    Bonjour !

    Je travaille actuellement sur un projet en C# concernant notamment l'intégration d'échantillons sonores.

    Ma contrainte concernant ces échantillons est qu'il faut qu'ils soit vite lus une fois le signal donné, et au besoin répété en rythme.

    Malheureusement, ma solution actuelle souffre d'un temps de latence important... De l'ordre de 100 ms, ce qui est problématique pour mon application.

    J'ai essayé plusieurs solution, et pour le moment, DirectSound donne le meilleur résultat, mais encore un poil insuffisant..

    Du coup, je me demandais :

    • Quelle est la solution Visual Studio la plus performante pour traiter le son ?
    • Dans Direct Sound, peut-on forcer le traitement hardware du son ?


    Voici le bout de code qui me permet de créer un objet de la classe instrument qui charge du son... Peut-être devrais-je optimiser quelque chose là-dedans, mais je ne sais pas quoi

    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
     
    //<Attributs de 'forme' de classe>
    private String nom;
    private String path;
    private int mesures;
    private int temps;
    //</Attributs de 'forme' de classe>
     
    //<Attributs de 'fonctionnement'>
    private Device device = new Device();
    private SecondaryBuffer buffer = null;
    //</Attributs de 'fonctionnement'>
     
     public instrument(String p_nom, String p_path, int pmesures)
     {
                nom = p_nom;
                path = p_path;      
                device.SetCooperativeLevel(Form1.giveMyself(), CooperativeLevel.Priority);
                buffer = new SecondaryBuffer(path, device);
    }
    Le son qui est joué est toujours traité en software avec ce code... Est-ce normal ? Puis-je forcer le harware, et est-ce que ceci donnerait de meilleures performances ?

    Voilà... Je suis assez désespéré, alors j'attend avec impatience toute vos suggestions !

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Bonjour;


    t'as essayé d'utiliser la fonction PlaySound de l'api Win32

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [sysimport(dll="winmm.dll")]
    public static extern long PlaySound(String lpszName, long hModule, long dwFlags);
    ensuite dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PlaySound( "chemin de ton fichier wav", 0 , 0);

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Ce qui ralenti c'est peut-être que tu as ton code qui gère le son dans une form d'où des effets de ralentissement. Peut-être faut-il tagger la méthode en MTThread ou créer un thread dédié à la lecture...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Par défaut
    Mehdi_AB> J'ai essayé, mais les performances étaient franchement moyennes. Apparemment, la librairie DirectX est la plus performante...

    hegros> Mais oui... Je ne sais pas comment j'ai fait pour ne pas y penser ! Merci, je pense que là, ça va mieux marcher !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut General
    Donc si j'ai bien compris, si on fait un calcul dans une form celui ci est ralenti ?

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par champomy62 Voir le message
    Donc si j'ai bien compris, si on fait un calcul dans une form celui ci est ralenti ?
    oui car chaque code nécessite un temps d'exécution pour le thread qui l'exécute et un même thread ne peut pas faire 2 choses ou être à 2 points d'exécutions différents en même temps


    Si dans le clic d'un bouton je fais un calcul qui prends 10 minutes alors je ne pourrais pas recliquer sur le bouton ou sur un autre ou exécuter n'importe quel autre code relative à la fenêtre (comme la demande de fermeture avec la croix rouge en haut à droite) tant que les 10 minutes ne sont pas terminées.

    Parce que le thread de la form a sa propre pile d'exécution (comme chaque thread d'ailleurs) et lorsqu'il dépile le message et qu'il trouve que c'est un clic bouton alors il exécute le code du clic bouton et ensuite seulement il dépile le message suivant exécute le code associé et ainsi de suite. Cela corresponds à ce que l'on codait avant avec l'api win 32 en utilisant PeekMessage et DispatchMessage pour faire un programme fenêtré.

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

Discussions similaires

  1. Visual Studio .NET problème d'installation
    Par guiph dans le forum Visual Studio
    Réponses: 4
    Dernier message: 21/10/2006, 19h06
  2. Réponses: 8
    Dernier message: 13/03/2006, 22h31
  3. Réponses: 20
    Dernier message: 17/08/2005, 18h47
  4. [Visual Studio .NET] Problème de compilation
    Par black is beautiful dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/04/2005, 17h55

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