I don't have a minimal working example right now so I'll just have to show you 
the client code and the C function prototype. I have a C++ DLL with a C 
interface for some of its functions and I am dynamically loading it in my D 
application. Here's some code with the usual DLL loading bits left out:

alias extern(C) void function(float** inputs) ProcessProc;
// Some code that loads the DLL, calls Windows' GetProcAddress.. and now we 
have a function pointer processFunc:
ProcessProc processFunc;

I have no trouble passing single pointer parameters to C functions, and even 
callback functions. But I haven't figured out an elegant way of passing 
multidimensional arrays to functions expecting pointers to pointers. I've tried 
forcing a 2-dimensional array with a cast, or even changing the function 
pointer signature to *fake* that it takes a 2-dimensional array and not a 
ptr-2-ptr, but that doesn't work properly as the C code ends up working only 
partially and I get back an access violation. 

So my calling code looks like the following. Disregard that I'm using GC's 
malloc and not std.c.stdlib.malloc for now please :) :

float[][] _inputs;
float** inputs;

enum numInputs = 4;
enum kBlockSize = 512;

_inputs = new float[][](numInputs, kBlockSize);

// we would now fill the inputs with some random data

inputs = cast(float**)GC.malloc((float*).sizeof * numInputs);

foreach (index; 0 .. numInputs)
{
    inputs[index] = _inputs[index].ptr;
}

// some loop that runs for a number of cycles, im using while true just for 
demonstration
while (true)
{
    processFunc(inputs);
}

I don't want to leave you in the dark, so let me explain. I'm using the popular 
VST plugin standard, which is used for digital audio plugin effects. The loaded 
DLL can be any DLL file that conforms to this standard and has a certain number 
and type of functions ready to be called from the client code. 

Basically how it's used is: I send a pointer to a number of buffers to the 
DLL's processing function, and the effect does some processing on the data and 
writes it back to the buffers.

If it's necessary I'll try to write a simplified C DLL and calling code to show 
what's wrong.

P.S. (for those in the know) I have a fully working Host example that can load 
VST instruments/effects, check their capabilities, do some processing, and load 
their GUI (if they have one). I have not ported any VST classes used to build 
the VST instruments yet.

P.P.S. I also have a working ASIO Host, however it's only a wrapper around the 
C++ classes. I'm currently having huge issues with COM, and I'm not yet sure if 
there's a bug in DMD or in my implementation.

P.P.P.S. Hopefully I'll be able to provide a clean implementation of both VST 
and ASIO, and after the necessary registration at Steinberg I'll create a 
repository for the projects. Wish me luck. :>

Reply via email to