unit ASIO.ASIOStdCall;
{$mode delphi}{$H+}
interface
uses
Windows, Classes, SysUtils, ASIO.ASIODef,
ActiveX;
const
cASIO4AllCLSID: TGUID = '{232685C6-6548-49D8-846D-4141A3EF7560}';
type
// Attention: this inteface is in calling convention ThisCall
// not supported by Free Pascal yet
IASIO = interface(IUnknown)
function Init(SysHandle: HWND): TASIOBool;
procedure GetDriverName(Name: pansichar);
function GetDriverVersion(): longint;
procedure GetErrorMessage(Errstring: pansichar);
function Start(): TASIOError;
function Stop(): TASIOError;
function GetChannels(out NumInputChannels, NumOutputChannels: longint): TASIOError;
function GetLatencies(out InputLatency, OutputLatency: longint): TASIOError;
function GetBufferSize(MinSize, MaxSize, PreferredSize, Granularity: Plongint): TASIOError;
function CanSampleRate(SampleRate: TASIOSampleRate): TASIOError;
function GetSampleRate(out SampleRate: TASIOSampleRate): TASIOError;
function SetSampleRate(SampleRate: TASIOSampleRate): TASIOError;
function GetClockSources(Clocks: PASIOClockSource; out NumSources: longint): TASIOError;
function SetClockSource(Reference: longint): TASIOError;
function GetSamplePosition(sPos: PASIOSamples; tStamp: PASIOTimeStamp): TASIOError;
function GetChannelInfo(Info: PASIOChannelInfo): TASIOError;
function CreateBuffers(BufferInfos: PASIOBufferInfo; NumChannels: longint; BufferSize: longint; callbacks: PASIOCallbacks): TASIOError;
function DisposeBuffers(): TASIOError;
function ControlPanel(): TASIOError;
function Future(Selector: longint; opt: pointer): TASIOError;
function OutputReady(): TASIOError;
end;
PASIO = ^IASIO;
{ TASIO }
TASIO = class(TObject)
protected
FASIODriverThisCall: IASIO;
public
constructor Create(ClassID: TGUID);
destructor Destroy; override;
public
function Init(SysHandle: HWND): TASIOBool; stdcall;
procedure GetDriverName(Name: pansichar); stdcall;
function GetDriverVersion(): longint; stdcall;
procedure GetErrorMessage(Errstring: pansichar); stdcall;
function Start(): TASIOError; stdcall;
function Stop(): TASIOError; stdcall;
function GetChannels(out NumInputChannels, NumOutputChannels: longint): TASIOError; stdcall;
function GetLatencies(out InputLatency, OutputLatency: longint): TASIOError; stdcall;
function GetBufferSize(MinSize, MaxSize, PreferredSize, Granularity: Plongint): TASIOError; stdcall;
function CanSampleRate(SampleRate: TASIOSampleRate): TASIOError; stdcall;
function GetSampleRate(out SampleRate: TASIOSampleRate): TASIOError; stdcall;
function SetSampleRate(SampleRate: TASIOSampleRate): TASIOError; stdcall;
function GetClockSources(Clocks: PASIOClockSource; out NumSources: longint): TASIOError; stdcall;
function SetClockSource(Reference: longint): TASIOError; stdcall;
function GetSamplePosition(sPos: PASIOSamples; tStamp: PASIOTimeStamp): TASIOError; stdcall;
function GetChannelInfo(Info: PASIOChannelInfo): TASIOError; stdcall;
function CreateBuffers(BufferInfos: PASIOBufferInfo; NumChannels: longint; BufferSize: longint;
callbacks: PASIOCallbacks): TASIOError; stdcall;
function DisposeBuffers(): TASIOError; stdcall;
function ControlPanel(): TASIOError; stdcall;
function Future(Selector: longint; opt: pointer): TASIOError; stdcall;
function OutputReady(): TASIOError; stdcall;
end;
implementation
{ TASIO }
constructor TASIO.Create(ClassID: TGUID);
var
hr: HResult;
begin
hr := CoInitialize(nil); // initialize COM
hr := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER, ClassID, FASIODriverThisCall);
end;
destructor TASIO.Destroy;
begin
FASIODriverThisCall:=nil;
inherited Destroy;
end;
{$asmMode intel}
function TASIO.Init(SysHandle: HWND): TASIOBool; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR SysHandle
MOV EAX, DWORD PTR [ECX]
CALL [EAX+12]
MOV [result],EAX
end;
end;
procedure TASIO.GetDriverName(Name: pansichar); stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR Name
MOV EAX, DWORD PTR [ECX]
CALL [EAX+16]
end;
end;
function TASIO.GetDriverVersion(): longint; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+20]
MOV [result],EAX
end;
end;
procedure TASIO.GetErrorMessage(Errstring: pansichar); stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR Errstring
MOV EAX, DWORD PTR [ECX]
CALL [EAX+24]
end;
end;
function TASIO.Start(): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+28]
MOV [result],EAX
end;
end;
function TASIO.Stop(): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+32]
MOV [result],EAX
end;
end;
function TASIO.GetChannels(out NumInputChannels, NumOutputChannels: longint): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR NumOutputChannels
PUSH DWORD PTR NumInputChannels
MOV EAX, DWORD PTR [ECX]
CALL [EAX+36]
MOV [result],EAX
end;
end;
function TASIO.GetLatencies(out InputLatency, OutputLatency: longint): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR OutputLatency
PUSH DWORD PTR InputLatency
MOV EAX, DWORD PTR [ECX]
CALL [EAX+40]
MOV [result],EAX
end;
end;
function TASIO.GetBufferSize(MinSize, MaxSize, PreferredSize, Granularity: Plongint): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR Granularity
PUSH DWORD PTR PreferredSize
PUSH DWORD PTR MaxSize
PUSH DWORD PTR MinSize
MOV EAX, DWORD PTR [ECX]
CALL [EAX+44]
MOV [result],EAX
end;
end;
function TASIO.CanSampleRate(SampleRate: TASIOSampleRate): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR SampleRate
PUSH DWORD PTR SampleRate
MOV EAX, DWORD PTR [ECX]
CALL [EAX+48]
MOV [result],EAX
end;
end;
function TASIO.GetSampleRate(out SampleRate: TASIOSampleRate): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR SampleRate
MOV EAX, DWORD PTR [ECX]
CALL [EAX+52]
MOV [result],EAX
end;
end;
function TASIO.SetSampleRate(SampleRate: TASIOSampleRate): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR SampleRate
PUSH DWORD PTR SampleRate
MOV EAX, DWORD PTR [ECX]
CALL [EAX+56]
MOV [result],EAX
end;
end;
function TASIO.GetClockSources(Clocks: PASIOClockSource; out NumSources: longint): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR NumSources
PUSH DWORD PTR Clocks
MOV EAX, DWORD PTR [ECX]
CALL [EAX+60]
MOV [result],EAX
end;
end;
function TASIO.SetClockSource(Reference: longint): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR Reference
MOV EAX, DWORD PTR [ECX]
CALL [EAX+64]
MOV [result],EAX
end;
end;
function TASIO.GetSamplePosition(sPos: PASIOSamples; tStamp: PASIOTimeStamp): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR tStamp
PUSH DWORD PTR sPos
MOV EAX, DWORD PTR [ECX]
CALL [EAX+68]
MOV [result],EAX
end;
end;
function TASIO.GetChannelInfo(Info: PASIOChannelInfo): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR Info
MOV EAX, DWORD PTR [ECX]
CALL [EAX+72]
MOV [result],EAX
end;
end;
function TASIO.CreateBuffers(BufferInfos: PASIOBufferInfo; NumChannels: longint; BufferSize: longint;
callbacks: PASIOCallbacks): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR callbacks
PUSH DWORD PTR BufferSize
PUSH DWORD PTR NumChannels
PUSH DWORD PTR BufferInfos
MOV EAX, DWORD PTR [ECX]
CALL [EAX+76]
MOV [result],EAX
end;
end;
function TASIO.DisposeBuffers(): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+80]
MOV [result],EAX
end;
end;
function TASIO.ControlPanel(): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+84]
MOV [result],EAX
end;
end;
function TASIO.Future(Selector: longint; opt: pointer): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
PUSH DWORD PTR opt
PUSH DWORD PTR Selector
MOV EAX, DWORD PTR [ECX]
CALL [EAX+88]
MOV [result],EAX
end;
end;
function TASIO.OutputReady(): TASIOError; stdcall;
var
x: IASIO;
begin
x := FASIODriverThisCall;
asm
MOV ECX, x
MOV EAX, DWORD PTR [ECX]
CALL [EAX+92]
MOV [result],EAX
end;
end;
end.