[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.


Anmelden zum Antworten