WASAPI device name encoding fix, fixed skipped samples in WASAPI buffer conversion
authoryedey <myco@gmx.net>
Thu, 2 Oct 2014 19:29:48 +0000 (21:29 +0200)
committeryedey <myco@gmx.net>
Thu, 2 Oct 2014 19:29:48 +0000 (21:29 +0200)
RtAudio.cpp

index af7d205a1977491c39e76b85affb3fc8dc332807..ffb1f76086cbbe5ed0bb5356022f0e6c43b9957e 100644 (file)
@@ -58,6 +58,22 @@ const unsigned int RtApi::SAMPLE_RATES[] = {
   #define MUTEX_DESTROY(A)    DeleteCriticalSection(A)\r
   #define MUTEX_LOCK(A)       EnterCriticalSection(A)\r
   #define MUTEX_UNLOCK(A)     LeaveCriticalSection(A)\r
+\r
+  #include "tchar.h"\r
+\r
+  static std::string convertCharPointerToStdString(const char *text)\r
+  {\r
+    return std::string(text);\r
+  }\r
+\r
+  static std::string convertCharPointerToStdString(const wchar_t *text)\r
+  {\r
+    int length = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL);\r
+    std::string s( length-1, '\0' );\r
+    WideCharToMultiByte(CP_UTF8, 0, text, -1, &s[0], length, NULL, NULL);\r
+    return s;\r
+  }\r
+\r
 #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)\r
   // pthread API\r
   #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL)\r
@@ -3794,7 +3810,7 @@ void convertBufferWasapi( char* outBuffer,
   float sampleStep = 1.0f / sampleRatio;\r
   float inSampleFraction = 0.0f;\r
 \r
-  outSampleCount = ( unsigned int ) ( inSampleCount * sampleRatio );\r
+  outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio );\r
 \r
   // frame-by-frame, copy each relative input sample into it's corresponding output sample\r
   for ( unsigned int outSample = 0; outSample < outSampleCount; outSample++ )\r
@@ -3940,7 +3956,6 @@ RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo( unsigned int device )
   RtAudio::DeviceInfo info;\r
   unsigned int captureDeviceCount = 0;\r
   unsigned int renderDeviceCount = 0;\r
-  std::wstring deviceName;\r
   std::string defaultDeviceName;\r
   bool isCaptureDevice = false;\r
 \r
@@ -4043,8 +4058,7 @@ RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo( unsigned int device )
     goto Exit;\r
   }\r
 \r
-  deviceName = defaultDeviceNameProp.pwszVal;\r
-  defaultDeviceName = std::string( deviceName.begin(), deviceName.end() );\r
+  defaultDeviceName = convertCharPointerToStdString(defaultDeviceNameProp.pwszVal);\r
 \r
   // name\r
   hr = devicePtr->OpenPropertyStore( STGM_READ, &devicePropStore );\r
@@ -4061,8 +4075,7 @@ RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo( unsigned int device )
     goto Exit;\r
   }\r
 \r
-  deviceName = deviceNameProp.pwszVal;\r
-  info.name = std::string( deviceName.begin(), deviceName.end() );\r
+  info.name =convertCharPointerToStdString(deviceNameProp.pwszVal);\r
 \r
   // is default\r
   if ( isCaptureDevice ) {\r
@@ -6577,21 +6590,6 @@ static unsigned __stdcall callbackHandler( void *ptr )
   return 0;\r
 }\r
 \r
-#include "tchar.h"\r
-\r
-static std::string convertTChar( LPCTSTR name )\r
-{\r
-#if defined( UNICODE ) || defined( _UNICODE )\r
-  int length = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, 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
-\r
-  return s;\r
-}\r
-\r
 static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid,\r
                                           LPCTSTR description,\r
                                           LPCTSTR /*module*/,\r
@@ -6633,7 +6631,7 @@ static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid,
   }\r
 \r
   // If good device, then save its name and guid.\r
-  std::string name = convertTChar( description );\r
+  std::string name = convertCharPointerToStdString( description );\r
   //if ( name == "Primary Sound Driver" || name == "Primary Sound Capture Driver" )\r
   if ( lpguid == NULL )\r
     name = "Default Device";\r