A few more updates, including new ASIO files (GS).
authorGary Scavone <gary@music.mcgill.ca>
Mon, 15 Apr 2013 17:56:31 +0000 (17:56 +0000)
committerStephen Sinclair <sinclair@music.mcgill.ca>
Thu, 10 Oct 2013 23:38:32 +0000 (01:38 +0200)
RtAudio.cpp
RtAudio.h
doc/release.txt
include/asiolist.cpp
install
readme
tests/audioprobe.cpp

index 356315102b80d0a802209e233e7bcb448575d740..4b600bdb7d6866227658b2d90e54ae89b71c6528 100644 (file)
@@ -10,7 +10,7 @@
     RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/\r
 \r
     RtAudio: realtime audio i/o C++ classes\r
-    Copyright (c) 2001-2012 Gary P. Scavone\r
+    Copyright (c) 2001-2013 Gary P. Scavone\r
 \r
     Permission is hereby granted, free of charge, to any person\r
     obtaining a copy of this software and associated documentation files\r
@@ -4991,8 +4991,8 @@ static std::string convertTChar( LPCTSTR name )
 {\r
 #if defined( UNICODE ) || defined( _UNICODE )\r
   int length = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL);\r
-  std::string s( length, 0 );\r
-  length = WideCharToMultiByte(CP_UTF8, 0, name, wcslen(name), &s[0], length, NULL, NULL);\r
+  std::string s( length-1, '\0' );\r
+  WideCharToMultiByte(CP_UTF8, 0, name, -1, &s[0], length, NULL, NULL);\r
 #else\r
   std::string s( name );\r
 #endif\r
index 8d827e3ada84270a178a043c47f819b30cca9132..d78c3134d867c978db0ce7e6253117c5f70bc643 100644 (file)
--- a/RtAudio.h
+++ b/RtAudio.h
@@ -10,7 +10,7 @@
     RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/
 
     RtAudio: realtime audio i/o C++ classes
-    Copyright (c) 2001-2012 Gary P. Scavone
+    Copyright (c) 2001-2013 Gary P. Scavone
 
     Permission is hereby granted, free of charge, to any person
     obtaining a copy of this software and associated documentation files
@@ -42,8 +42,6 @@
   \file RtAudio.h
  */
 
-// RtAudio: Version 4.0.12
-
 #ifndef __RTAUDIO_H
 #define __RTAUDIO_H
 
@@ -51,6 +49,9 @@
 #include <vector>
 #include "RtError.h"
 
+// RtAudio version
+static const std::string VERSION( "4.0.12" );
+
 /*! \typedef typedef unsigned long RtAudioFormat;
     \brief RtAudio data format type.
 
@@ -320,6 +321,9 @@ class RtAudio
     : flags(0), numberOfBuffers(0), priority(0) {}
   };
 
+  //! A static function to determine the current RtAudio version.
+  static std::string getVersion( void ) { return VERSION; } 
+
   //! A static function to determine the available compiled audio APIs.
   /*!
     The values returned in the std::vector can be compared against
index 3b09e890e3906ed93d0272c729572754cb92537a..1f9957bb69128aaec4013b05d0494c900dfca33a 100644 (file)
@@ -1,8 +1,9 @@
 RtAudio - a set of C++ classes that provide a common API for realtime audio input/output across Linux (native ALSA, JACK, PulseAudio, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems.
 
-By Gary P. Scavone, 2001-2012.
+By Gary P. Scavone, 2001-2013.
 
-v4.0.12: (?? December 2012)
+v4.0.12: (?? April 2013)
+- updated RtAudio.cpp and ASIO files for UNICODE support (thanks to Renaud Schoonbroodt)
 - updates to PulseAudio API support (thanks to Peter Meerwald and Tristan Matthews)
 - updates for pkg-config support in configure script
 - 24-bit format changed to true 24-bit format, not sub-bytes of 32-bits (thanks to Marc Britton)
index 5a62f5bc0b141aafb2e78d2bf26b513d077cd417..e4c73c29b8f185922b9b5c1a26e1202264bdbdf9 100644 (file)
-#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;
+}
+
+
diff --git a/install b/install
index e590d965b616a14c8b7ff99d04d81315a138dc16..f3377c4496c7b28a4600e908b4077b84aa59e4d8 100644 (file)
--- a/install
+++ b/install
@@ -1,6 +1,6 @@
 RtAudio - a set of C++ classes which provide a common API for realtime audio input/output across Linux (native ALSA, JACK, PulseAudio, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems.
 
-By Gary P. Scavone, 2001-2012.
+By Gary P. Scavone, 2001-2013.
 
 To configure and compile (on Unix systems and MinGW):
 
diff --git a/readme b/readme
index 2b8888462f13d9f7ea4d1cf203d51c5cacd970dd..449d4e75ededb2f327337debcbc1c81c3df8b8e3 100644 (file)
--- a/readme
+++ b/readme
@@ -1,12 +1,12 @@
 RtAudio - a set of C++ classes that provide a common API for realtime audio input/output across Linux (native ALSA, JACK, PulseAudio and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems.
 
-By Gary P. Scavone, 2001-2012.
+By Gary P. Scavone, 2001-2013.
 
 This distribution of RtAudio contains the following:
 
 doc:      RtAudio documentation (see doc/html/index.html)
 tests:    example RtAudio programs
-asio:     header and source files necessary for ASIO compilation
+include:  header and source files necessary for ASIO & DS compilation
 tests/Windows: Visual C++ .net test program workspace and projects
 
 OVERVIEW:
@@ -34,7 +34,7 @@ LEGAL AND ETHICAL:
 The RtAudio license is similar to the MIT License.
 
     RtAudio: a set of realtime audio i/o C++ classes
-    Copyright (c) 2001-2012 Gary P. Scavone
+    Copyright (c) 2001-2013 Gary P. Scavone
 
     Permission is hereby granted, free of charge, to any person
     obtaining a copy of this software and associated documentation files
index 7ec0ec6555e7eaaee0bbfcb75fc1d234ae365751..a69437f97db13b87de15b19f333d2b7ab0c4a6c8 100644 (file)
@@ -27,6 +27,8 @@ int main()
   std::vector< RtAudio::Api > apis;
   RtAudio :: getCompiledApi( apis );
 
+  std::cout << "\nRtAudio Version " << RtAudio::getVersion() << std::endl;
+
   std::cout << "\nCompiled APIs:\n";
   for ( unsigned int i=0; i<apis.size(); i++ )
     std::cout << "  " << apiMap[ apis[i] ] << std::endl;