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 :
Pour installer la bonne bibliothèque :
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)
Et ça devrait le faire :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sudo apt-get install libasound2 libasound2-dev
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 :
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
3
4
5 #ifdef __LINUX #include "alsa_recorder.hpp" #include <thread> #endif
Son implémentation aussi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 static void start_audio_recording(AlsaRecorder * p_aRec);
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)
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 AlsaRecorder aRec; AlsaRecorder * p_aRec = &aRec;
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 ! )
Partager