AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi BASS.DLL RecordingCallback in Klasse?
Thema durchsuchen
Ansicht
Themen-Optionen

BASS.DLL RecordingCallback in Klasse?

Ein Thema von Nuclear-Ping · begonnen am 10. Nov 2006 · letzter Beitrag vom 14. Nov 2006
 
Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

BASS.DLL RecordingCallback in Klasse?

  Alt 10. Nov 2006, 13:04
Hallo,

hat hier jemand schonmal mit der BASS.DLL eine Aufnahme realisiert, wo die Callback-Routine Teil einer Klasse ist?

Ich versuch das gerade. Dabei treffe ich auf folgende Probleme:

Callback-Routine lässt sich beim Start der Aufnahme nicht übergeben. Er meint "Variable erforderlich".
Dafür habe ich hier nun den Umweg über eine Variable wie folgt gewählt:
Delphi-Quellcode:
interface

type
  TRecordingCallback = function (Handle: HRecord;
                                 Buffer: Pointer;
                                 BufLength: DWord;
                                 User: DWord): Boolean of object; stdcall;

  {...}

  TXYZClass = class (...)
    constructor Create (AOwner: TComponent);
  private
    RecCallback: TRecordingCallback;

    function RecordingCallback (Handle: HRecord;
                                Buffer: Pointer;
                                BufLength: DWord;
                                User: DWord): Boolean; stdcall;
  public
    function StartRecording: Boolean;
    {...}
  end;

implementation

constructor TXYZClass.Create (AOwner: TComponent);
begin
  {...}
  RecCallback := RecordingCallback;
end;

function TXYZClass.StartRecording: Boolean;
begin
  Flag := MakeLong (c16BitAudio, cRecordingTime);

  RecChannel := BASS_RecordStart (cSampleRate,
                                  cNumChannels,
                                  Flag,
                                  @RecCallback,
                                  cDefaultUser);
end;

function TXYZClass.RecordingCallback (Handle: HRecord;
  Buffer: Pointer; BufLength: DWord; User: DWord): Boolean; stdcall;
var
  {...}
  LocalBuffer: TStereoBuffer;
  Sample: TAudioSample;
  i: Cardinal;
  {...}

begin

  CopyMemory (@LocalBuffer, Buffer, BufLength);

  {...}
end;
Das akzeptiert der Compiler. Allerdings ist in der Callback dann BufLength IMMER 0.

Gehe ich den "Old 'n Dirty Way", die Callback-Routine nicht als Teil der Klasse anzulegen, sondern einfach Non-OOP in den implementation-Teil zu hauen und passe BASS_RecordStart entsprechend an, funktioniert es, dann hat BufLength ordentliche Werte.

Allerdings muss die Callback-Routine Teil der Klasse sein, da dort noch andere Aktionen passieren, wo Variablen belegt und Funktionen aufgerufen werden, die Teile der Klasse sind.

Wenn ich an den Aufrufkonventionen rumspiele (stdcall z.B. mal raus), hat BufLength immer gigantische Werte (3mill+) und folglich bekomme ich hier dann eine Zugriffsverletzung.

Das muss doch gehen?

  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz