confirmed working with P/invoke on windows .NET Core C#

main
Patrick W3AXL 1 year ago
parent d6c59be715
commit a9a2a17d23

3
.gitignore vendored

@ -33,3 +33,6 @@
# Build directory
build/
# VS stuff
.vs/

@ -16,6 +16,11 @@ project(dvmvocoder)
set(CMAKE_STATIC_LIBRARY_PREFIX "")
set(CMAKE_SHARED_LIBRARY_PREFIX "")
# Set up export symbols (Windows only)
if(WIN32)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
#
# Build Vocoder as a Shared Library (dll or so)
#

@ -16,7 +16,8 @@
#include "MBEDecoder.h"
using namespace edac;
using namespace vocoder;
namespace vocoder {
// ---------------------------------------------------------------------------
// Constants
@ -314,3 +315,29 @@ int32_t MBEDecoder::decode(uint8_t* codeword, int16_t samples[])
return errs;
}
// Extern methods for C#/C++ interop
MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode)
{
return new MBEDecoder(mode);
}
int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples)
{
if (pDecoder != NULL)
{
return pDecoder->decode(codeword, samples);
}
return -1;
}
void MBEDecoder_Delete(MBEDecoder* pDecoder)
{
if (pDecoder != NULL)
{
delete pDecoder;
pDecoder = NULL;
}
}
} // namespace vocoder

@ -138,9 +138,17 @@ namespace vocoder
};
// Extern methods for C#/C++ interop
extern "C" MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode) { return new MBEDecoder(mode); }
extern "C" int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples) { return pDecoder->decode(codeword, samples); }
extern "C" void MBEDecoder_Delete(MBEDecoder* pDecoder) { delete pDecoder; }
extern "C" {
#ifdef _WIN32
extern __declspec(dllexport) MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode);
extern __declspec(dllexport) int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples);
extern __declspec(dllexport) void MBEDecoder_Delete(MBEDecoder* pDecoder);
#else
extern MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode);
extern int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples);
extern void MBEDecoder_Delete(MBEDecoder* pDecoder);
#endif
}
} // namespace vocoder

@ -44,12 +44,13 @@
#include <cassert>
using namespace edac;
using namespace vocoder;
#ifdef _MSC_VER
#pragma warning(disable: 4244)
#endif
namespace vocoder {
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -716,3 +717,24 @@ void MBEEncoder::encode(int16_t* samples, uint8_t* codeword)
::memcpy(codeword, dmrAMBE, 9U);
}
}
// Extern methods for C#/C++ interop
MBEEncoder* MBEEncoder_Create(MBE_ENCODER_MODE mode)
{
return new MBEEncoder(mode);
}
void MBEEncoder_Encode(MBEEncoder* pEncoder, int16_t* samples, uint8_t* codeword)
{
if (pEncoder != NULL)
{
pEncoder->encode(samples, codeword);
}
}
void MBEEncoder_Delete(MBEEncoder* pEncoder)
{
delete pEncoder;
pEncoder = NULL;
}
} // namespace vocoder

@ -81,9 +81,17 @@ namespace vocoder
};
// Extern methods for C#/C++ interop
extern "C" MBEEncoder* MBEEncoder_Create(MBE_ENCODER_MODE mode) { return new MBEEncoder(mode); }
extern "C" void MBEEncoder_Encode(MBEEncoder* pEncoder, int16_t* samples, uint8_t* codeword) { pEncoder->encode(samples, codeword); }
extern "C" void MBEEncoder_Delete(MBEEncoder* pEncoder) { delete pEncoder; }
extern "C" {
#ifdef _WIN32
__declspec(dllexport) MBEEncoder* MBEEncoder_Create(MBE_ENCODER_MODE mode);
__declspec(dllexport) void MBEEncoder_Encode(MBEEncoder* pEncoder, int16_t* samples, uint8_t* codeword);
__declspec(dllexport) void MBEEncoder_Delete(MBEEncoder* pEncoder);
#else
MBEEncoder* MBEEncoder_Create(MBE_ENCODER_MODE mode);
void MBEEncoder_Encode(MBEEncoder* pEncoder, int16_t* samples, uint8_t* codeword);
void MBEEncoder_Delete(MBEEncoder* pEncoder);
#endif
}
} // namespace vocoder

Loading…
Cancel
Save

Powered by TurnKey Linux.