Partage
  • Partager sur Facebook
  • Partager sur Twitter

QSound

metronome

    10 juin 2008 à 23:47:07

    bonjour bonjour:
    pour faire mon métronome, j'appelle un fonction qui contient ceci:

    void MaFenetre::tic()
    {
    	static int i = 0;
    	if(i)
    	{
    		i = 0;
    		setWindowTitle("b");
    	}
    	else
    	{
    		i =1;
    		setWindowTitle("a");
    	}
    	
    	QSound tic("MouseClick1.wav");
    	tic.play();
    }
    

    malheureusment lorsque la fonction est appelée pour la première fois, le programme freeze pendant 5 secondes, puis la fenetre prend successivement a et b comme titre, ce qui prouve que le timer marche, mais pas de son !
    j'ai bien sur inclu <QSound>
    qu'ai-je omis de faire ?
    #include <QApplication>
    #include <QTextCodec>
    #include <QTranslator>
    #include <QLocale>
    #include <QLibraryInfo>
    #include <MaFenetre.h>
    
    
    
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    
    // 	QString locale = QLocale::system().name();
    // 	QTranslator translator;
    // 	translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    // 	app.installTranslator(&translator);
    	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    	
    	MaFenetre fenetre;
    	fenetre.show();
    
    	return app.exec();
    }
    

    #include <MaFenetre.h>
    
    
    MaFenetre::MaFenetre() : QWidget()
    {
    	timer = new QTimer();
    	
    	afficheur = new QLCDNumber();
    	boutonTempo = new QDial();
    	boutonTempo->setRange(40,208);
    	boutonTempo->setValue(60);
    	boutonTempo->setCursor(Qt::CrossCursor);
    	changerTempo(60);
    	QHBoxLayout *layoutTempo = new QHBoxLayout;
    	layoutTempo->addWidget(afficheur);
    	layoutTempo->addWidget(boutonTempo);
    	
    	connect(boutonTempo, SIGNAL(valueChanged(int)), this, SLOT(changerTempo(int)));
    	connect(timer, SIGNAL(timeout()), this, SLOT(tic()));
    	
    	
    	
    	
    	activer = new QPushButton("Activer");
    	desactiver = new QPushButton("Desactiver");
    	quitter = new QPushButton("Quitter");
    	QHBoxLayout *layoutBoutons = new QHBoxLayout;
    	layoutBoutons->addWidget(activer);
    	layoutBoutons->addWidget(desactiver);
    	layoutBoutons->addWidget(quitter);
    	connect(activer, SIGNAL(clicked()), this, SLOT(activerTimer()));
    	connect(desactiver, SIGNAL(clicked()), timer, SLOT(stop()));
    	connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
    
    	QVBoxLayout *layout = new QVBoxLayout;
    	layout->addLayout(layoutTempo);
    	layout->addLayout(layoutBoutons);
    	setLayout(layout);
    }
    
    void MaFenetre::changerTempo(int tempo)
    {
    	m_tempo = tempo;
    	m_intervalle = int((1.0/(m_tempo/60.0))*1000.0);
    	timer->setInterval(m_intervalle);
    	afficheur->display(m_tempo);
    }
    
    void MaFenetre::activerTimer()
    {
    	if(!timer->isActive())
    	{
    		timer->start(m_intervalle);
    	}
    }
    
    void MaFenetre::tic()
    {
    	static int i = 0;
    	if(i)
    	{
    		i = 0;
    		setWindowTitle("b");
    	}
    	else
    	{
    		i =1;
    		setWindowTitle("a");
    	}
    	
    	QSound tic("MouseClick1.wav");
    	tic.play();
    }
    

    #ifndef DEF_MaFenetre
    #define DEF_MaFenetre
    
    
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QTimer>
    #include <QDial>
    #include <QLCDNumber>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QSound>
    
    
    class MaFenetre : public QWidget
    {
    	Q_OBJECT
     
    	public slots:
    		void changerTempo(int tempo);
    		void activerTimer();
    		void tic();
    	public:
    		MaFenetre();
    		
    	private:
    		QPushButton *activer;
    		QPushButton *desactiver;
    		QPushButton *quitter;
    		QTimer *timer;
    		QDial *boutonTempo;
    		QLCDNumber *afficheur;
    		double m_intervalle;
    		double m_tempo;
    };
    #endif
    

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2008 à 23:53:53

      et en passant ton QSound en membre de ta classe ?
      • Partager sur Facebook
      • Partager sur Twitter
        11 juin 2008 à 0:10:23

        ça me donne exactement la même chose :(
        j'ai aussi essayé de mettre la creation de l'objet vers lequel le pointeur pointe dans le constructeur :

        tic = new QSound("~/programmes/C++/Qt/Metronome/MouseClick1.wav");
        mettre l'addresse complete n'a pas changé grand chose non plus
        j'ai même essayé de lui donner QString("MouseClick1.wav")
        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2008 à 0:22:06

          #include <MaFenetre.h>
          

          je dirais que ton include est faux.

          #include "MaFenetre.h"
          
          • Partager sur Facebook
          • Partager sur Twitter
          :)
            11 juin 2008 à 0:26:00

            bien vu ;)

            mais le résultat est toujours le même :(
            • Partager sur Facebook
            • Partager sur Twitter
              11 juin 2008 à 9:37:36

              salut.
              {
              ...
              QSound tic("MouseClick1.wav");
                      tic.play();
              }


              Le son n'as pas commencé à être joué que tu detruit ton QSound => à mon avis pas de son
              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2008 à 11:32:30

                tu pourra m'envoyer l'exécutable que je puisse tester :D (je joue de la gratte :) )
                • Partager sur Facebook
                • Partager sur Twitter
                :)
                  11 juin 2008 à 12:05:41

                  Citation : mongaulois

                  salut.

                  {
                  ...
                  QSound tic("MouseClick1.wav");
                          tic.play();
                  }



                  Le son n'as pas commencé à être joué que tu detruit ton QSound => à mon avis pas de son



                  j'ai changé un peu le code, mais toujours pas de résultat :


                  MaFenetre::MaFenetre() : QWidget()
                  {
                  timer = new QTimer();
                  son = new QSound(QString("MouseClick1.wav"));
                  connect(timer, SIGNAL(timeout()), this, SLOT(tic()));
                  }
                  void MaFenetre::tic()
                  {
                  son->play();
                  }
                  la seule différence, c'est que au lieu de lagger à mort au moment où j'appelle la méthode tic, ça lag à mort quand le constructeur est appelé
                  à l'aide ça veut pas marcher ! :-((((((((((((((((((((((((((
                  moii je te l'enverrais volontier (quand ça marchera :p)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juin 2008 à 14:10:08

                    Faudrait lancer le timer peut être :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 juin 2008 à 14:20:32

                      oui c'est le cas, le reste du
                      MaFenetre::MaFenetre() : QWidget() n'a pas changé depuis le début

                      j'ai essayé de mettre n'importe quoi dans QSound

                      que je mette
                      QSound tic("lkdfjkvn dk ghgdslkghod"); ,
                      QSound tic("tic.wav"); ,
                      ou encore QSound tic("");
                      le résultat est toujours le même !


                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 juin 2008 à 14:32:49

                        Ben je sais pas. voici un exemple qui marche sous windows

                        #include <QtGui>
                        
                        class myClass : public QWidget
                        {
                            Q_OBJECT
                        public :
                            myClass (QString s) : m_sound(s)
                            {
                                connect(&m_timer,SIGNAL(timeout()),this,SLOT(tic()));
                                m_timer.start(1000);
                            }
                        
                        public slots :
                            void tic()
                            {
                                m_sound.play();
                            }
                        
                        private :
                            QSound m_sound;
                            QTimer m_timer;
                        
                        };
                        #include "main.moc"
                        
                        int main(int argc,char** argv)
                        {
                        QApplication app(argc,argv);
                        
                            myClass w("C:/WINDOWS/Media/Ding.wav");
                            w.show();
                        return app.exec();
                        }

                        Y as juste à mettre le path du wav et faire
                        qmake -project
                        qmake
                        make

                        Et tu sur que ton appli trouve ton fichier wav?

                        [edit]
                        play est un slot. Tu peut donc faire
                        connect(&m_timer,SIGNAL(timeout()),&m_sound,SLOT(play()));
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 juin 2008 à 20:02:05

                          (ton code n'a pas compilé )
                          mais je vais simplifier le problème : pourquoi ce code ne marche pas chez moi ?

                          #include <QApplication>
                          #include <QSound>
                          
                          int main(int argc, char *argv[])
                          {
                          	QApplication app(argc, argv);
                          
                          	QSound son("MouseClick1.wav");
                          	son.play();
                          
                          	return app.exec();
                          }
                          

                          à l'aide !
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 juin 2008 à 20:53:03

                            As oui, j'ai oublié de préciser.... il faut copier ce code dans un fichier nommer
                            main.cpp
                            #include "main.moc" permet de spécifier à qmake de mocer main.cpp
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 juin 2008 à 21:00:04

                              merci, je sais pas dans quoi je l'avais copié, il a marché, mais il y a toujours le freeze, et pas de son lu :(

                              edit : miracle, j'etais pas été assez loin dans la doc de QSound, il fallait et suffisait d'installer network audio system :'(

                              edit2 : maintenant que Qt a son serveur audio(il pourrait pas utiliser alsa comme tout le monde !) le freeze a disparu, mais c'est toujours le silence radio complet
                              des idées ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 juin 2008 à 21:45:31

                                monte le sound? X-P
                                je sais pas. comment As tu installé NAS??
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 juin 2008 à 21:49:06

                                  apt-get install nas
                                  je peux même te montrer le log :
                                  Sélection du paquet nas précédemment désélectionné.
                                  (Lecture de la base de données... 219678 fichiers et répertoires déjà installés.)
                                  Dépaquetage de nas (à partir de .../archives/nas_1.9.1-2_amd64.deb) ...
                                  Traitement des « déclenchements (triggers) » pour « man-db »...
                                  Paramétrage de nas (1.9.1-2) ...
                                  Starting the Network Audio System
                                  Network Audio System Release 1.9.1

                                  j'ai fais dpkg-reconfigure nas, pour voir si par hasard il aurait oublié des truc mais toujours et inplacablement pas de son de sort de mon métronome :((((((((((((((((((((((((((((((((((((((

                                  son->isAvailable(); me renvoie false, si j'ai bien compris ca veut dire que l'equipement audio n'est pas disponible
                                  NAS utilise /dev/dsp mais celui-ci est déjà utilisé, mais par quoi ??
                                  MouseClick1.wav > /dev/dsp
                                  bash: /dev/dsp: Périphérique ou ressource occupé
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  QSound

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown