Hi, when you use core.windows and LoadLibrary to load a DLL, and that DLL will create a new thread and inside that it will call back into your D app, is there something to special to be aware of?

I've done it like with the CreateWindow and WndProc, but this time I'm loading a compiled portaudio DLL and I give it a call back. And I try to catch errors, but no matter what D Exception (I tried out of range and null dereferencing) that thread seems to either die silently (no hints in my console) or somehow fail to make portaudio go on calling (I don't think so).

I just wanted to ask if you know any pitfall with this... I'll go on using windbg and looking at things. I guess I should post a complete project, but I have to clean it up, and you maybe don't want to execute that portaudio32bit.dll from some unknown github account.

The function for Portaudio looks like that:

extern(C) nothrow int patestCallback(
        const void* inputBuffer,
        void* outputBuffer,
        uint framesPerBuffer,
        const PaStreamCallbackTimeInfo* timeInfo,
        PaStreamCallbackFlags statusFlags,
        void* userData)
{
        auto data = cast(paTestData*)userData;
        auto out_ = cast(float*)outputBuffer;

        auto ce = collectException(
                data.callback(
                        data.frames_per_buffer,
                        &data.left_buf[0],
                        &data.right_buf[0]));
        if(ce !is null)
        {
                assumeWontThrow(writeln(ce.toString));
                TerminateProcess(GetCurrentProcess(), 0);               
        } else
        {
                assumeWontThrow(writeln("ce is null"));
        }
        
        for(uint i = 0; i < framesPerBuffer; ++i)
        {
                *out_++ = data.left_buf[i];
                *out_++ = data.right_buf[i];
        }

        return PaStreamCallbackResult.paContinue;
}

...
...

I give it to Portaudio like that

        { auto err = Pa_OpenStream(
                &stream,
                null,
                &outputParameters,
                frames_per_second,
                frames_per_buffer,
                paClipOff,
                &patestCallback,
                &data);

Reply via email to