Sdrplay APIで、デバイスパラメータが取得できた。 ポインタを含む構造体とか、ダブルポインタとかあって、相当手古摺ったんだけど、ようやくできた。 デバッグレベルだけど..。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
private void button1_Click(object sender, EventArgs e) { float apiVer = 0f; sdrplay_api_DeviceT devices = new sdrplay_api_DeviceT(); uint numdevs = 0; uint maxDevs = 1; var result1 = sdrplay_api_Open(); var result2 = sdrplay_api_ApiVersion(ref apiVer); var result3 = sdrplay_api_LockDeviceApi(); var result4 = sdrplay_api_GetDevices(ref devices, ref numdevs, maxDevs); var result5 = sdrplay_api_SelectDevice(ref devices); var result6 = sdrplay_api_UnlockDeviceApi(); sdrplay_api_DeviceParamsT deviceParams = new sdrplay_api_DeviceParamsT(); sdrplay_api_DevParamsT devParams = new sdrplay_api_DevParamsT(); sdrplay_api_RxChannelParamsT rxChannelParamsA = new sdrplay_api_RxChannelParamsT(); sdrplay_api_RxChannelParamsT rxChannelParamsB = new sdrplay_api_RxChannelParamsT(); var size1 = Marshal.SizeOf(typeof(sdrplay_api_DevParamsT)); var size2 = Marshal.SizeOf(typeof(sdrplay_api_RxChannelParamsT)); IntPtr pdevParams = Marshal.AllocHGlobal(size1); IntPtr prxChannelParamsA = Marshal.AllocHGlobal(size2); IntPtr prxChannelParamsB = Marshal.AllocHGlobal(size2); Marshal.StructureToPtr(devParams, pdevParams, false); Marshal.StructureToPtr(rxChannelParamsA, prxChannelParamsA, false); Marshal.StructureToPtr(rxChannelParamsB, prxChannelParamsB, false); deviceParams.pdevParams = pdevParams; deviceParams.prxChannelA = prxChannelParamsA; deviceParams.prxChannelB = prxChannelParamsB; IntPtr pdeviceParams = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(sdrplay_api_DeviceParamsT))); Marshal.StructureToPtr(deviceParams, pdeviceParams, false); var result7 = sdrplay_api_GetDeviceParams(devices.dev, ref pdeviceParams); deviceParams = (sdrplay_api_DeviceParamsT)Marshal.PtrToStructure(pdeviceParams, typeof(sdrplay_api_DeviceParamsT)); devParams = (sdrplay_api_DevParamsT)Marshal.PtrToStructure(deviceParams.pdevParams, typeof(sdrplay_api_DevParamsT)); rxChannelParamsA = (sdrplay_api_RxChannelParamsT)Marshal.PtrToStructure(deviceParams.prxChannelA, typeof(sdrplay_api_RxChannelParamsT)); var result8 = sdrplay_api_Close(); } |
デバッグのために、戻り値をいちいち取得したり、メモリブロックのサイズを確認するために冗長なコードになっている。
デバッガでdevParamsの中身を確認すると、ちゃんとパラメータが取得できていた。
ポインタやダブルポインタの引数の渡し方は、結局、IntPtr変数に必要な大きさのメモリブロックをAllocHGlobal関数で取得し、そのメモリブロックに構造体をStructureToPtr関数でコピーして、ポインタの場合はそのまま渡し、ダブルポインタの場合は、IntPtr変数を参照渡ししてやればいいみたい。
一応これで、必要な関数は揃ったので、後は、コールバック関数を書いてやれば、I/Q信号が取得できると思う。