2 #include "iasiodrv.h"
\r
3 #include "asiolist.h"
\r
5 #define ASIODRV_DESC "description"
\r
6 #define INPROC_SERVER "InprocServer32"
\r
7 #define ASIO_PATH "software\\asio"
\r
8 #define COM_CLSID "clsid"
\r
10 // ******************************************************************
\r
12 // ******************************************************************
\r
13 static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)
\r
15 HKEY hkEnum,hksub,hkpath;
\r
18 DWORD datatype,datasize;
\r
24 CharLowerBuff(clsidstr,strlen(clsidstr));
\r
25 if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {
\r
28 while (cr == ERROR_SUCCESS && !found) {
\r
29 cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512);
\r
30 if (cr == ERROR_SUCCESS) {
\r
31 CharLowerBuff(databuf,strlen(databuf));
\r
32 if (!(strcmp(databuf,clsidstr))) {
\r
33 if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
\r
34 if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {
\r
35 datatype = REG_SZ; datasize = (DWORD)dllpathsize;
\r
36 cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);
\r
37 if (cr == ERROR_SUCCESS) {
\r
38 memset(&ofs,0,sizeof(OFSTRUCT));
\r
39 ofs.cBytes = sizeof(OFSTRUCT);
\r
40 hfile = OpenFile(dllpath,&ofs,OF_EXIST);
\r
43 RegCloseKey(hkpath);
\r
47 found = TRUE; // break out
\r
51 RegCloseKey(hkEnum);
\r
57 static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv)
\r
61 char dllpath[MAXPATHLEN];
\r
64 DWORD datatype,datasize;
\r
68 if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {
\r
70 datatype = REG_SZ; datasize = 256;
\r
71 cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize);
\r
72 if (cr == ERROR_SUCCESS) {
\r
73 rc = findDrvPath (databuf,dllpath,MAXPATHLEN);
\r
75 lpdrv = new ASIODRVSTRUCT[1];
\r
77 memset(lpdrv,0,sizeof(ASIODRVSTRUCT));
\r
78 lpdrv->drvID = drvID;
\r
79 MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100);
\r
80 if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) {
\r
81 memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID));
\r
84 datatype = REG_SZ; datasize = 256;
\r
85 cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize);
\r
86 if (cr == ERROR_SUCCESS) {
\r
87 strcpy(lpdrv->drvname,databuf);
\r
89 else strcpy(lpdrv->drvname,keyname);
\r
96 else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next);
\r
101 static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv)
\r
106 deleteDrvStruct(lpdrv->next);
\r
107 if (lpdrv->asiodrv) {
\r
108 iasio = (IASIO *)lpdrv->asiodrv;
\r
116 static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv)
\r
119 if (lpdrv->drvID == drvID) return lpdrv;
\r
120 lpdrv = lpdrv->next;
\r
124 // ******************************************************************
\r
127 // ******************************************************************
\r
129 // ******************************************************************
\r
130 AsioDriverList::AsioDriverList ()
\r
133 char keyname[MAXDRVNAMELEN];
\r
134 LPASIODRVSTRUCT pdl;
\r
142 cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);
\r
143 while (cr == ERROR_SUCCESS) {
\r
144 if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {
\r
145 lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist);
\r
149 if (hkEnum) RegCloseKey(hkEnum);
\r
157 if (numdrv) CoInitialize(0); // initialize COM
\r
160 AsioDriverList::~AsioDriverList ()
\r
163 deleteDrvStruct(lpdrvlist);
\r
169 LONG AsioDriverList::asioGetNumDev (VOID)
\r
171 return (LONG)numdrv;
\r
175 LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv)
\r
177 LPASIODRVSTRUCT lpdrv = 0;
\r
180 if (!asiodrv) return DRVERR_INVALID_PARAM;
\r
182 if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
\r
183 if (!lpdrv->asiodrv) {
\r
184 rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv);
\r
186 lpdrv->asiodrv = *asiodrv;
\r
189 // else if (rc == REGDB_E_CLASSNOTREG)
\r
190 // strcpy (info->messageText, "Driver not registered in the Registration Database!");
\r
192 else rc = DRVERR_DEVICE_ALREADY_OPEN;
\r
194 else rc = DRVERR_DEVICE_NOT_FOUND;
\r
200 LONG AsioDriverList::asioCloseDriver (int drvID)
\r
202 LPASIODRVSTRUCT lpdrv = 0;
\r
205 if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
\r
206 if (lpdrv->asiodrv) {
\r
207 iasio = (IASIO *)lpdrv->asiodrv;
\r
209 lpdrv->asiodrv = 0;
\r
216 LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize)
\r
218 LPASIODRVSTRUCT lpdrv = 0;
\r
220 if (!drvname) return DRVERR_INVALID_PARAM;
\r
222 if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
\r
223 if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) {
\r
224 strcpy(drvname,lpdrv->drvname);
\r
227 memcpy(drvname,lpdrv->drvname,drvnamesize-4);
\r
228 drvname[drvnamesize-4] = '.';
\r
229 drvname[drvnamesize-3] = '.';
\r
230 drvname[drvnamesize-2] = '.';
\r
231 drvname[drvnamesize-1] = 0;
\r
235 return DRVERR_DEVICE_NOT_FOUND;
\r
238 LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize)
\r
240 LPASIODRVSTRUCT lpdrv = 0;
\r
242 if (!dllpath) return DRVERR_INVALID_PARAM;
\r
244 if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
\r
245 if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) {
\r
246 strcpy(dllpath,lpdrv->dllpath);
\r
250 return DRVERR_INVALID_PARAM;
\r
252 return DRVERR_DEVICE_NOT_FOUND;
\r
255 LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid)
\r
257 LPASIODRVSTRUCT lpdrv = 0;
\r
259 if (!clsid) return DRVERR_INVALID_PARAM;
\r
261 if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {
\r
262 memcpy(clsid,&lpdrv->clsid,sizeof(CLSID));
\r
265 return DRVERR_DEVICE_NOT_FOUND;
\r