< prev index next >

src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp

Print this page

        

@@ -84,10 +84,32 @@
 static DS_AudioDeviceCache g_audioDeviceCache[MAX_DS_DEVICES];
 static INT32 g_cacheCount = 0;
 static UINT64 g_lastCacheRefreshTime = 0;
 static INT32 g_mixerCount = 0;
 
+/// FIX BUG JDK-8177951: Convert ANSI encoded string to UTF-8 encoded string
+LPCSTR ANSIToUTF8(const LPCSTR& lpAnsiStr)
+{
+    // ANSI -> Unicode
+    DWORD dwAnsiLen = strlen(lpAnsiStr);
+    DWORD dwUnicodeLen = ::MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1, NULL, 0);
+    LPWSTR lpUnicodeStr;
+    lpUnicodeStr = new WCHAR[dwUnicodeLen];
+    memset(lpUnicodeStr, 0, (dwUnicodeLen) * sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1, lpUnicodeStr, dwUnicodeLen);
+
+    // Unicode -> UTF8
+    LPSTR lpUTF8Str;
+    DWORD dwUTF8Len;
+    dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, NULL, 0, NULL, NULL);
+    lpUTF8Str = new CHAR[dwUTF8Len];
+    memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
+    WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, lpUTF8Str, dwUTF8Len, NULL, NULL);
+    delete lpUnicodeStr;
+    return lpUTF8Str;
+}
+
 BOOL DS_lockCache() {
     /* dummy implementation for now, Java does locking */
     return TRUE;
 }
 

@@ -231,11 +253,17 @@
                              LPCSTR lpstrModule,
                              DirectAudioDeviceDescription* desc) {
 
     INT32 cacheIndex = findCacheItemByGUID(lpGuid, g_audioDeviceCache[desc->deviceID].isSource);
     if (cacheIndex == desc->deviceID) {
+#ifndef UNICODE
+        LPCSTR utf8EncodedName = ANSIToUTF8(lpstrDescription);
+        strncpy(desc->name, utf8EncodedName, DAUDIO_STRING_LENGTH);
+        delete utf8EncodedName;
+#else
         strncpy(desc->name, lpstrDescription, DAUDIO_STRING_LENGTH);
+#endif
         //strncpy(desc->description, lpstrModule, DAUDIO_STRING_LENGTH);
         desc->maxSimulLines = -1;
         /* do not continue enumeration */
         return FALSE;
     }
< prev index next >