ASIO to JACK driver for WINE
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
5.2KB

  1. /*
  2. * Copyright (C) 2006 Robert Reif
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with this library; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  17. */
  18. #include <stdarg.h>
  19. #include "windef.h"
  20. #include "winbase.h"
  21. #include "winuser.h"
  22. #include "winreg.h"
  23. #include "objbase.h"
  24. #include "wine/debug.h"
  25. WINE_DEFAULT_DEBUG_CHANNEL(asio);
  26. // {48D0C522-BFCC-45cc-8B84-17F25F33E6E8}
  27. static GUID const CLSID_WineASIO = {
  28. 0x48d0c522, 0xbfcc, 0x45cc, { 0x8b, 0x84, 0x17, 0xf2, 0x5f, 0x33, 0xe6, 0xe8 } };
  29. typedef struct {
  30. const IClassFactoryVtbl * lpVtbl;
  31. LONG ref;
  32. } IClassFactoryImpl;
  33. extern HRESULT asioCreateInstance(REFIID riid, LPVOID *ppobj);
  34. /*******************************************************************************
  35. * ClassFactory
  36. */
  37. static HRESULT WINAPI
  38. CF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj)
  39. {
  40. IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
  41. FIXME("(%p, %s, %p) stub!\n", This, debugstr_guid(riid), ppobj);
  42. if (ppobj == NULL)
  43. return E_POINTER;
  44. return E_NOINTERFACE;
  45. }
  46. static ULONG WINAPI CF_AddRef(LPCLASSFACTORY iface)
  47. {
  48. IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
  49. ULONG ref = InterlockedIncrement(&(This->ref));
  50. TRACE("(%p) ref was %ld\n", This, ref - 1);
  51. return ref;
  52. }
  53. static ULONG WINAPI CF_Release(LPCLASSFACTORY iface)
  54. {
  55. IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
  56. ULONG ref = InterlockedDecrement(&(This->ref));
  57. TRACE("(%p) ref was %ld\n", This, ref + 1);
  58. /* static class, won't be freed */
  59. return ref;
  60. }
  61. static HRESULT WINAPI CF_CreateInstance(
  62. LPCLASSFACTORY iface,
  63. LPUNKNOWN pOuter,
  64. REFIID riid,
  65. LPVOID *ppobj)
  66. {
  67. IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
  68. TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), ppobj);
  69. if (pOuter)
  70. return CLASS_E_NOAGGREGATION;
  71. if (ppobj == NULL) {
  72. WARN("invalid parameter\n");
  73. return E_INVALIDARG;
  74. }
  75. *ppobj = NULL;
  76. return asioCreateInstance(riid, ppobj);
  77. }
  78. static HRESULT WINAPI CF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
  79. {
  80. IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
  81. FIXME("(%p, %d) stub!\n", This, dolock);
  82. return S_OK;
  83. }
  84. static const IClassFactoryVtbl CF_Vtbl = {
  85. CF_QueryInterface,
  86. CF_AddRef,
  87. CF_Release,
  88. CF_CreateInstance,
  89. CF_LockServer
  90. };
  91. static IClassFactoryImpl WINEASIO_CF = { &CF_Vtbl, 1 };
  92. /*******************************************************************************
  93. * DllGetClassObject [DSOUND.@]
  94. * Retrieves class object from a DLL object
  95. *
  96. * NOTES
  97. * Docs say returns STDAPI
  98. *
  99. * PARAMS
  100. * rclsid [I] CLSID for the class object
  101. * riid [I] Reference to identifier of interface for class object
  102. * ppv [O] Address of variable to receive interface pointer for riid
  103. *
  104. * RETURNS
  105. * Success: S_OK
  106. * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
  107. * E_UNEXPECTED
  108. */
  109. HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  110. {
  111. TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
  112. if (ppv == NULL) {
  113. WARN("invalid parameter\n");
  114. return E_INVALIDARG;
  115. }
  116. *ppv = NULL;
  117. if (!IsEqualIID(riid, &IID_IClassFactory) &&
  118. !IsEqualIID(riid, &IID_IUnknown)) {
  119. WARN("no interface for %s\n", debugstr_guid(riid));
  120. return E_NOINTERFACE;
  121. }
  122. if (IsEqualGUID(rclsid, &CLSID_WineASIO)) {
  123. CF_AddRef((IClassFactory*) &WINEASIO_CF);
  124. *ppv = &WINEASIO_CF;
  125. return S_OK;
  126. }
  127. WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),
  128. debugstr_guid(riid), ppv);
  129. return CLASS_E_CLASSNOTAVAILABLE;
  130. }
  131. /*******************************************************************************
  132. * DllCanUnloadNow
  133. * Determines whether the DLL is in use.
  134. *
  135. * RETURNS
  136. * Success: S_OK
  137. * Failure: S_FALSE
  138. */
  139. HRESULT WINAPI DllCanUnloadNow(void)
  140. {
  141. FIXME("(void): stub\n");
  142. return S_FALSE;
  143. }
  144. /***********************************************************************
  145. * DllMain (ASIO.init)
  146. */
  147. BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
  148. {
  149. TRACE("(%p %ld %p)\n", hInstDLL, fdwReason, lpvReserved);
  150. switch (fdwReason) {
  151. case DLL_PROCESS_ATTACH:
  152. TRACE("DLL_PROCESS_ATTACH\n");
  153. break;
  154. case DLL_PROCESS_DETACH:
  155. TRACE("DLL_PROCESS_DETACH\n");
  156. break;
  157. case DLL_THREAD_ATTACH:
  158. TRACE("DLL_THREAD_ATTACH\n");
  159. break;
  160. case DLL_THREAD_DETACH:
  161. TRACE("DLL_THREAD_DETACH\n");
  162. break;
  163. default:
  164. TRACE("UNKNOWN REASON\n");
  165. break;
  166. }
  167. return TRUE;
  168. }