[OpenAL] Soundaufnahme mit OpenAL
spacer
Autor Nachricht
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1040
Erhaltene Danke: 27

Windows 7 Prof. , UBUNTU
RAD Studio 2010 Prof.
BeitragVerfasst: Mi 04.01.12 14:40 
Betrifft: 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 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.

ausblenden Delphi-Quelltext markieren
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; //- Device used to capture audio
pPlaybackDevice : pALCDevice; //- Device used to playback audio
pPlaybackContext : pALCContext; //- Playback context
pPlaybackSource : TALuint; //- Source for playback (in 3D sound would be located)
CaptureBuffer : array of TALubyte; //- Capture buffer external from openAL, sized as calculated above for 5 second recording
PlayBuffer: TALInt; //- openAL internal playback buffer

fSeconds : Integer;
fFrequency : Integer;
fFormat : Integer;
fBufferSize : Integer;


//- These two are used to control when to begin/end recording and playback
Samples: TALInt; //- count of the number of samples recorded
PlayState: TALInt; //- playback state
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:

ausblenden Delphi-Quelltext markieren
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
//Aufnahme starten
alcCaptureStart(pCaptureDevice);

oldfreq := fFrequency;

//Samples aufnehmen bis Datenmenge erreicht.
repeat
alcGetIntegerv(pCaptureDevice, ALC_CAPTURE_SAMPLES, TALsizei(sizeof(TALint)), @Samples);
until Samples>=fSeconds*fFrequency;


//Samples in Aufnahmebuffer schreiben.
alcCaptureSamples(pCaptureDevice, @CaptureBuffer, Samples);

//Aufnahme abgeschlossen.
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.

_________________
Ich nutze EdgeMonkey, weil ich auf schwules Pink stehe :-*
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
FinnO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1040
Erhaltene Danke: 27

Windows 7 Prof. , UBUNTU
RAD Studio 2010 Prof.
BeitragVerfasst: 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

_________________
Ich nutze EdgeMonkey, weil ich auf schwules Pink stehe :-*
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Fr 06.01.12 23:03 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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" ;)
Einloggen, um Attachments anzusehen!
_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home