diff --git a/reactos/lib/drivers/sound/CMakeLists.txt b/reactos/lib/drivers/sound/CMakeLists.txt index b5970faa605..36640c190e2 100644 --- a/reactos/lib/drivers/sound/CMakeLists.txt +++ b/reactos/lib/drivers/sound/CMakeLists.txt @@ -5,4 +5,5 @@ add_subdirectory(mment4) add_subdirectory(mmixer) add_subdirectory(shared) #add_subdirectory(soundblaster) Nothing links to this lib. +add_subdirectory(stdunk) add_subdirectory(uartmidi) diff --git a/reactos/lib/drivers/sound/stdunk/CMakeLists.txt b/reactos/lib/drivers/sound/stdunk/CMakeLists.txt new file mode 100644 index 00000000000..0e2c29d49f2 --- /dev/null +++ b/reactos/lib/drivers/sound/stdunk/CMakeLists.txt @@ -0,0 +1,10 @@ + +set_cpp() + +add_library(stdunk STATIC cunknown.cpp) + +if(MSVC) + add_target_compile_flags(stdunk "/GR-") +else() + add_target_compile_flags(stdunk "-fno-exceptions -fno-rtti") +endif() diff --git a/reactos/lib/drivers/sound/stdunk/cunknown.cpp b/reactos/lib/drivers/sound/stdunk/cunknown.cpp new file mode 100644 index 00000000000..d97e6405481 --- /dev/null +++ b/reactos/lib/drivers/sound/stdunk/cunknown.cpp @@ -0,0 +1,72 @@ +/* + ReactOS Kernel-Mode COM + IUnknown implementations + + LICENSE + Please see COPYING in the top-level directory for license information. + + AUTHORS + Andrew Greenwood +*/ + +#include + +CUnknown::CUnknown(PUNKNOWN outer_unknown) +{ + m_ref_count = 0; + + if ( outer_unknown ) + m_outer_unknown = outer_unknown; + else + m_outer_unknown = PUNKNOWN(dynamic_cast(this)); +} + +CUnknown::~CUnknown() +{ +} + +STDMETHODIMP_(ULONG) +CUnknown::NonDelegatingAddRef() +{ + InterlockedIncrement(&m_ref_count); + return m_ref_count; +} + +STDMETHODIMP_(ULONG) +CUnknown::NonDelegatingRelease() +{ + if ( InterlockedDecrement(&m_ref_count) == 0 ) + { + m_ref_count ++; + delete this; + return 0; + } + + return m_ref_count; +} + +STDMETHODIMP_(NTSTATUS) +CUnknown::NonDelegatingQueryInterface( + IN REFIID iid, + PVOID* ppVoid) +{ + /* FIXME */ + #if 0 + if ( IsEqualGUID(iid, IID_IUnknown) ) /* TODO: Aligned? */ + *ppVoid = PVOID(PUNKNOWN(this)); + else + *ppVoid = NULL; + #endif + + if ( *ppVoid ) + { + PUNKNOWN(*ppVoid)->AddRef(); + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + +#if __GNUC__ +extern "C" void __cxa_pure_virtual() { ASSERT(FALSE); } +#endif