Entwickler-Ecke
Multimedia / Grafik - Soundaufnahme mit OpenAL
FinnO - Mi 04.01.12 14:40
Titel: Soundaufnahme mit OpenAL
Moin,
ich bin gerade mal wieder dabei an meinen Delphifähigkeiten zu zweifeln. Ich möchte gerne Sound mit OpenAL aufnehmen, dabei orientiere ich mich an einer
Datei [
http://svn.freepascal.org/svn/fpc/trunk/packages/openal/examples/captureplaybackopenal.pas] für FPC, nutze jedoch Delphi 2010.
Die ganze Geschichte da Lässt sich so schonmal nicht mit Delphi Kompilieren, ich versuche nebenbei Todesmutig, das Ganze irgendwie in eine Klasse zu zwängen.
Delphi-Quelltext
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:
| type TOpenAlRecorder = class private pCaptureDevice : pALCDevice; pPlaybackDevice : pALCDevice; pPlaybackContext : pALCContext; pPlaybackSource : TALuint; CaptureBuffer : array of TALubyte; PlayBuffer: TALInt; fSeconds : Integer; fFrequency : Integer; fFormat : Integer; fBufferSize : Integer;
Samples: TALInt; PlayState: TALInt; public property Seconds : Integer read fSeconds; property Frequency : Integer read fFrequency; property Format : Integer read fFormat; property BufferSize: Integer read fBufferSize;
procedure Prepare(ASeconds,AFrequency,AFormat : Integer);
procedure Capture(); procedure Playback();
constructor Create; destructor Destroy; end; |
Die Aufnahme gestaltet sich dann so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TOpenAlRecorder.Capture; var oldfreq : integer; begin alcCaptureStart(pCaptureDevice);
oldfreq := fFrequency;
repeat alcGetIntegerv(pCaptureDevice, ALC_CAPTURE_SAMPLES, TALsizei(sizeof(TALint)), @Samples); until Samples>=fSeconds*fFrequency;
alcCaptureSamples(pCaptureDevice, @CaptureBuffer, Samples);
alcCaptureStop(pCaptureDevice); fFrequency := oldfreq; end; |
Ich habe hier mal etwas Markiert, was Schon auf den ersten Blick relativ nutzlos aussieht. In der Schleife geht wie durch ein Wunder der Wert in fFrequency flöten. Aber so richtig. Aus 44100 wird irgendeine Zufallszahl. Aber damit nicht genug.
Möchte ich den Spaß den ich mühsam in den Buffer geschrieben habe jetzt Wiedergeben, geht auf dem Weg zwischen der einen Prozedur und der anderen (selbst bei einem Haltepunkt bevor dort etwas nennenswertes passiert, geschwiege den fFrequency auch nur angesehen wird) dieser Wert erneut verloren und fFrequency enthält eine höchst mysteriöse Zufallszahl.
Da frage ich mich (und euch) nun,
Wie kann das passieren?
LG
Edit: Ich hänge mal an - wenn sich die Meinung einstellen sollte, Aufnehmen mit OpenGL ist aus irgendwelchen Gründen nutzlos, dann bin ich für Vorschläge offen, wie man möglichst intelligent Audio so aufnehmen kann, dass einem Rohdaten vorliegen.
FinnO - Do 05.01.12 14:50
Moin,
ich muss mal sehr pünktlich pushen. Ferner: Ich wandele diese Geschichte vielleicht ein kleines wenig ab und Frage zusätzlich zur o.g. Frage auch, ob jemand eventuell eine funktionierende Alternative zu OpenAL kennt, die Sound aufnehmen und als Rohdaten im Arbeitsspeicher halten kann. So im Sinne von einem Array, was die Auslenkung der Schallwellen enthält.
Angeschaut habe ich mir schon WaveInOut, das ist aber alles hart kompliziert, MMSystem mit Diesen Strings zum senden und so kann zwar hervorragend einfach aufnehmen, aber nur direkt in .wav-Dateien schreiben.
Ich würde gerne auch etwas fertiges nutzen, aber etwas, was unter eine sinnigen Lizenz steht (und auch kommerziell genutzt werden kann, ohne, dass es all zu teuer ist [nicht bass.dll]).
LG
Martok - Fr 06.01.12 23:03
FinnO hat folgendes geschrieben : |
Angeschaut habe ich mir schon WaveInOut, das ist aber alles hart kompliziert, MMSystem mit Diesen Strings zum senden und so kann zwar hervorragend einfach aufnehmen, aber nur direkt in .wav-Dateien schreiben.
Ich würde gerne auch etwas fertiges nutzen, aber etwas, was unter eine sinnigen Lizenz steht (und auch kommerziell genutzt werden kann, ohne, dass es all zu teuer ist [nicht bass.dll]). |
Angehängt mal ein Modul aus einem meiner Projekte. Das wird so nicht compilieren (und selbst wenn würde es dir nichts bringen, weil das drumrum fehlt), aber die grobe Struktur sieht man erstmal. Von meiner Seite her WTFPL, auch wenn da nichts drin ist was von der Schöpfungshöhe überhaupt ausreicht um da irgendwelche Rechte dran haben zu können :P
In Zeile 107 ist übrigens der Kommentar falsch, das müsste heißen "Convert from $Format to Float" ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!