-#include <windows.h>\r
-#include "iasiodrv.h"\r
-#include "asiolist.h"\r
-\r
-#define ASIODRV_DESC "description"\r
-#define INPROC_SERVER "InprocServer32"\r
-#define ASIO_PATH "software\\asio"\r
-#define COM_CLSID "clsid"\r
-\r
-// ******************************************************************\r
-// Local Functions \r
-// ******************************************************************\r
-static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)\r
-{\r
- HKEY hkEnum,hksub,hkpath;\r
- char databuf[512];\r
- LONG cr,rc = -1;\r
- DWORD datatype,datasize;\r
- DWORD index;\r
- OFSTRUCT ofs;\r
- HFILE hfile;\r
- BOOL found = FALSE;\r
-\r
- CharLowerBuff(clsidstr,strlen(clsidstr));\r
- if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {\r
-\r
- index = 0;\r
- while (cr == ERROR_SUCCESS && !found) {\r
- cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512);\r
- if (cr == ERROR_SUCCESS) {\r
- CharLowerBuff(databuf,strlen(databuf));\r
- if (!(strcmp(databuf,clsidstr))) {\r
- if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {\r
- if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {\r
- datatype = REG_SZ; datasize = (DWORD)dllpathsize;\r
- cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);\r
- if (cr == ERROR_SUCCESS) {\r
- memset(&ofs,0,sizeof(OFSTRUCT));\r
- ofs.cBytes = sizeof(OFSTRUCT); \r
- hfile = OpenFile(dllpath,&ofs,OF_EXIST);\r
- if (hfile) rc = 0; \r
- }\r
- RegCloseKey(hkpath);\r
- }\r
- RegCloseKey(hksub);\r
- }\r
- found = TRUE; // break out \r
- }\r
- }\r
- } \r
- RegCloseKey(hkEnum);\r
- }\r
- return rc;\r
-}\r
-\r
-\r
-static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv)\r
-{\r
- HKEY hksub;\r
- char databuf[256];\r
- char dllpath[MAXPATHLEN];\r
- WORD wData[100];\r
- CLSID clsid;\r
- DWORD datatype,datasize;\r
- LONG cr,rc;\r
-\r
- if (!lpdrv) {\r
- if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {\r
-\r
- datatype = REG_SZ; datasize = 256;\r
- cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize);\r
- if (cr == ERROR_SUCCESS) {\r
- rc = findDrvPath (databuf,dllpath,MAXPATHLEN);\r
- if (rc == 0) {\r
- lpdrv = new ASIODRVSTRUCT[1];\r
- if (lpdrv) {\r
- memset(lpdrv,0,sizeof(ASIODRVSTRUCT));\r
- lpdrv->drvID = drvID;\r
- MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100);\r
- if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) {\r
- memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID));\r
- }\r
-\r
- datatype = REG_SZ; datasize = 256;\r
- cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize);\r
- if (cr == ERROR_SUCCESS) {\r
- strcpy(lpdrv->drvname,databuf);\r
- }\r
- else strcpy(lpdrv->drvname,keyname);\r
- }\r
- }\r
- }\r
- RegCloseKey(hksub);\r
- }\r
- } \r
- else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next);\r
-\r
- return lpdrv;\r
-}\r
-\r
-static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv)\r
-{\r
- IASIO *iasio;\r
-\r
- if (lpdrv != 0) {\r
- deleteDrvStruct(lpdrv->next);\r
- if (lpdrv->asiodrv) {\r
- iasio = (IASIO *)lpdrv->asiodrv;\r
- iasio->Release();\r
- }\r
- delete lpdrv;\r
- }\r
-}\r
-\r
-\r
-static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv)\r
-{\r
- while (lpdrv) {\r
- if (lpdrv->drvID == drvID) return lpdrv;\r
- lpdrv = lpdrv->next;\r
- }\r
- return 0;\r
-}\r
-// ******************************************************************\r
-\r
-\r
-// ******************************************************************\r
-// AsioDriverList\r
-// ******************************************************************\r
-AsioDriverList::AsioDriverList ()\r
-{\r
- HKEY hkEnum = 0;\r
- char keyname[MAXDRVNAMELEN];\r
- LPASIODRVSTRUCT pdl;\r
- LONG cr;\r
- DWORD index = 0;\r
- BOOL fin = FALSE;\r
-\r
- numdrv = 0;\r
- lpdrvlist = 0;\r
-\r
- cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);\r
- while (cr == ERROR_SUCCESS) {\r
- if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {\r
- lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist);\r
- }\r
- else fin = TRUE;\r
- }\r
- if (hkEnum) RegCloseKey(hkEnum);\r
-\r
- pdl = lpdrvlist;\r
- while (pdl) {\r
- numdrv++;\r
- pdl = pdl->next;\r
- }\r
-\r
- if (numdrv) CoInitialize(0); // initialize COM\r
-}\r
-\r
-AsioDriverList::~AsioDriverList ()\r
-{\r
- if (numdrv) {\r
- deleteDrvStruct(lpdrvlist);\r
- CoUninitialize();\r
- }\r
-}\r
-\r
-\r
-LONG AsioDriverList::asioGetNumDev (VOID)\r
-{\r
- return (LONG)numdrv;\r
-}\r
-\r
-\r
-LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv)\r
-{\r
- LPASIODRVSTRUCT lpdrv = 0;\r
- long rc;\r
-\r
- if (!asiodrv) return DRVERR_INVALID_PARAM;\r
-\r
- if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {\r
- if (!lpdrv->asiodrv) {\r
- rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv);\r
- if (rc == S_OK) {\r
- lpdrv->asiodrv = *asiodrv;\r
- return 0;\r
- }\r
- // else if (rc == REGDB_E_CLASSNOTREG)\r
- // strcpy (info->messageText, "Driver not registered in the Registration Database!");\r
- }\r
- else rc = DRVERR_DEVICE_ALREADY_OPEN;\r
- }\r
- else rc = DRVERR_DEVICE_NOT_FOUND;\r
- \r
- return rc;\r
-}\r
-\r
-\r
-LONG AsioDriverList::asioCloseDriver (int drvID)\r
-{\r
- LPASIODRVSTRUCT lpdrv = 0;\r
- IASIO *iasio;\r
-\r
- if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {\r
- if (lpdrv->asiodrv) {\r
- iasio = (IASIO *)lpdrv->asiodrv;\r
- iasio->Release();\r
- lpdrv->asiodrv = 0;\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize)\r
-{ \r
- LPASIODRVSTRUCT lpdrv = 0;\r
-\r
- if (!drvname) return DRVERR_INVALID_PARAM;\r
-\r
- if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {\r
- if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) {\r
- strcpy(drvname,lpdrv->drvname);\r
- }\r
- else {\r
- memcpy(drvname,lpdrv->drvname,drvnamesize-4);\r
- drvname[drvnamesize-4] = '.';\r
- drvname[drvnamesize-3] = '.';\r
- drvname[drvnamesize-2] = '.';\r
- drvname[drvnamesize-1] = 0;\r
- }\r
- return 0;\r
- }\r
- return DRVERR_DEVICE_NOT_FOUND;\r
-}\r
-\r
-LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize)\r
-{\r
- LPASIODRVSTRUCT lpdrv = 0;\r
-\r
- if (!dllpath) return DRVERR_INVALID_PARAM;\r
-\r
- if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {\r
- if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) {\r
- strcpy(dllpath,lpdrv->dllpath);\r
- return 0;\r
- }\r
- dllpath[0] = 0;\r
- return DRVERR_INVALID_PARAM;\r
- }\r
- return DRVERR_DEVICE_NOT_FOUND;\r
-}\r
-\r
-LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid)\r
-{\r
- LPASIODRVSTRUCT lpdrv = 0;\r
-\r
- if (!clsid) return DRVERR_INVALID_PARAM;\r
-\r
- if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {\r
- memcpy(clsid,&lpdrv->clsid,sizeof(CLSID));\r
- return 0;\r
- }\r
- return DRVERR_DEVICE_NOT_FOUND;\r
-}\r
-\r
-\r
+#include <windows.h>
+#include "iasiodrv.h"
+#include "asiolist.h"
+
+#define ASIODRV_DESC "description"
+#define INPROC_SERVER "InprocServer32"
+#define ASIO_PATH "software\\asio"
+#define COM_CLSID "clsid"
+
+// ******************************************************************
+// Local Functions
+// ******************************************************************
+static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)
+{
+ HKEY hkEnum,hksub,hkpath;
+ char databuf[512];
+ LONG cr,rc = -1;
+ DWORD datatype,datasize;
+ DWORD index;
+ OFSTRUCT ofs;
+ HFILE hfile;
+ BOOL found = FALSE;
+
+#ifdef UNICODE
+ CharLowerBuffA(clsidstr,strlen(clsidstr));
+ if ((cr = RegOpenKeyA(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {
+
+ index = 0;
+ while (cr == ERROR_SUCCESS && !found) {
+ cr = RegEnumKeyA(hkEnum,index++,databuf,512);
+ if (cr == ERROR_SUCCESS) {
+ CharLowerBuffA(databuf,strlen(databuf));
+ if (!(strcmp(databuf,clsidstr))) {
+ if ((cr = RegOpenKeyExA(hkEnum,databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
+ if ((cr = RegOpenKeyExA(hksub,INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {
+ datatype = REG_SZ; datasize = (DWORD)dllpathsize;
+ cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);
+ if (cr == ERROR_SUCCESS) {
+ memset(&ofs,0,sizeof(OFSTRUCT));
+ ofs.cBytes = sizeof(OFSTRUCT);
+ hfile = OpenFile(dllpath,&ofs,OF_EXIST);
+ if (hfile) rc = 0;
+ }
+ RegCloseKey(hkpath);
+ }
+ RegCloseKey(hksub);
+ }
+ found = TRUE; // break out
+ }
+ }
+ }
+ RegCloseKey(hkEnum);
+ }
+#else
+ CharLowerBuff(clsidstr,strlen(clsidstr));
+ if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {
+
+ index = 0;
+ while (cr == ERROR_SUCCESS && !found) {
+ cr = RegEnumKey(hkEnum,index++,databuf,512);
+ if (cr == ERROR_SUCCESS) {
+ CharLowerBuff(databuf,strlen(databuf));
+ if (!(strcmp(databuf,clsidstr))) {
+ if ((cr = RegOpenKeyEx(hkEnum,databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
+ if ((cr = RegOpenKeyEx(hksub,INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {
+ datatype = REG_SZ; datasize = (DWORD)dllpathsize;
+ cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);
+ if (cr == ERROR_SUCCESS) {
+ memset(&ofs,0,sizeof(OFSTRUCT));
+ ofs.cBytes = sizeof(OFSTRUCT);
+ hfile = OpenFile(dllpath,&ofs,OF_EXIST);
+ if (hfile) rc = 0;
+ }
+ RegCloseKey(hkpath);
+ }
+ RegCloseKey(hksub);
+ }
+ found = TRUE; // break out
+ }
+ }
+ }
+ RegCloseKey(hkEnum);
+ }
+#endif
+ return rc;
+}
+
+
+static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv)
+{
+ HKEY hksub;
+ char databuf[256];
+ char dllpath[MAXPATHLEN];
+ WORD wData[100];
+ CLSID clsid;
+ DWORD datatype,datasize;
+ LONG cr,rc;
+
+ if (!lpdrv) {
+ if ((cr = RegOpenKeyExA(hkey,keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
+
+ datatype = REG_SZ; datasize = 256;
+ cr = RegQueryValueExA(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize);
+ if (cr == ERROR_SUCCESS) {
+ rc = findDrvPath (databuf,dllpath,MAXPATHLEN);
+ if (rc == 0) {
+ lpdrv = new ASIODRVSTRUCT[1];
+ if (lpdrv) {
+ memset(lpdrv,0,sizeof(ASIODRVSTRUCT));
+ lpdrv->drvID = drvID;
+ MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100);
+ if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) {
+ memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID));
+ }
+
+ datatype = REG_SZ; datasize = 256;
+ cr = RegQueryValueExA(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize);
+ if (cr == ERROR_SUCCESS) {
+ strcpy(lpdrv->drvname,databuf);
+ }
+ else strcpy(lpdrv->drvname,keyname);
+ }
+ }
+ }
+ RegCloseKey(hksub);
+ }
+ }
+ else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next);
+
+ return lpdrv;
+}
+
+static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv)
+{
+ IASIO *iasio;
+
+ if (lpdrv != 0) {
+ deleteDrvStruct(lpdrv->next);
+ if (lpdrv->asiodrv) {
+ iasio = (IASIO *)lpdrv->asiodrv;
+ iasio->Release();
+ }
+ delete lpdrv;
+ }
+}
+
+
+static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv)
+{
+ while (lpdrv) {
+ if (lpdrv->drvID == drvID) return lpdrv;
+ lpdrv = lpdrv->next;
+ }
+ return 0;
+}
+// ******************************************************************
+
+
+// ******************************************************************
+// AsioDriverList
+// ******************************************************************
+AsioDriverList::AsioDriverList ()
+{
+ HKEY hkEnum = 0;
+ char keyname[MAXDRVNAMELEN];
+ LPASIODRVSTRUCT pdl;
+ LONG cr;
+ DWORD index = 0;
+ BOOL fin = FALSE;
+
+ numdrv = 0;
+ lpdrvlist = 0;
+
+#ifdef UNICODE
+ cr = RegOpenKeyA(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);
+#else
+ cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);
+#endif
+ while (cr == ERROR_SUCCESS) {
+#ifdef UNICODE
+ if ((cr = RegEnumKeyA(hkEnum,index++,keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {
+#else
+ if ((cr = RegEnumKey(hkEnum,index++,keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {
+#endif
+ lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist);
+ }
+ else fin = TRUE;
+ }
+ if (hkEnum) RegCloseKey(hkEnum);
+
+ pdl = lpdrvlist;
+ while (pdl) {
+ numdrv++;
+ pdl = pdl->next;
+ }
+
+ if (numdrv) CoInitialize(0); // initialize COM
+}
+
+AsioDriverList::~AsioDriverList ()
+{
+ if (numdrv) {
+ deleteDrvStruct(lpdrvlist);
+ CoUninitialize();
+ }
+}
+
+
+LONG AsioDriverList::asioGetNumDev (VOID)
+{
+ return (LONG)numdrv;
+}
+
+
+LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv)
+{
+ LPASIODRVSTRUCT lpdrv = 0;
+ long rc;
+
+ if (!asiodrv) return DRVERR_INVALID_PARAM;
+
+ if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
+ if (!lpdrv->asiodrv) {
+ rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv);
+ if (rc == S_OK) {
+ lpdrv->asiodrv = *asiodrv;
+ return 0;
+ }
+ // else if (rc == REGDB_E_CLASSNOTREG)
+ // strcpy (info->messageText, "Driver not registered in the Registration Database!");
+ }
+ else rc = DRVERR_DEVICE_ALREADY_OPEN;
+ }
+ else rc = DRVERR_DEVICE_NOT_FOUND;
+
+ return rc;
+}
+
+
+LONG AsioDriverList::asioCloseDriver (int drvID)
+{
+ LPASIODRVSTRUCT lpdrv = 0;
+ IASIO *iasio;
+
+ if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
+ if (lpdrv->asiodrv) {
+ iasio = (IASIO *)lpdrv->asiodrv;
+ iasio->Release();
+ lpdrv->asiodrv = 0;
+ }
+ }
+
+ return 0;
+}
+
+LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize)
+{
+ LPASIODRVSTRUCT lpdrv = 0;
+
+ if (!drvname) return DRVERR_INVALID_PARAM;
+
+ if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
+ if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) {
+ strcpy(drvname,lpdrv->drvname);
+ }
+ else {
+ memcpy(drvname,lpdrv->drvname,drvnamesize-4);
+ drvname[drvnamesize-4] = '.';
+ drvname[drvnamesize-3] = '.';
+ drvname[drvnamesize-2] = '.';
+ drvname[drvnamesize-1] = 0;
+ }
+ return 0;
+ }
+ return DRVERR_DEVICE_NOT_FOUND;
+}
+
+LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize)
+{
+ LPASIODRVSTRUCT lpdrv = 0;
+
+ if (!dllpath) return DRVERR_INVALID_PARAM;
+
+ if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
+ if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) {
+ strcpy(dllpath,lpdrv->dllpath);
+ return 0;
+ }
+ dllpath[0] = 0;
+ return DRVERR_INVALID_PARAM;
+ }
+ return DRVERR_DEVICE_NOT_FOUND;
+}
+
+LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid)
+{
+ LPASIODRVSTRUCT lpdrv = 0;
+
+ if (!clsid) return DRVERR_INVALID_PARAM;
+
+ if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
+ memcpy(clsid,&lpdrv->clsid,sizeof(CLSID));
+ return 0;
+ }
+ return DRVERR_DEVICE_NOT_FOUND;
+}
+
+