Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi BASS.DLL RecordingCallback in Klasse? (https://www.delphipraxis.net/80531-bass-dll-recordingcallback-klasse.html)

Nuclear-Ping 10. Nov 2006 13:04


BASS.DLL RecordingCallback in Klasse?
 
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. :gruebel:

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?

:coder2:

omata 10. Nov 2006 18:44

Re: BASS.DLL RecordingCallback in Klasse?
 
Hallo,

Zitat:

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

ja.

Schau doch mal hier.

Gruss
Thorsten

Nuclear-Ping 11. Nov 2006 15:08

Re: BASS.DLL RecordingCallback in Klasse?
 
Danke für dein Antwort. Ich habe mir mal den Anhang "Visualisierungen sind in der EXE" heruntergeladen und angeschaut. Dabei bin ich in der Unit BassRecordingU.pas auf folgenden Code-Ausschnit gestoßen:
Delphi-Quellcode:
procedure TBassRecording.Start(FileName: string);
begin
  {...}
  // start recording @ 44100hz 16-bit stereo
  _RecordChannel := _BassDll.BASS_RecordStart(44100, 2, 0, @RecordingCallback, INTEGER(Self));
  if _RecordChannel = 0 then begin
    if assigned(_WaveStream) then
      _WaveStream.Free;
    _WaveStream:=nil;
    raise Exception.Create('Aufnahme kann nicht gestartet werden');
  end;
  _isRecording := True;
  if assigned(_Equiliser) then
    _Equiliser.Init;
end;
Das ist aber genau das, was ich NICHT will, da hier die Callback-Routine ebenso kein Teil einer Klasse ist. ;)

omata 11. Nov 2006 18:29

Re: BASS.DLL RecordingCallback in Klasse?
 
Zitat:

Zitat von Nuclear-Ping
Das ist aber genau das, was ich NICHT will, da hier die Callback-Routine ebenso kein Teil einer Klasse ist. ;)

Ok, dann musst du dir selber was ausdenken.

Viel Glück

Nuclear-Ping 14. Nov 2006 12:15

Re: BASS.DLL RecordingCallback in Klasse?
 
Hallo omata,

komische Antwort, sehr unkonstruktiv. Falls ich dir mit meiner Ablehnung auf den Schlipps getreten habe, entschuldige ich mich, es war nicht meine Absicht. Jedoch kenne ich mich in dem BASS-Gebiet nicht aus, sodass ich den Teil mit "Integer (Self)" übersehen / nicht richtig verstanden habe.

Ich habe erfahren, dass es nicht möglich ist, die RecordingCallback in eine Klasse zu stecken. Als Abhilfe wird angeraten, bei User einen Zeiger auf Self zu übergeben. In deinem Code-Ausschnitt hast du das auch getan und nun wird mir einiges klarer.

Das nächste mal kannst du auch einfach darauf hinweisen. ;)

Danke und Grüße,

Mario

omata 14. Nov 2006 19:16

Re: BASS.DLL RecordingCallback in Klasse?
 
Hallo Nuclear-Ping,

tut mir leid, dass das so rüberkam. Ich hatte einfach gedacht, du hast gesehen und verstanden wie ich das gemacht habe. Da du mein Vorgehen gleich ausgeschlossen hattest, war das Thema für mich erledigt.

Ich habe mir einfach abgewöhnt hier Leute zu belehren, ich halte mich jetzt einfach zurück. Und lasse einfach jedem seine Meinung. Nachdem Motto: macht doch was ihr wollt.

Gruss
Thorsten

Gandalfus 14. Nov 2006 21:47

Re: BASS.DLL RecordingCallback in Klasse?
 
Zitat:

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

Das geht nicht. Man kan keine Methode übergeben weil die immer einen versteckten Parameter self hat. Das hatte ich auch mal als Kommentar in die BassdllPlayer geschrieben wurde wohl sinnvollerweise gelöscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 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