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