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 :
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 :
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 :
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) :
1 2
|
static void start_audio_recording(AlsaRecorder * p_aRec); |
Son implémentation aussi :
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)
1 2 3
|
AlsaRecorder aRec;
AlsaRecorder * p_aRec = &aRec; |
Enfin, si on appuie sur le bouton (rappel : ImGui fonctionne en mode immédiat)
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 ! )