Autor Beitrag
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mi 04.01.12 14:40 
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 volle Höhe 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;                          //- 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
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.
FinnO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
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
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
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."