On 8/28/17 7:47 PM, Johnson Jones wrote:
On Monday, 28 August 2017 at 21:35:27 UTC, Steven Schveighoffer wrote:
On 8/27/17 10:17 PM, Johnson Jones wrote:
Looking at the assembly shows something like this:
0041ea98 push 0x0
0041ea9a push 0x0
0041ea9c push 0x0
0041ea9e push dword 0x100
0041eaa3 mov ecx, [typeid(PaStreamParameters)+0xe36fc (0x80d4cc)]
0041eaa9 mov eax, [fs:0x2c]
0041eaaf mov edx, [eax+ecx*4]
0041eab2 push dword [edx+0x1c]
0041eab8 push dword [edx+0x18]
0041eabe push dword [ebp-0x54]
0041eac1 push dword [ebp-0x5c]
0041eac4 mov ebx, PA.stream (0x823f30)
0041eac9 push ebx
0041eaca call dword near [Pa_OpenStream (0x823f18)]
I noticed that those 0's were the values being fed in to the function.
I remember converting c_ulong's to ulong's and that they were
probably uint's in D. Converting those fixed the problem and the
callback is now called! I converted all the ulongs to uint's but
there were a few longs and I don't know if they are c_longs or
d_longs...
Anyways, At least I'm on the right track.
For C/C++ interaction, always use c_... types if they are available.
The idea is both that they will be correctly defined for the width,
and also it will mangle correctly for C++ compilers (yes, long and int
are mangled differently even when they are the same thing).
In portaudio, this doesn't seem to be the case. I changed all the longs
to ints and ran my code in x64 and it worked fine.
It may just be that the stuff that uses long is not used in my code. In
port audio I see it using unsigned long and so this should be 64-bits in
x64. Surprised it worked. Maybe conversion is taking place or the high
bits of the long are 0'ed and so there is not much difference.
Then I think possibly the port audio bindings are not correct. It's also
possible that long is not 64-bit even on the platform you are using.
Finally, it's also possible that the D compiler is not generating the
call correctly.
When I test on my mac, c_long is 8-bytes. I'm not sure what it is in
your case, try this code and see what happens:
import core.stdc.config;
pragma(msg, c_long.sizeof); // prints 8 on my box.
And in c:
#include <stdio.h>
int main()
{
printf("%lu\n", sizeof(long)); // also prints 8 on my box
return 0;
}
They should match. If they don't, that's a D bug (in either
core.stdc.config or the compiler, I'm not sure which). If they do, then
one of the other two possibilities is happening, and I would lean
towards the bindings being incorrect.
-Steve