Forum Programmation.c++ un micro lecteur audio Linux GTK+3.0 écrit en C++.

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
1
8
déc.
2015

Salut les GTK,

je vous annonce de part ce message la publications d'un programme (pour Linux) écrit en C++ utilisant GTK comme HMI.

Le programme MicroMusicPlayer est un lecteur de fichiers audio pouvant lire les formats de fichiers musique suivant:

+) *.mp3
+) *.wav
+) *.flac
+ *.ogg

MicroMusicPlayer est basé pour le rendus sonore sur la bibliothèque connexe de la SDL2: SDL2_mixer ce qui pose un problème mineure que je vous détaillerai par la suite.

Sinon la partie GUI est du GTK+3.0 et non du gtkmm3 et le programme est court, conçis, et j'estime écrit correctement (sinon je l'aurai pas publier a cause du bug).

Je dirai du "C++ C-Like"…???

C'est un lecteur audio aussi simple que possible:

Les fonctions
+) play
+) pause
+) next
+) previous
+) shuffle
+) repeat
+) Volume

sont présent et c'est tout pour les contrôles.

Concernant les fichier audio:

Vous définissez votre racine de fichiers audio dans le panneau de configuration afin de faciliter la sélection et vous pouvez choisir un dossier contenant des fichiers audio supportés. $HOME par défaut.

Dont la musique sera jouer séquentiellement ou aléatoirement selon les réglages, de manière répétitive ou pas.

Les autres fichiers du dossier seront ignorés a part les images de types *.jpg, *.jpe, *.jpeg, *.png, *.bmp, *.dib or *.tif, *.tiff contenus dans le dossier dont après une sélection la plus grande sera afficher comme image cover de l'album dans l'interface si présent.

Sinon il y a l'option de ne jouer qu'un seule chanson si l'envie vous enchante.

Ont peut également visualiser la playlist actuelle et cliquer sur le morceau de votre choix afin de le jouer immédiatement.

Toutes vos options préférentielles du programme sont directement appliquer a l'interface et stocker si vous le voulez afin de les retrouver ultérieurement.

Comme par exemple le jeu d'icônes que vous préférez.

L'on en vient au problème: la bibliothèque SDL2_mixer est conçus pour le son des jeux vidéos et non pour implémenter un lecteur audio je pense.

Et a cause d'une unique fonction non négligeable nommer Mix_HookMusicFinished le programme peut éventuellement crasher: pour plus d'infos rendez vous sur www.open-source-projects.net c'est expliqué.

Je n'ai pas d'excuses mais je ne connais que cette bibliothèque pour jouer des fichiers sonores et apprendre a utiliser une bibliothèque pour un projet aussi petit que MicroMusicPlayer n'est pas une chose aussi aisé que de se familiariser avec un module python aux fonctions analogues.

MicroMusicPlayer est partie d'une idée personnel (organisation d'album de musiques ordonnées dans des dossiers avec image cover) et non d'un choix de projet (pour cette ordre d'idée voyez le programme de traitement d'images Edip écrit en parallèle de MicroMusicPlayer).

Je vous serai reconnaissant de bien vouloir, si vous le désirez bien, vous intéresser au code car c'est mon premier programme écrit en C++ avec le programme de traitement d'images Edip en parallèle…

Toutes critique de toutes sortes est la bienvenue, merci pour vos réponses éclairées.

PS: j'ai évidemment tester le programme dans la durée et il ne crashe pas si souvent que ça sur mon OS. Devrai je le retirez de mon site pour ça ?

Le système de build autotools dépends de la lourde library opencv-3.0.0 qui est fournis avec le tarball d'ou la taille.
Mais dans ce cas je n'ai d'autre choix car mon packages manager m'installe opencv-2.4 précompiler avec GTK+2 au lieu de GTK+3 ce qui ne fonctionne pas avec une application GTK+3.0
J'ai laisser libre choix a l'utilisateur d'installer opencv-3.0.0 par un raccourçis ou pas et même mis a disposition un programme de test de compatibilité au cas opencv-3.0.0 serai déjà installé.

Merci, c'est raté, je sais.

  • # OpenCV ?

    Posté par  . Évalué à 2.

    Tu inclus une dépendance OpenCV juste pour avoir GTK3 ?
    Je ne sais pas quelle distribution tu utilises, mais j'ai du mal à croire que tu ne puisses pas installer GTK3 et les bibliothèques de dev associées indépendamment. Je viens de vérifier sur ma Debian testing, en effet, seul OpenCV 2.4 est packagé, mais j'ai tout plein de libgtk*3, libgtkmm*3…

    Sinon, pour remplacer SDL2_mixer, tu peux regarder tu coté de libvlc.

    • [^] # Re: OpenCV ?

      Posté par  (site web personnel) . Évalué à 1. Dernière modification le 09 décembre 2015 à 09:39.

      Salut je pense qu'il y a méprise.
      Car le problème de opencv par le package manager est que si tu compile opencv a la main et bien le build détecte ta version de GTK (2 ou 3) sous Linux et je pense qu'il en a besoin je ne sais pourquoi.
      Et comme par le package manager opencv est précompiler avec GTK+2 dans ma distro.
      Tu ne peut pas te servir de opencv en conjonction avec GTK+3: il y a une collision de symbole (on ne peu pas mixer du GTK+2 et du GTK+3, ça ne marche pas).

      Essaie ce bout de code GTK+3 pour voir si chez toi ça fonctionne:

      #include <string>
      #include <vector>
      #include <cstdlib>
      
      using namespace std ;
      
      #include <gtk/gtk.h>
      
      #include <opencv2/highgui.hpp>  // Headers to correct for opencv-2.4
      #include <opencv2/imgproc.hpp>  // Headers to correct for opencv-2.4
      
      void destroy(GtkWidget *widget,gpointer pointer) ;
      
      static gboolean delete_event(GtkWidget *widget,GdkEvent *event,gpointer pointer) ;
      
      gboolean quit(gpointer user_data) ;
      
      string return_msg ;
      
      /**  To compile with:
      *  
      *  $ g++ main.cpp `pkg-config --cflags --libs gtk+-3.0` `pkg-config --cflags --libs opencv`
      *  
      *  Display an image given as argument. 
      */  
      
      int main(int argc, char *argv[]) {
      
          if (argc < 2 ) {
              fprintf(stdout,"usage: %s image_filepath", argv[0]) ;
              exit(EXIT_FAILURE) ;
          }
      
          try {
              return_msg = "Genius It works !!!" ;
              cv::Mat image = cv::imread(argv[1]) ;
              cv::Mat frame ;
              // This can fail by some bads images files this why the exception handle.
              cv::resize(image, frame, cv::Size(image.cols, image.rows) ) ;
          }
          catch (cv::Exception &e) {
              return_msg = "Sorry It doesn't work !\n\n" ;
              return_msg += e.err ; 
          }
      
          gtk_init(&argc,&argv) ;
      
          GtkWidget *window, *label, *image, *vbox ;
          window=gtk_window_new(GTK_WINDOW_TOPLEVEL) ;
      
          gtk_window_set_icon_from_file(GTK_WINDOW(window), argv[1], NULL) ;
          gtk_window_set_title(GTK_WINDOW(window), "Test program") ;
          gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS) ;
          gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
          gtk_widget_set_size_request(window,-1,-1) ;
      
          label = gtk_label_new(return_msg.c_str()) ;
          image = gtk_image_new_from_file(argv[1]) ;
      
          vbox  = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0) ;
      
          gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0) ;
          gtk_box_pack_start(GTK_BOX(vbox), image, TRUE,  TRUE,  0) ;
      
          gtk_window_set_title(GTK_WINDOW(window),"Test program") ;
      
          gtk_widget_set_size_request(window,-1,-1) ;
      
          gtk_container_set_border_width(GTK_CONTAINER(window),16) ;
      
          gtk_container_add(GTK_CONTAINER(window), vbox) ;
      
          g_signal_connect(G_OBJECT(window), "destroy",      G_CALLBACK(destroy),    NULL) ;
      
          g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(delete_event),NULL) ;
      
          gtk_widget_show_all(window) ;
      
          int timeout_ms = 5000 ;
      
          g_timeout_add( timeout_ms, &quit, NULL);
      
          gtk_main() ;
      
          exit(EXIT_SUCCESS) ;
      }
      
      gboolean quit(gpointer user_data) {
      
          destroy(NULL, NULL) ;
          return FALSE ;
      }
      
      void destroy(GtkWidget *widget,gpointer pointer) {
          fprintf(stdout,"Test program result:\n%s\n", return_msg.c_str()) ;
          gtk_main_quit() ;
          return ;
      }
      
      static gboolean delete_event(GtkWidget *widget,GdkEvent *event,gpointer pointer) {
          if (event->type == GDK_DELETE) {
              fprintf(stdout,"%s delete_event catch\n",__func__) ;
              return FALSE ;
          }
          else {
              fprintf(stdout,"%s delete_event not catch\n",__func__) ;
          return TRUE ;
          }
      }

      Sinon merci pour le conseil de libvlc.

      • [^] # Re: OpenCV ?

        Posté par  . Évalué à 1.

        Je ne comprends pas, tu utilises des fonctionnalités d'OpenCV dans ton applications ou bien tu en dépends uniquement pour disposer des binaires de GTK3 ?

        Si tu en as effectivement besoin, je retire ce que j'ai dis, même si je trouve dommage d'introduire une dépendance à OpenCV juste pour faire de la UI. GTK tout seul serait amplement suffisant. Surtout si l'on en croit ton exemple, qui, si je ne m'abuse, inclus OpenCV mais ne l'utilise absolument pas.

        • [^] # Re: OpenCV ?

          Posté par  . Évalué à 2.

          apparemment il fait un travail sur une image avec OpenCV

              try {
                  return_msg = "Genius It works !!!" ;
                  cv::Mat image = cv::imread(argv[1]) ;
                  cv::Mat frame ;
                  // This can fail by some bads images files this why the exception handle.
                  cv::resize(image, frame, cv::Size(image.cols, image.rows) ) ;
              }
              catch (cv::Exception &e) {
                  return_msg = "Sorry It doesn't work !\n\n" ;
                  return_msg += e.err ; 
              }

          avant de s'en servir plus loin

          • [^] # Re: OpenCV ?

            Posté par  . Évalué à 3.

            En effet, j'était passé à coté (note : ne pas écrire de commentaires trop tôt le matin).

            Mais du coup, si OpenCV est juste utilisé pour faire du resizing d'image pour l'affichage, je me demande s'il ne serait pas plus intéressant de laisser GTK gérer le resizing à l'affichage et d'abandonner OpenCV.

            • [^] # Re: OpenCV ?

              Posté par  (site web personnel) . Évalué à 1.

              Salut les gars merci pour vos réactions,

              en faîtes vous avez raison tous les deux ou presque, j'explique:

              j'utilise opencv-3.0.0 dans mon programme pour mettre les images covers d'album de musique a la bonne taille, en faîte je regarde dans le dossier de musique a lire si je trouve une | des images puis si il y en a je l'affiche après sélection et redimensionnement de la plus grande, comme image cover dans l'interface.

              Par contre il est vraiment dommage d'inclure et du coup dépendre de la version 3.0.0 d'opencv car je n'utilise qu'une seule fonction de toute la giganteste library opencv-3.0.0.

              je me demande s'il ne serait pas plus intéressant de laisser GTK gérer le resizing à l'affichage et d'abandonner OpenCV.

              Ho que OUI mais je ne savait pas que l'on pouvait travailler (redimensionner) une image simplement avec GTK si vous avez un bout de code a me montrer ça serai vraiment sympa, s'il vous plaît.

              Contrairement au programme de traitement d'images Edip (Easy Digital Imaging Processing) qui utilise beaucoup de fonctionnalités de opencv-3.0.0 mon premier gros programme écrit en C++ utilisant gtkmm3 comme GUI, dont je suis très fiers.

              Pour la petite histoire j'ai commencer a écrire Edip puis j'ai suis allé en vacances ou j'ai écrit la plus grande partie du mini lecteur audio MicroMusicPlayer.
              D'ailleurs sur le Mac de mon oncle et a part le front-end utilisateurs commercial auquel il faut s'habituer et s'y faire, le noyau (les sous-couches pas le kernel) sont proche de notre pingouin favoris.
              Seule reproche le compilateur C++ de mac ne dit pas la ligne ou est situé l'erreur, bref pas assez informatif la sortie.

              PS pour les modos: le fonctionnement du bouton "Code Block" pose problème car ça ne fonctionne pas correctement et j'ai remarquer que le bouton ajoute les caractères ``` alors je ne sais pas si c'est du markdown.
              Si c'est le cas alors je voudrai savoir si je peut mettre du code source sans utiliser le bouton en plus il y a la coloration syntaxique qui n'y été pas lors de mon post mais qui est présente aujourd'hui.

              • [^] # Re: OpenCV ?

                Posté par  . Évalué à 1.

                Ho que OUI mais je ne savait pas que l'on pouvait travailler (redimensionner) une image simplement avec GTK si vous avez un bout de code a me montrer ça serai vraiment sympa, s'il vous plaît.

                Ca fait bien 10 ans que je n'ai pas fait de GTK, mais de mémoire, dans le panel/conteneur dans lequel tu affiches l'image, tu disposes d'options pour automatiquement adapter l'image au conteneur. Ainsi, tu as juste à demander à GTK d'afficher l'image d'origine, c'est lui qui fera tout le boulot de redimensionnement.

                • [^] # Re: OpenCV ?

                  Posté par  (site web personnel) . Évalué à 1.

                  Merci,

                  j'ai trouver un exemple sur DEV, pour te rafraîchir la mémoire, il existe une fonction nommer: gdk_pixbuf_scale_simple qui permet le redimensionnement…

                  Et je me suis familiariser avec libvlc: je la trouve super car pas trop compliquer même si ils abusent des typedef, juste ce qu'il me fallait: GRAND MERCI.

                  Par contre il faut que j'arrive a trouver quels formats de fichiers audio libvlc est capable de lire car je parse un dossier ne gardant que les fichiers audio compatibles.

                  La sortie d'aptitude donne ça:

                  VLC est le lecteur de média du projet VideoLAN. Il peut lire les fichiers MPEG,
                  MPEG-2, MPEG-4, DivX, MOV, WMV, QuickTime, WebM, FLAC, MP3, Ogg/Vorbis, les
                  DVDs, VCDs, podcasts et les flux multimédia de diverses sources réseau.

                  Ce qui ne spécifie pas les extensions, je vais voir sur google si je trouve une liste d'extensions.

                  Merci a tous pour vos réponses éclairées.

  • # Commentaire supprimé

    Posté par  . Évalué à 0. Dernière modification le 08 décembre 2015 à 11:51.

    Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.