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?