[gelöst] OpenAL Fehler: AL lib: ALc.c:1879: exit(): closing 1 Device
-
Hallo,
ich möchte das Eingangssignal vom Mikrofon auffangen, um es verarbeiten zu können. Dazu habe ich mir ein kleines Programm geschrieben, welches theoretisch die aufgenommen Soundsamples als 2 Byte große Zahlenwerte in ein Char-Array einträgt. Bin mir nicht sonderlich sicher, ob ich das richtig umgesetzt habe, da meine Ausgabe leer ist. Wenn ich das Programm beende erhalte ich in der Konsole die Fehlermeldung:AL lib: ALc.c:1879: exit(): closing 1 Device
Hier die main.cpp:
#include <AL/al.h> #include <AL/alut.h> #include <AL/alc.h> #include "GLSystem/GLSystem.h" #include <string> int main(int argc, char *argv[]) { //Engine starten //etc. hier starte ich meine noch nicht ganz fertige Gameengine als Grundbasis //Variablen erstellen ALCdevice* Device; ALCdevice* CaptureDevice; int Samples; char Puffer[88200] = {0}; char* Daten = Puffer; double Temptime = 0; //Initialisieren Device = alcOpenDevice(NULL); //Schauen ob Aufnahme möglich ist if(alcIsExtensionPresent(Device, "ALC_EXT_CAPTURE") == AL_FALSE) return 1; //Aufnahmedevice erstellen und Ringpuffer für Aufnahme reservieren (44100 * 2 Byte * 1 Aufnahme * 1 Sekunde) CaptureDevice = alcCaptureOpenDevice(NULL, 44100, AL_FORMAT_MONO16, 44100*2*1*1); if(!CaptureDevice) return 1; //Aufnahme starten alcCaptureStart(CaptureDevice); //Aktuelle Zeit nehmen Temptime = Zeit.getGametime(); //Zeit ist ein Objekt meiner Engine //Eine Sekunde in Schleife verharren while(Zeit.getGametime() - Temptime < 1) { //Zeit weiterzählen Zeit.frame(); //Maximale Anzahl an Samples ermitteln alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 4, &Samples); //Verfügbare Samples in Speicher schreiben alcCaptureSamples(CaptureDevice, Daten, Samples); } while(!Input.getQuit()) //Input stammt auch aus der Engine { //Fensterinhalt löschen Gamewindow->clear(); //Das Fenster in der Engine Input.update(); //Input aktualisieren Zeit.frame(); //Zeit weiterzählen if(Input.isRepeated("a")) //Wenn a gedrückt, klingt ein wenig verwirrend { Output.writel("Die Samples:", 4); //Meine Textausgabe //Samples als Werte ausgeben std::string Sampelwerte = Puffer; Output.writel(Sampelwerte, 4); //Eine leere Zeile wird ausgegeben } //Als vorletztes Texte überblenden Output.draw(); //Darstellung der Texte //Bild anzeigen Gamewindow->update(); //Fensterinhalt neu zeichnen } //Aufnahme stoppen alcCaptureStop(CaptureDevice); //Aufräumen alcCloseDevice(Device); alcCloseDevice(CaptureDevice); SDL_Quit(); return 0; }
Das, wenn es das macht was es soll, Schwachsinn ausgegeben wird, ist mir klar. Mir geht es erstmal nur darum zu schauen, ob überhaupt etwas aufgezeichnet wird.
Weiß jemand a) Wieso das Programm nichts aufzeichnet bzw. eventuell die Konvertierung in einen std::string einen leeren string ergibt und b) wieso die AL-Fehlermeldung beim Beenden auftritt?
Wäre für Hilfe sehr dankbar, finde zu dem Thema irgendwie fast nichts im Internet.
-
Weiß denn niemand Hilfe?
Hier:http://stackoverflow.com/questions/3056113/recording-audio-with-openal
Habe ich nur die Ursache für meinen Fehler gefunden, da ich alcCloseDevice(CaptureDevice); anstelle von alcCaptureCloseDevice(CaptureDevice); am Ende aufrief.
Mittlerweile habe ich herausgefunden, dass ich bei:
//Maximale Anzahl an Samples ermitteln alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(int), &Samples);
Immer 0 als Anzahl eingetragen bekomme, weshalb dann anschließend auch keine Samples kopiert werden. Aber warum erhalte ich da 0?
-
Ich habe die Aufnahme nun folgendermaßen modifiziert:
//Aufnahme starten alcCaptureStart(CaptureDevice); GLText* Ausgabe = Output.writel("", 4); //Eine Sekunde in Schleife verharren while(Zeit.getGametime() - Temptime < 1) { //Zeit weiterzählen Zeit.frame(); //Maximale Anzahl an Samples ermitteln //alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(int), &Samples); //Verfügbare Samples in Speicher schreiben //alcCaptureSamples(CaptureDevice, Daten, Samples); alcCaptureSamples(CaptureDevice, Daten, 1); //Samples als Werte ausgeben std::string Temp = Puffer; Ausgabe->setText(Temp); } //Aufnahme stoppen alcCaptureStop(CaptureDevice); if(alcGetError(Device) != ALC_NO_ERROR) Output.writel("Fehler in der Device (D)", 4); int fehler = alcGetError(CaptureDevice); if(fehler != ALC_NO_ERROR) Output.writel("Fehler in der CaptureDevice (CD)", 4); if(fehler == ALC_INVALID_DEVICE) Output.writel("CD: Ungültige Device", 4); if(fehler == ALC_INVALID_CONTEXT) Output.writel("CD: Ungültiger Kontext", 4); if(fehler == ALC_INVALID_ENUM) Output.writel("CD: Ungültige Konstante", 4); if(fehler == ALC_INVALID_VALUE) Output.writel("CD: Ungültiger Wert", 4); if(fehler == ALC_OUT_OF_MEMORY) Output.writel("CD: Zu wenig Speicher verfügbar", 4);
Dadurch, dass ich auch nur versuche mit alcCaptureSamples einen einzigen Sample zu laden provoziere ich schon den Fehler "CD: Ungültiger Wert".
Wie kann es aber sein, dass OpenAL meint, dass die Aufnahme möglich ist, aber dann kein einziges Sample aufnimmt?
-
Lösung gefunden.
ich hatte ja nur eine einsekündige Aufnahmeschleife laufen. Als ich diese auf 10 Sekunden verlängerte, erhielt ich exakt so viele Samples, wie in 9 Sekunden produziert werden. Das bedeutet OpenAL benötigt exakt eine Sekunde, um eine Aufnahme zu starten (Läuft ja in einem einzelnen Thread ab). Ich war nur zu schnell für OpenAL.