SDRPlay APIのCallback関数をC#から利用することができた。 相変わらず、デバッガで確認できただけ..。
ソースが長いけど、自分の為の備忘録として全部アップしておく。
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace SDRPlay_API_Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } const float APIVer = 3.09f; 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; sdrplay_api_Open(); sdrplay_api_ApiVersion(ref apiVer); if(apiVer != APIVer) { sdrplay_api_Close(); Environment.Exit(0); } sdrplay_api_LockDeviceApi(); sdrplay_api_GetDevices(ref devices, ref numdevs, maxDevs); sdrplay_api_SelectDevice(ref devices); 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(); IntPtr pdevParams = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(sdrplay_api_DevParamsT))); IntPtr prxChannelParamsA = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(sdrplay_api_RxChannelParamsT))); IntPtr prxChannelParamsB = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(sdrplay_api_RxChannelParamsT))); 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); 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)); Marshal.FreeHGlobal(pdevParams); Marshal.FreeHGlobal(prxChannelParamsA); Marshal.FreeHGlobal(prxChannelParamsB); // Marshal.FreeHGlobal(pdeviceParams); sdrplay_api_CallbackFnsT cbFns; cbFns.StreamACbFn = new sdrplay_api_StreamCallback_t(streamacbfunc); cbFns.StreamBCbFn = new sdrplay_api_StreamCallback_t(streambcbfunc); cbFns.EventCbFn = new sdrplay_api_EventCallback_t(eventcbfunc); IntPtr cbContext = IntPtr.Zero; sdrplay_api_Init(devices.dev, ref cbFns, cbContext); sdrplay_api_Close(); } void streamacbfunc(ref short xi, ref short xq, ref sdrplay_api_StreamCbParamsT cbparams, uint numSamples, uint reset, IntPtr cbContext) { } void streambcbfunc(ref short xi, ref short xq, ref sdrplay_api_StreamCbParamsT cbparams, uint numSamples, uint reset, IntPtr cbContext) { } void eventcbfunc(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, ref sdrplay_api_EventParamsT cbparams, IntPtr cbContext) { } } } |
コールバックメソッドには何も実装していないけど、numSamplesにサンプル数が格納されていたので、とりあえ動作していると思う。 また、pdeviceParamsに確保したメモリを解放しようとすると、エラーが出たので、とりあえずコメントアウトしている。
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
//sdrplay_api.h using System; using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { public enum sdrplay_api_ErrT { sdrplay_api_Success = 0, sdrplay_api_Fail = 1, sdrplay_api_InvalidParam = 2, sdrplay_api_OutOfRange = 3, sdrplay_api_GainUpdateError = 4, sdrplay_api_RfUpdateError = 5, sdrplay_api_FsUpdateError = 6, sdrplay_api_HwError = 7, sdrplay_api_AliasingError = 8, sdrplay_api_AlreadyInitialised = 9, sdrplay_api_NotInitialised = 10, sdrplay_api_NotEnabled = 11, sdrplay_api_HwVerError = 12, sdrplay_api_OutOfMemError = 13, sdrplay_api_ServiceNotResponding = 14, sdrplay_api_StartPending = 15, sdrplay_api_StopPending = 16, sdrplay_api_InvalidMode = 17, sdrplay_api_FailedVerification1 = 18, sdrplay_api_FailedVerification2 = 19, sdrplay_api_FailedVerification3 = 20, sdrplay_api_FailedVerification4 = 21, sdrplay_api_FailedVerification5 = 22, sdrplay_api_FailedVerification6 = 23, sdrplay_api_InvalidServiceVersion = 24 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DeviceT { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string SerNo; public byte hwVer; public sdrplay_api_TunerSelectT tuner; public sdrplay_api_RspDuoModeT rspDuoMode; public byte valid; public double rspDuoSampleFreq; public IntPtr dev; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DeviceParamsT { public IntPtr pdevParams; //sdrplay_api_DevParamsT public IntPtr prxChannelA; //sdrplay_api_RxChannelParamsT public IntPtr prxChannelB; //sdrplay_api_RxChannelParamsT } [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_Open", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_Open(); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_Close", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_Close(); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_ApiVersion", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_ApiVersion(ref float apiVer); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_LockDeviceApi", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_LockDeviceApi(); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_UnlockDeviceApi", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_UnlockDeviceApi(); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_GetDevices", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_GetDevices(ref sdrplay_api_DeviceT devices, ref uint numdevs, uint maxDevs); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_SelectDevice", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_SelectDevice(ref sdrplay_api_DeviceT device); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_ReleaseDevice", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_ReleaseDevice(ref sdrplay_api_DeviceT device); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_GetDeviceParams", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_GetDeviceParams(IntPtr dev, ref IntPtr deviceParams); // (HANDLE dev, sdrplay_api_DeviceParamsT **deviceParams) [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_Init", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_Init(IntPtr dev, ref sdrplay_api_CallbackFnsT callbackFns, IntPtr cbContext); [DllImport("sdrplay_api.dll", EntryPoint = "sdrplay_api_Uninit", CallingConvention = CallingConvention.Cdecl)] private static extern sdrplay_api_ErrT sdrplay_api_Uninit(IntPtr dev); } } |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
// sdrplay_api_callback.h using System; using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { public enum sdrplay_api_PowerOverloadCbEventIdT { sdrplay_api_Overload_Detected = 0, sdrplay_api_Overload_Corrected = 1 } public enum sdrplay_api_RspDuoModeCbEventIdT { sdrplay_api_MasterInitialised = 0, sdrplay_api_SlaveAttached = 1, sdrplay_api_SlaveDetached = 2, sdrplay_api_SlaveInitialised = 3, sdrplay_api_SlaveUninitialised = 4, sdrplay_api_MasterDllDisappeared = 5, sdrplay_api_SlaveDllDisappeared = 6 } public enum sdrplay_api_EventT { sdrplay_api_GainChange = 0, sdrplay_api_PowerOverloadChange = 1, sdrplay_api_DeviceRemoved = 2, sdrplay_api_RspDuoModeChange = 3 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_GainCbParamT { public uint gRdB; public uint lnaGRdB; public double currGain; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_PowerOverloadCbParamT { public sdrplay_api_PowerOverloadCbEventIdT poweOverloadChangeType; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RspDuoModeCbParamT { public sdrplay_api_RspDuoModeCbEventIdT modeChangeType; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_StreamCbParamsT { public uint firstSampleNum; public int grChanged; public int rfChanged; public int fsChanged; public uint numSamples; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_CallbackFnsT { public sdrplay_api_StreamCallback_t StreamACbFn; public sdrplay_api_StreamCallback_t StreamBCbFn; public sdrplay_api_EventCallback_t EventCbFn; } [StructLayout(LayoutKind.Explicit)] public struct sdrplay_api_EventParamsT { [FieldOffset(0)] public sdrplay_api_GainCbParamT gainParams; [FieldOffset(0)] public sdrplay_api_PowerOverloadCbParamT powerOverloadParams; [FieldOffset(0)] public sdrplay_api_RspDuoModeCbParamT rspDuoModeParams; } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void sdrplay_api_StreamCallback_t(ref short xi, ref short xq, ref sdrplay_api_StreamCbParamsT cbparams, uint numsSmaples, uint reset, IntPtr cbContext); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void sdrplay_api_EventCallback_t(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, ref sdrplay_api_EventParamsT cbparams, IntPtr cbContext); } } |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
// sdrplay_api_control.h using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { public enum sdrplay_api_AgcControlT { sdrplay_api_AGC_DISABLE = 0, sdrplay_api_AGC_100HZ = 1, sdrplay_api_AGC_50HZ = 2, sdrplay_api_AGC_5HZ = 3, sdrplay_api_AGC_CTRL_EN = 4 } public enum sdrplay_api_AdsbModeT { sdrplay_api_ADSB_DECIMATION = 0, sdrplay_api_ADSB_NO_DECIMATION_LOWPASS = 1, sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_2MHZ = 2, sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_3MHZ = 3 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DcOffsetT { public byte DCenable; public byte IQenable; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DecimationT { public byte enable; public byte decimationFactor; public byte wideBandSignal; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_AgcT { public sdrplay_api_AgcControlT enable; public int setPoint_dBfs; public ushort attack_ms; public ushort decay_ms; public ushort decay_delay_ms; public ushort decay_threshold_dB; public int syncUpdate; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_ControlParamsT { public sdrplay_api_DcOffsetT dcOffset; public sdrplay_api_DecimationT decimation; public sdrplay_api_AgcT agc; public sdrplay_api_AdsbModeT absdMode; } } } |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
// sdrplay_api_dev.h using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { public enum sdrplay_api_TransferModeT { sdrplay_api_ISOCH = 0, sdrplay_api_BULK = 1 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_FsFreqT { public double fsHz; public byte syncUpdate; public byte reCal; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_SyncUpdateT { public uint sampleNum; public uint period; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_ResetFlagsT { public byte resetGainUpdate; public byte resetRfUpdate; public byte resetFsUpdate; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DevParamsT { public double ppm; public sdrplay_api_FsFreqT fsFreq; public sdrplay_api_SyncUpdateT syncUpdate; public sdrplay_api_ResetFlagsT resetFlags; public sdrplay_api_TransferModeT mode; public uint samplesPerPkt; public sdrplay_api_Rsp1aParamsT rsp1aParams; public sdrplay_api_Rsp2ParamsT rsp2Params; public sdrplay_api_RspDuoParamsT rspDuoParams; public sdrplay_api_RspDxParamsT rspDxParams; } } } |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
// sdrplay_api_rsp1a.h, sdrplay_api_rsp2.h, sdrplay_api_rspDuo.h, sdrplay_api_rspDx.h using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { // sdrplay_api_rsp1a.h [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_Rsp1aParamsT { public byte rfNotchEnable; public byte DabNotchEnable; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_Rsp1aTunerParamsT { public byte biasTEnable; } // sdrplay_api_rsp2.h public enum sdrplay_api_Rsp2_AntennaSelectT { sdrplay_api_Rsp2_ANTENNA_A = 5, sdrplay_api_Rsp2_ANTENNA_B = 6 } public enum sdrplay_api_Rsp2_AmPortSelectT { sdrplay_api_Rsp2_AMPORT_1 = 1, sdrplay_api_Rsp2_AMPORT_2 = 0 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_Rsp2ParamsT { public byte extRefOutputEn; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_Rsp2TunerParamsT { public byte biasTenable; public sdrplay_api_Rsp2_AmPortSelectT amPortSel; public sdrplay_api_Rsp2_AntennaSelectT antennaSel; public byte rfNotchEnable; } // sdrplay_api_rspDuo.h public enum sdrplay_api_RspDuoModeT { sdrplay_api_RspDuoMode_Unknown = 0, sdrplay_api_RspDuoMode_Single_Tuner = 1, sdrplay_api_RspDuoMode_Dual_Tuner = 2, sdrplay_api_RspDuoMode_Master = 4, sdrplay_api_RspDuoMode_Slave = 8 } public enum sdrplay_api_RspDuo_AmPortSelectT { sdrplay_api_RspDuo_AMPORT_1 = 1, sdrplay_api_RspDuo_AMPORT_2 = 0 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RspDuoParamsT { public byte extRefOutputEn; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RspDuoTunerParamsT { public byte biasTEnable; public sdrplay_api_RspDuo_AmPortSelectT tuner1AmPortSel; public byte tuner1AmNotchEnable; public byte rfNotchEnable; public byte rfDabNotchEnable; } // sdrplay_api_RspDx.h public enum sdrplay_api_RspDx_AntennaSelectT { sdrplay_api_RspDx_ANTENNA_A = 0, sdrplay_api_RspDx_ANTENNA_B = 1, sdrplay_api_RspDx_ANTENNA_C = 2 } public enum sdrplay_api_RspDx_HdrModeBwT { sdrplay_api_RspDx_HDRMODE_BW_0_200 = 0, sdrplay_api_RspDx_HDRMODE_BW_0_500 = 1, sdrplay_api_RspDx_HDRMODE_BW_1_200 = 2, sdrplay_api_RspDx_HDRMODE_BW_1_700 = 3 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RspDxParamsT { public byte hdrEnable; public byte biasTEnable; public sdrplay_api_RspDx_AntennaSelectT antennaSel; public byte rfNotchEnable; public byte DabNotchEnable; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RspDxTunerParamsT { public sdrplay_api_RspDx_HdrModeBwT antennaSel; } } } |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
// sdrplay_api_rx_channel.h, sdrplay_api_tuner.h using System.Runtime.InteropServices; namespace SDRPlay_API_Test { partial class Form1 { // sdrplay_api_rx_channel.h [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RxChannelParamsT { public sdrplay_api_TunerParamsT tunerParams; public sdrplay_api_ControlParamsT ctrlParams; public sdrplay_api_Rsp1aTunerParamsT rsp1aTunerParams; public sdrplay_api_Rsp2TunerParamsT rsp2TunerParams; public sdrplay_api_RspDuoTunerParamsT rspDuoTunerParams; public sdrplay_api_RspDxTunerParamsT rspDxTunerParams; } // sdrplay_api_tuner.h public enum sdrplay_api_Bw_MHzT { sdrplay_api_BW_Undefined = 0, sdrplay_api_BW_0_200 = 200, sdrplay_api_BW_0_300 = 300, sdrplay_api_BW_0_600 = 600, sdrplay_api_BW_1_536 = 1536, sdrplay_api_BW_5_000 = 5000, sdrplay_api_BW_6_000 = 6000, sdrplay_api_BW_7_000 = 7000, sdrplay_api_BW_8_000 = 8000 } public enum sdrplay_api_If_kHzT { sdrplay_api_IF_Undefined = -1, sdrplay_api_IF_Zero = 0, sdrplay_api_IF_0_450 = 450, sdrplay_api_IF_1_620 = 1620, sdrplay_api_IF_2_048 = 2048 } public enum sdrplay_api_LoModeT { sdrplay_api_LO_Undefined = 0, sdrplay_api_LO_Auto = 1, sdrplay_api_LO_120MHz = 2, sdrplay_api_LO_144MHz = 3, sdrplay_api_LO_168MHz = 4 } public enum sdrplay_api_MinGainReductionT { sdrplay_api_EXTENDED_MIN_GR = 0, sdrplay_api_NORMAL_MIN_GR = 20 } public enum sdrplay_api_TunerSelectT { sdrplay_api_Tuner_Neither = 0, sdrplay_api_Tuner_A = 1, sdrplay_api_Tuner_B = 2, sdrplay_api_Tuner_Both = 3 } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_GainValuesT { float curr; float max; float min; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_GainT { int gRdB; byte LNAstate; byte syncUpdate; sdrplay_api_MinGainReductionT minGr; sdrplay_api_GainValuesT gainVals; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_RfFreqT { double rfHz; byte syncUpdate; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_DcOffsetTunerT { byte dcCal; byte speedUp; int trackTime; int refreshRateTime; } [StructLayout(LayoutKind.Sequential)] public struct sdrplay_api_TunerParamsT { sdrplay_api_Bw_MHzT bwType; sdrplay_api_If_kHzT ifType; sdrplay_api_LoModeT loMode; sdrplay_api_GainT gain; sdrplay_api_RfFreqT rfFreq; sdrplay_api_DcOffsetTunerT dcOffsetTuner; } } } |
音が出るようになるまでには、相当先が長いけど、ちょっと疲れてきたなぁ..