Attention : LINUX seulement (je ne sais pas encore quoi faire pour Windows, mais ça viendra)

Bonjour,

Pour ceux que cela intéresse, j'ai écrit une petite application en C++ permettant de s'enregistrer (micro interne ou webcam) via alsa + pulse sous Linux (c'est souvent installé par défaut sous Linuxmint). Tout est ICI

La seule dépendance est la libasound2 :

Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
$apt-cache search asound | grep libasound2
 
libasound2 - bibliothèque partagée pour les applications ALSA
libasound2-data - Fichiers de configuration et profils pour les pilotes ALSA
libasound2-dev - bibliothèque partagée pour les applications ALSA -- fichiers de développement
libasound2-doc - Documentation pour la programmation d'applications ALSA en espace utilisateur
libasound2-plugins - Plugins additionnels pour la bibliothèque ALSA
 
(quelques d'autres)


Pour installer la bonne bibliothèque :

Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
 
sudo apt-get install libasound2 libasound2-dev


Et ça devrait le faire :-)


Si vous voulez intégrer cette fonctionnalité dans votre logiciel, un exemple d'intégration est inclus dans les sources, mais quelquefois, c'est mieux de voir ce que ça donne en mode graphique et vous pouvez vous inspirer de l'exemple que j'ai donné dans miniDart,un autre logiciel que j'écris.

Méthode :

ajouter alsarecorder.hpp qu'on utilisera avec un #include "alsa_recorder.hpp"

Pour l'implémentation, il faudra ajouter alsa_recorder.cpp dans vos sources.

Pour l'utilisation :

Ajouter le fichier d'en-tête permettant de définir l'interface :

Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
 
#ifdef __LINUX
#include "alsa_recorder.hpp"
#include <thread>
#endif


Une fonction statique pour lancer l'enregistrement (parce que j'utilise std::thread, mais il doit y avoir une astuce pour faire autrement) :

Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
 
static void start_audio_recording(AlsaRecorder * p_aRec);


Son implémentation aussi :

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
static void start_audio_recording(AlsaRecorder * p_aRec)
{
    //fname = filename;
    //std::cerr << "fname : " << fname << "\n";
    p_aRec->set_sound_device("default");
    p_aRec->init();
 
    int anErr = p_aRec->do_record();
 
    if (anErr !=  EXIT_SUCCESS)
        std::cout << "Pb with do_record() "  << "\n";
 
    std::cout << "Close wave file" << "\n";
    p_aRec->close_wav_file();
 
    std::cout << "Close default soundcard" << "\n";
    p_aRec->close_soundcard();
}






Dans la fonction principale, création d'une instance d'un objet de type AlsaRecorder (et d'un pointeur associé, plus pratique)

Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
 
    AlsaRecorder aRec;
    AlsaRecorder * p_aRec = &aRec;


Enfin, si on appuie sur le bouton (rappel : ImGui fonctionne en mode immédiat)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
 
                    if ((b_recording_checked) && (!b_recording_video))                           /// on vient d'appuyer sur le bouton "Enregistrer" ET on n'était pas en train d'enregistrer
                    {
                        if (strlen(defaultPath) == 0)
                        {
                            // open modal dialog : il faut définir un répertoire de travail
                            // dans lequel seront enregistrées les images
                            ImGui::OpenPopup(CURRENT_WORKING_DIRECTORY_POPUP);
                            if( ImGui::BeginPopupModal(CURRENT_WORKING_DIRECTORY_POPUP, NULL, ImGuiWindowFlags_AlwaysAutoResize))
                            {
                                ImGui::Text(HELP_CHOOSE_WORKING_REC_DIRECTORY);
                                ImGui::NewLine();
 
                                ImGui::Spacing(); ImGui::SameLine();
                                if (ImGui::Button(OK_BUTTON, ImVec2(120,0)))
                                {
                                    b_recording_checked = false;
                                    selectFolder(currentPath);
                                    ImGui::CloseCurrentPopup();
                                }
                                ImGui::EndPopup();
                            }
                        }
                        else
                        {
                            b_recording_video = true;
                            b_draw_recording_info = true;
                            b_startNewRecording = true;
                            std::cout << "Enregistrement en cours" << "\n";
                            inc_color();
 
                            p_aRec->set_quit(false);                                    // On vient d'appuyer sur "Enregistrer"
 
                            first = std::thread(*start_audio_recording, p_aRec);   // on lance le fil d'exécution en parallèle (enregistrement SON seulement ici)
 
                        }
                    }
                    else if ((!b_recording_checked) && (b_recording_video))  // on vient d'appuyer sur "Arrêter l'enregistrement"
                    {
                        b_recording_video = false;
                        b_draw_recording_info = false;
 
                        // stop audio recording
                        p_aRec->set_quit(true);      ///  Le booléen passe à VRAI => on arrête l'enregistrement
                        first.join();                         /// on termine le thread  
 
                        oVideoWriter.release();
                        std::cout << "Fin d'enregistrement" << "\n";
                    }



À la fin,vous obtenez un fichier .wav, mais j'ai proposé un script pour le convertir en mp3 sur github, pour ceux qui le souhaitent.

Merci d'avance pour tout retour constructif, toute aide ou même toute contribution (soyons fous ! )