< 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 >