<Sound Dev> 8177951: Charset problem when the name of the sound device contains Chinese character.
Sergey Bylokhov
sergey.bylokhov at oracle.com
Tue Aug 29 20:52:05 UTC 2017
I'll sponsor the fix and push it soon.
----- alexey.menkov at oracle.com wrote:
> Hi Charlie,
>
> The fix looks good to me.
>
> --alex
>
> On 08/20/2017 18:32, CharlieJiang wrote:
> > Hi Alex,
> >
> > So here it is:
> >
> > # HG changeset patch
> > # User "CharlieJiang <cqjjjzr at 126.com>"
> > # Date 1501568294 -28800
> > # Tue Aug 01 14:18:14 2017 +0800
> > # Node ID a99905b246d576e03eac6b8c66982fa7dc846477
> > # Parent 2425838cfb5e63bf798e383492890c25170b91d1
> > 8177951: Charset problem when the name of the sound device contains
> Chinese character
> > Contributed-by: Charlie Jiang<cqjjjjzr at 126.com>
> >
> > diff --git a/make/lib/SoundLibraries.gmk
> b/make/lib/SoundLibraries.gmk
> > --- a/make/lib/SoundLibraries.gmk
> > +++ b/make/lib/SoundLibraries.gmk
> > @@ -61,6 +61,7 @@
> > -DUSE_PLATFORM_MIDI_IN=TRUE \
> > -DUSE_PORTS=TRUE
> > LIBJSOUND_SRC_FILES += \
> > + PLATFORM_API_WinOS_Charset_Util.cpp \
> > PLATFORM_API_WinOS_MidiIn.cpp \
> > PLATFORM_API_WinOS_MidiOut.c \
> > PLATFORM_API_WinOS_Util.c \
> > @@ -190,6 +191,7 @@
> > OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
> > SRC := $(LIBJSOUND_SRC_DIRS), \
> > INCLUDE_FILES := Utilities.c $(LIBJSOUND_DAUDIOFILES) \
> > + PLATFORM_API_WinOS_Charset_Util.cpp \
> > PLATFORM_API_WinOS_DirectSound.cpp, \
> > OPTIMIZATION := LOW, \
> > CFLAGS := $(CFLAGS_JDKLIB) \
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> > new file mode 100644
> > --- /dev/null
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> > @@ -0,0 +1,53 @@
> > +/*
> > + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> > + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> > + *
> > + * This code is free software; you can redistribute it and/or
> modify it
> > + * under the terms of the GNU General Public License version 2
> only, as
> > + * published by the Free Software Foundation. Oracle designates
> this
> > + * particular file as subject to the "Classpath" exception as
> provided
> > + * by Oracle in the LICENSE file that accompanied this code.
> > + *
> > + * This code is distributed in the hope that it will be useful, but
> WITHOUT
> > + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
> License
> > + * version 2 for more details (a copy is included in the LICENSE
> file that
> > + * accompanied this code).
> > + *
> > + * You should have received a copy of the GNU General Public
> License version
> > + * 2 along with this work; if not, write to the Free Software
> Foundation,
> > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> > + *
> > + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
> 94065 USA
> > + * or visit www.oracle.com if you need additional information or
> have any
> > + * questions.
> > + */
> > +
> > +#include "PLATFORM_API_WinOS_Charset_Util.h"
> > +
> > +#include <cstring>
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif
> > +
> > +LPSTR UnicodeToUTF8(const LPCWSTR lpUnicodeStr)
> > +{
> > + DWORD dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> > + LPSTR lpUTF8Str = new CHAR[dwUTF8Len];
> > + memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> > + WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, lpUTF8Str,
> dwUTF8Len, nullptr, nullptr);
> > + return lpUTF8Str;
> > +}
> > +
> > +void UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src, SIZE_T
> maxLength) {
> > + LPSTR utf8EncodedName = UnicodeToUTF8(src);
> > + strncpy(dest, utf8EncodedName, maxLength - 1);
> > + delete[] utf8EncodedName;
> > + dest[maxLength - 1] = '\0';
> > +}
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> > +
> > \ No newline at end of file
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> > new file mode 100644
> > --- /dev/null
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> > @@ -0,0 +1,44 @@
> > +/*
> > + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> > + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> > + *
> > + * This code is free software; you can redistribute it and/or
> modify it
> > + * under the terms of the GNU General Public License version 2
> only, as
> > + * published by the Free Software Foundation. Oracle designates
> this
> > + * particular file as subject to the "Classpath" exception as
> provided
> > + * by Oracle in the LICENSE file that accompanied this code.
> > + *
> > + * This code is distributed in the hope that it will be useful, but
> WITHOUT
> > + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
> License
> > + * version 2 for more details (a copy is included in the LICENSE
> file that
> > + * accompanied this code).
> > + *
> > + * You should have received a copy of the GNU General Public
> License version
> > + * 2 along with this work; if not, write to the Free Software
> Foundation,
> > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> > + *
> > + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
> 94065 USA
> > + * or visit www.oracle.com if you need additional information or
> have any
> > + * questions.
> > + */
> > +
> > +#ifndef PLATFORM_API_WINOS_CHARSET_UTILS_H
> > +#define PLATFORM_API_WINOS_CHARSET_UTILS_H
> > +
> > +#include <windows.h>
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif
> > +
> > +// NOTE: It's a caller responbility to free the allocated memory
> using delete[], just like in UnicodeToUTF8AndCopy function
> > +LPSTR _cdecl UnicodeToUTF8(const LPCWSTR lpAnsiStr);
> > +
> > +void _cdecl UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src, SIZE_T
> maxLength);
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> > +
> > +#endif
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> > ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> > @@ -52,6 +52,9 @@
> > }
> > #endif
> >
> > +/* include to prevent charset problem */
> > +#include "PLATFORM_API_WinOS_Charset_Util.h"
> > +
> > #ifdef USE_DEBUG_SILENCING
> > #define DEBUG_SILENCING0(p) TRACE0(p)
> > #define DEBUG_SILENCING1(p1,p2) TRACE1(p1,p2)
> > @@ -227,13 +230,13 @@
> > }
> >
> > BOOL CALLBACK DS_GetDescEnum(LPGUID lpGuid,
> > - LPCSTR lpstrDescription,
> > - LPCSTR lpstrModule,
> > + LPCWSTR lpstrDescription,
> > + LPCWSTR lpstrModule,
> > DirectAudioDeviceDescription* desc) {
> >
> > INT32 cacheIndex = findCacheItemByGUID(lpGuid,
> g_audioDeviceCache[desc->deviceID].isSource);
> > if (cacheIndex == desc->deviceID) {
> > - strncpy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> > + UnicodeToUTF8AndCopy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> > //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> > desc->maxSimulLines = -1;
> > /* do not continue enumeration */
> > @@ -257,10 +260,10 @@
> > }
> > desc->maxSimulLines = 0;
> > if (g_audioDeviceCache[desc->deviceID].isSource) {
> > - DirectSoundEnumerate((LPDSENUMCALLBACK) DS_GetDescEnum,
> desc);
> > + DirectSoundEnumerateW((LPDSENUMCALLBACKW) DS_GetDescEnum,
> desc);
> > strncpy(desc->description, "DirectSound Playback",
> DAUDIO_STRING_LENGTH);
> > } else {
> > - DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)
> DS_GetDescEnum, desc);
> > + DirectSoundCaptureEnumerateW((LPDSENUMCALLBACKW)
> DS_GetDescEnum, desc);
> > strncpy(desc->description, "DirectSound Capture",
> DAUDIO_STRING_LENGTH);
> > }
> >
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> > ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> > @@ -31,6 +31,9 @@
> > #include "PLATFORM_API_WinOS_Util.h"
> > }
> >
> > +/* include to prevent charset problem */
> > +#include "PLATFORM_API_WinOS_Charset_Util.h"
> > +
> > #if USE_PLATFORM_MIDI_IN == TRUE
> >
> > #ifdef USE_ERROR
> > @@ -248,18 +251,17 @@
> > return (INT32) midiInGetNumDevs();
> > }
> >
> > -INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPS* caps, INT32* err)
> {
> > - (*err) = midiInGetDevCaps(deviceID, caps, sizeof(MIDIINCAPS));
> > +INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPSW* caps, INT32* err)
> {
> > + (*err) = midiInGetDevCapsW(deviceID, caps,
> sizeof(MIDIINCAPS));
> > return ((*err) == MMSYSERR_NOERROR);
> > }
> >
> > INT32 MIDI_IN_GetDeviceName(INT32 deviceID, char *name, UINT32
> nameLength) {
> > - MIDIINCAPS midiInCaps;
> > + MIDIINCAPSW midiInCaps;
> > INT32 err;
> >
> > if (getMidiInCaps(deviceID, &midiInCaps, &err)) {
> > - strncpy(name, midiInCaps.szPname, nameLength-1);
> > - name[nameLength-1] = 0;
> > + UnicodeToUTF8AndCopy(name, midiInCaps.szPname,
> nameLength);
> > return MIDI_SUCCESS;
> > }
> > MIDIIN_CHECK_ERROR;
> > @@ -279,7 +281,7 @@
> >
> >
> > INT32 MIDI_IN_GetDeviceVersion(INT32 deviceID, char *name, UINT32
> nameLength) {
> > - MIDIINCAPS midiInCaps;
> > + MIDIINCAPSW midiInCaps;
> > INT32 err = MIDI_NOT_SUPPORTED;
> >
> > if (getMidiInCaps(deviceID, &midiInCaps, &err) &&
> (nameLength>7)) {
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> > ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> > @@ -28,6 +28,9 @@
> >
> > #include "PLATFORM_API_WinOS_Util.h"
> >
> > +/* include to prevent charset problem */
> > +#include "PLATFORM_API_WinOS_Charset_Util.h"
> > +
> > #if USE_PLATFORM_MIDI_OUT == TRUE
> >
> >
> > @@ -66,24 +69,23 @@
> > }
> >
> >
> > -INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPS* caps, INT32* err)
> {
> > +INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPSW* caps, INT32*
> err) {
> > if (deviceID == 0) {
> > deviceID = MIDI_MAPPER;
> > } else {
> > deviceID--;
> > }
> > - (*err) = (INT32) midiOutGetDevCaps(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> > + (*err) = (INT32) midiOutGetDevCapsW(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> > return ((*err) == MMSYSERR_NOERROR);
> > }
> >
> >
> > INT32 MIDI_OUT_GetDeviceName(INT32 deviceID, char *name, UINT32
> nameLength) {
> > - MIDIOUTCAPS midiOutCaps;
> > + MIDIOUTCAPSW midiOutCaps;
> > INT32 err;
> >
> > if (getMidiOutCaps(deviceID, &midiOutCaps, &err)) {
> > - strncpy(name, midiOutCaps.szPname, nameLength-1);
> > - name[nameLength-1] = 0;
> > + UnicodeToUTF8AndCopy(name, midiOutCaps.szPname,
> nameLength);
> > return MIDI_SUCCESS;
> > }
> > MIDIOUT_CHECK_ERROR;
> > @@ -97,7 +99,7 @@
> >
> >
> > INT32 MIDI_OUT_GetDeviceDescription(INT32 deviceID, char *name,
> UINT32 nameLength) {
> > - MIDIOUTCAPS midiOutCaps;
> > + MIDIOUTCAPSW midiOutCaps;
> > char *desc;
> > INT32 err;
> >
> > @@ -134,7 +136,7 @@
> >
> >
> > INT32 MIDI_OUT_GetDeviceVersion(INT32 deviceID, char *name, UINT32
> nameLength) {
> > - MIDIOUTCAPS midiOutCaps;
> > + MIDIOUTCAPSW midiOutCaps;
> > INT32 err;
> >
> > if (getMidiOutCaps(deviceID, &midiOutCaps, &err) &&
> nameLength>7) {
> > diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> > ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> > +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> > @@ -38,6 +38,9 @@
> > #include <mmsystem.h>
> > #include "Ports.h"
> >
> > +/* include to prevent charset problem */
> > +#include "PLATFORM_API_WinOS_Charset_Util.h"
> > +
> > #if USE_PORTS == TRUE
> >
> > typedef struct tag_PortControlID PortControlID;
> > @@ -353,10 +356,9 @@
> > ///// implemented functions of Ports.h
> >
> > INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> > - MIXERCAPS mixerCaps;
> > - if (mixerGetDevCaps(mixerIndex, &mixerCaps, sizeof(MIXERCAPS))
> == MMSYSERR_NOERROR) {
> > - strncpy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH-1);
> > - description->name[PORT_STRING_LENGTH-1] = 0;
> > + MIXERCAPSW mixerCaps;
> > + if (mixerGetDevCapsW(mixerIndex, &mixerCaps, sizeof(MIXERCAPS))
> == MMSYSERR_NOERROR) {
> > + UnicodeToUTF8AndCopy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH);
> > sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion & 0xFF00) >> 8, mixerCaps.vDriverVersion &
> 0xFF);
> > strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> > return TRUE;
> >
> > ==============EOF===EOF===EOF====================
> > ==============EOF===EOF===EOF====================
> > ==============EOF===EOF===EOF====================
> > ==============EOF===EOF===EOF====================
> > ==============EOF===EOF===EOF====================
> >
> > At 2017-08-18 01:05:53, "Alex Menkov" <alexey.menkov at oracle.com>
> wrote:
> >> Hi Charlie,
> >>
> >> The fix looks good to me.
> >> Couple minor notes:
> >> - please replace tabs with 4 spaces in
> PLATFORM_API_WinOS_Charset_Util.cpp
> >> - could you add a comment for UnicodeToUTF8 function (in
> >> PLATFORM_API_WinOS_Charset_Util.h) specifying that it's a caller
> >> responsibility to free allocated memory by using delete[])
> >>
> >> --alex
> >>
> >> On 07/31/2017 23:31, CharlieJiang wrote:
> >>> Hi Philip,
> >>>
> >>> I submitted the OCA, just check the inbox of the OCA mail.
> >>>
> >>> Here's the patch, generated by hg export -g. If you think the
> thing you need isn't this, just tell me the exactly way to generate
> it.
> >>>
> >>> # HG changeset patch
> >>> # User "CharlieJiang <cqjjjzr at 126.com>"
> >>> # Date 1501568294 -28800
> >>> # Tue Aug 01 14:18:14 2017 +0800
> >>> # Node ID 201964735a55e0b70e064cc24fbf9c85fbb55346
> >>> # Parent 2425838cfb5e63bf798e383492890c25170b91d1
> >>> 8177951: Charset problem when the name of the sound device
> contains Chinese character
> >>>
> >>> diff --git a/make/lib/SoundLibraries.gmk
> b/make/lib/SoundLibraries.gmk
> >>> --- a/make/lib/SoundLibraries.gmk
> >>> +++ b/make/lib/SoundLibraries.gmk
> >>> @@ -61,6 +61,7 @@
> >>> -DUSE_PLATFORM_MIDI_IN=TRUE \
> >>> -DUSE_PORTS=TRUE
> >>> LIBJSOUND_SRC_FILES += \
> >>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>> PLATFORM_API_WinOS_MidiIn.cpp \
> >>> PLATFORM_API_WinOS_MidiOut.c \
> >>> PLATFORM_API_WinOS_Util.c \
> >>> @@ -190,6 +191,7 @@
> >>> OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
> >>> SRC := $(LIBJSOUND_SRC_DIRS), \
> >>> INCLUDE_FILES := Utilities.c $(LIBJSOUND_DAUDIOFILES) \
> >>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>> PLATFORM_API_WinOS_DirectSound.cpp, \
> >>> OPTIMIZATION := LOW, \
> >>> CFLAGS := $(CFLAGS_JDKLIB) \
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>> new file mode 100644
> >>> --- /dev/null
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>> @@ -0,0 +1,53 @@
> >>> +/*
> >>> + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> >>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> >>> + *
> >>> + * This code is free software; you can redistribute it and/or
> modify it
> >>> + * under the terms of the GNU General Public License version 2
> only, as
> >>> + * published by the Free Software Foundation. Oracle designates
> this
> >>> + * particular file as subject to the "Classpath" exception as
> provided
> >>> + * by Oracle in the LICENSE file that accompanied this code.
> >>> + *
> >>> + * This code is distributed in the hope that it will be useful,
> but WITHOUT
> >>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
> License
> >>> + * version 2 for more details (a copy is included in the LICENSE
> file that
> >>> + * accompanied this code).
> >>> + *
> >>> + * You should have received a copy of the GNU General Public
> License version
> >>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> >>> + *
> >>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
> 94065 USA
> >>> + * or visit www.oracle.com if you need additional information or
> have any
> >>> + * questions.
> >>> + */
> >>> +
> >>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>> +
> >>> +#include <cstring>
> >>> +
> >>> +#ifdef __cplusplus
> >>> +extern "C" {
> >>> +#endif
> >>> +
> >>> +LPSTR UnicodeToUTF8(const LPCWSTR lpUnicodeStr)
> >>> +{
> >>> + DWORD dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> >>> + LPSTR lpUTF8Str = new CHAR[dwUTF8Len];
> >>> + memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> >>> + WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, lpUTF8Str,
> dwUTF8Len, nullptr, nullptr);
> >>> + return lpUTF8Str;
> >>> +}
> >>> +
> >>> +void UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src, SIZE_T
> maxLength) {
> >>> + LPSTR utf8EncodedName = UnicodeToUTF8(src);
> >>> + strncpy(dest, utf8EncodedName, maxLength - 1);
> >>> + delete[] utf8EncodedName;
> >>> + dest[maxLength - 1] = '\0';
> >>> +}
> >>> +
> >>> +#ifdef __cplusplus
> >>> +}
> >>> +#endif
> >>> +
> >>> \ No newline at end of file
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>> new file mode 100644
> >>> --- /dev/null
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>> @@ -0,0 +1,43 @@
> >>> +/*
> >>> + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> >>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> >>> + *
> >>> + * This code is free software; you can redistribute it and/or
> modify it
> >>> + * under the terms of the GNU General Public License version 2
> only, as
> >>> + * published by the Free Software Foundation. Oracle designates
> this
> >>> + * particular file as subject to the "Classpath" exception as
> provided
> >>> + * by Oracle in the LICENSE file that accompanied this code.
> >>> + *
> >>> + * This code is distributed in the hope that it will be useful,
> but WITHOUT
> >>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
> License
> >>> + * version 2 for more details (a copy is included in the LICENSE
> file that
> >>> + * accompanied this code).
> >>> + *
> >>> + * You should have received a copy of the GNU General Public
> License version
> >>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> >>> + *
> >>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA
> 94065 USA
> >>> + * or visit www.oracle.com if you need additional information or
> have any
> >>> + * questions.
> >>> + */
> >>> +
> >>> +#ifndef PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>> +#define PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>> +
> >>> +#include <windows.h>
> >>> +
> >>> +#ifdef __cplusplus
> >>> +extern "C" {
> >>> +#endif
> >>> +
> >>> +LPSTR _cdecl UnicodeToUTF8(const LPCWSTR lpAnsiStr);
> >>> +
> >>> +void _cdecl UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src, SIZE_T
> maxLength);
> >>> +
> >>> +#ifdef __cplusplus
> >>> +}
> >>> +#endif
> >>> +
> >>> +#endif
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>> @@ -52,6 +52,9 @@
> >>> }
> >>> #endif
> >>>
> >>> +/* include to prevent charset problem */
> >>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>> +
> >>> #ifdef USE_DEBUG_SILENCING
> >>> #define DEBUG_SILENCING0(p) TRACE0(p)
> >>> #define DEBUG_SILENCING1(p1,p2) TRACE1(p1,p2)
> >>> @@ -227,13 +230,13 @@
> >>> }
> >>>
> >>> BOOL CALLBACK DS_GetDescEnum(LPGUID lpGuid,
> >>> - LPCSTR lpstrDescription,
> >>> - LPCSTR lpstrModule,
> >>> + LPCWSTR lpstrDescription,
> >>> + LPCWSTR lpstrModule,
> >>> DirectAudioDeviceDescription* desc)
> {
> >>>
> >>> INT32 cacheIndex = findCacheItemByGUID(lpGuid,
> g_audioDeviceCache[desc->deviceID].isSource);
> >>> if (cacheIndex == desc->deviceID) {
> >>> - strncpy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>> + UnicodeToUTF8AndCopy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>> //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> >>> desc->maxSimulLines = -1;
> >>> /* do not continue enumeration */
> >>> @@ -257,10 +260,10 @@
> >>> }
> >>> desc->maxSimulLines = 0;
> >>> if (g_audioDeviceCache[desc->deviceID].isSource) {
> >>> - DirectSoundEnumerate((LPDSENUMCALLBACK) DS_GetDescEnum,
> desc);
> >>> + DirectSoundEnumerateW((LPDSENUMCALLBACKW) DS_GetDescEnum,
> desc);
> >>> strncpy(desc->description, "DirectSound Playback",
> DAUDIO_STRING_LENGTH);
> >>> } else {
> >>> - DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)
> DS_GetDescEnum, desc);
> >>> + DirectSoundCaptureEnumerateW((LPDSENUMCALLBACKW)
> DS_GetDescEnum, desc);
> >>> strncpy(desc->description, "DirectSound Capture",
> DAUDIO_STRING_LENGTH);
> >>> }
> >>>
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>> @@ -31,6 +31,9 @@
> >>> #include "PLATFORM_API_WinOS_Util.h"
> >>> }
> >>>
> >>> +/* include to prevent charset problem */
> >>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>> +
> >>> #if USE_PLATFORM_MIDI_IN == TRUE
> >>>
> >>> #ifdef USE_ERROR
> >>> @@ -248,18 +251,17 @@
> >>> return (INT32) midiInGetNumDevs();
> >>> }
> >>>
> >>> -INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPS* caps, INT32* err)
> {
> >>> - (*err) = midiInGetDevCaps(deviceID, caps,
> sizeof(MIDIINCAPS));
> >>> +INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPSW* caps, INT32*
> err) {
> >>> + (*err) = midiInGetDevCapsW(deviceID, caps,
> sizeof(MIDIINCAPS));
> >>> return ((*err) == MMSYSERR_NOERROR);
> >>> }
> >>>
> >>> INT32 MIDI_IN_GetDeviceName(INT32 deviceID, char *name, UINT32
> nameLength) {
> >>> - MIDIINCAPS midiInCaps;
> >>> + MIDIINCAPSW midiInCaps;
> >>> INT32 err;
> >>>
> >>> if (getMidiInCaps(deviceID, &midiInCaps, &err)) {
> >>> - strncpy(name, midiInCaps.szPname, nameLength-1);
> >>> - name[nameLength-1] = 0;
> >>> + UnicodeToUTF8AndCopy(name, midiInCaps.szPname,
> nameLength);
> >>> return MIDI_SUCCESS;
> >>> }
> >>> MIDIIN_CHECK_ERROR;
> >>> @@ -279,7 +281,7 @@
> >>>
> >>>
> >>> INT32 MIDI_IN_GetDeviceVersion(INT32 deviceID, char *name, UINT32
> nameLength) {
> >>> - MIDIINCAPS midiInCaps;
> >>> + MIDIINCAPSW midiInCaps;
> >>> INT32 err = MIDI_NOT_SUPPORTED;
> >>>
> >>> if (getMidiInCaps(deviceID, &midiInCaps, &err) &&
> (nameLength>7)) {
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>> @@ -28,6 +28,9 @@
> >>>
> >>> #include "PLATFORM_API_WinOS_Util.h"
> >>>
> >>> +/* include to prevent charset problem */
> >>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>> +
> >>> #if USE_PLATFORM_MIDI_OUT == TRUE
> >>>
> >>>
> >>> @@ -66,24 +69,23 @@
> >>> }
> >>>
> >>>
> >>> -INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPS* caps, INT32*
> err) {
> >>> +INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPSW* caps, INT32*
> err) {
> >>> if (deviceID == 0) {
> >>> deviceID = MIDI_MAPPER;
> >>> } else {
> >>> deviceID--;
> >>> }
> >>> - (*err) = (INT32) midiOutGetDevCaps(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> >>> + (*err) = (INT32) midiOutGetDevCapsW(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> >>> return ((*err) == MMSYSERR_NOERROR);
> >>> }
> >>>
> >>>
> >>> INT32 MIDI_OUT_GetDeviceName(INT32 deviceID, char *name, UINT32
> nameLength) {
> >>> - MIDIOUTCAPS midiOutCaps;
> >>> + MIDIOUTCAPSW midiOutCaps;
> >>> INT32 err;
> >>>
> >>> if (getMidiOutCaps(deviceID, &midiOutCaps, &err)) {
> >>> - strncpy(name, midiOutCaps.szPname, nameLength-1);
> >>> - name[nameLength-1] = 0;
> >>> + UnicodeToUTF8AndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>> return MIDI_SUCCESS;
> >>> }
> >>> MIDIOUT_CHECK_ERROR;
> >>> @@ -97,7 +99,7 @@
> >>>
> >>>
> >>> INT32 MIDI_OUT_GetDeviceDescription(INT32 deviceID, char *name,
> UINT32 nameLength) {
> >>> - MIDIOUTCAPS midiOutCaps;
> >>> + MIDIOUTCAPSW midiOutCaps;
> >>> char *desc;
> >>> INT32 err;
> >>>
> >>> @@ -134,7 +136,7 @@
> >>>
> >>>
> >>> INT32 MIDI_OUT_GetDeviceVersion(INT32 deviceID, char *name,
> UINT32 nameLength) {
> >>> - MIDIOUTCAPS midiOutCaps;
> >>> + MIDIOUTCAPSW midiOutCaps;
> >>> INT32 err;
> >>>
> >>> if (getMidiOutCaps(deviceID, &midiOutCaps, &err) &&
> nameLength>7) {
> >>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>> @@ -38,6 +38,9 @@
> >>> #include <mmsystem.h>
> >>> #include "Ports.h"
> >>>
> >>> +/* include to prevent charset problem */
> >>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>> +
> >>> #if USE_PORTS == TRUE
> >>>
> >>> typedef struct tag_PortControlID PortControlID;
> >>> @@ -353,10 +356,9 @@
> >>> ///// implemented functions of Ports.h
> >>>
> >>> INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> >>> - MIXERCAPS mixerCaps;
> >>> - if (mixerGetDevCaps(mixerIndex, &mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>> - strncpy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH-1);
> >>> - description->name[PORT_STRING_LENGTH-1] = 0;
> >>> + MIXERCAPSW mixerCaps;
> >>> + if (mixerGetDevCapsW(mixerIndex, &mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>> + UnicodeToUTF8AndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>> sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion & 0xFF00) >> 8, mixerCaps.vDriverVersion &
> 0xFF);
> >>> strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> >>> return TRUE;
> >>>
> >>>
> >>> At 2017-07-31 08:35:47, "Philip Race" <philip.race at oracle.com>
> wrote:
> >>>> Hi,
> >>>>
> >>>> 1) You will need to submit the OCA before a patch can be
> committed.
> >>>> In fact it needs to be accepted .. not just submitted ... but we
> can check
> >>>> with the folks who manage that process once you've sent it in if
> you
> >>>> tell us.
> >>>>
> >>>> 2) A changeset is the wrong thing to send for review. It has to
> be a
> >>>> patch for two reasons here
> >>>> Well we can use hg --nocommit but .. if we try to push this a
> >>>> server-side check
> >>>> will reject it for two reasons.
> >>>> #1 you do not have an author id and you have to use one to create
> an
> >>>> acceptable changeset
> >>>> #2 without a "Reviewed-by:" line, the content of which you can't
> >>>> predict, the push will also fail
> >>>>
> >>>> -phil.
> >>>>
> >>>> On 7/30/17, 3:40 PM, CharlieJiang wrote:
> >>>>> Hi Alex,
> >>>>>
> >>>>> Thanks for your reply. I'll sign the OCA soon, don't worry about
> it.
> >>>>> I'm so sorry about the low-level mistake that I made in the
> code.
> >>>>> Here's the new patch(just compared to the root repo instead of
> the previous patch, so you need to revert if the old patch is already
> applied to the branch):
> >>>>>
> >>>>> # HG changeset patch
> >>>>> # User Charlie Jiang<cqjjjzr at 126.com>
> >>>>> # Date 1498382295 -28800
> >>>>> # Node ID 1bfe64cffda51c00fccf48e9c0c2adb533fa7e5c
> >>>>> # Parent 2425838cfb5e63bf798e383492890c25170b91d1
> >>>>> 8177951: Charset problem when the name of the sound device
> contains Chinese character
> >>>>> Summary: Fix the problem by returning the UTF-8 encoded string.
> >>>>> Contributed-by: Charlie Jiang<cqjjjzr at 126.com>
> >>>>>
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> @@ -86,6 +86,28 @@
> >>>>> 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;
> >>>>> @@ -233,7 +255,13 @@
> >>>>>
> >>>>> 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 */
> >>>>> # HG changeset patch
> >>>>> # User Charlie Jiang<cqjjjzr at 126.com>
> >>>>> # Date 1500538314 -28800
> >>>>> # Node ID c86ae2f3e1022f9b27ad6918fa342c5a4ee309c0
> >>>>> # Parent 1bfe64cffda51c00fccf48e9c0c2adb533fa7e5c
> >>>>> 8177951: Charset problem when the name of the sound device
> contains Chinese character
> >>>>> Summary: Fix issues in the ANSI2UTF-8 function and move it to a
> seperate file and fix Port Sound and MIDI Sound devices.
> >>>>> Contributed-by: Charlie Jiang<cqjjjzr at 126.com>
> >>>>>
> >>>>> diff --git a/make/lib/SoundLibraries.gmk
> b/make/lib/SoundLibraries.gmk
> >>>>> --- a/make/lib/SoundLibraries.gmk
> >>>>> +++ b/make/lib/SoundLibraries.gmk
> >>>>> @@ -61,6 +61,7 @@
> >>>>> -DUSE_PLATFORM_MIDI_IN=TRUE \
> >>>>> -DUSE_PORTS=TRUE
> >>>>> LIBJSOUND_SRC_FILES += \
> >>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>> PLATFORM_API_WinOS_MidiIn.cpp \
> >>>>> PLATFORM_API_WinOS_MidiOut.c \
> >>>>> PLATFORM_API_WinOS_Util.c \
> >>>>> @@ -190,6 +191,7 @@
> >>>>> OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
> >>>>> SRC := $(LIBJSOUND_SRC_DIRS), \
> >>>>> INCLUDE_FILES := Utilities.c $(LIBJSOUND_DAUDIOFILES) \
> >>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>> PLATFORM_API_WinOS_DirectSound.cpp, \
> >>>>> OPTIMIZATION := LOW, \
> >>>>> CFLAGS := $(CFLAGS_JDKLIB) \
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>> new file mode 100644
> >>>>> --- /dev/null
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>> @@ -0,0 +1,61 @@
> >>>>> +/*
> >>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All
> rights reserved.
> >>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>> + *
> >>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>> + * under the terms of the GNU General Public License version 2
> only, as
> >>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>> + *
> >>>>> + * This code is distributed in the hope that it will be useful,
> but WITHOUT
> >>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>> + * accompanied this code).
> >>>>> + *
> >>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>> + *
> >>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>> + * questions.
> >>>>> + */
> >>>>> +
> >>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>> +
> >>>>> +#include<cstring>
> >>>>> +
> >>>>> +extern "C" LPSTR ANSIToUTF8(const LPCSTR lpAnsiStr)
> >>>>> +{
> >>>>> + // ANSI -> Unicode
> >>>>> + DWORD dwUnicodeLen = 0;
> >>>>> + LPWSTR lpUnicodeStr = nullptr;
> >>>>> + dwUnicodeLen = MultiByteToWideChar(CP_ACP, 0, lpAnsiStr,
> -1, nullptr, 0);
> >>>>> + lpUnicodeStr = new WCHAR[dwUnicodeLen];
> >>>>> + memset(lpUnicodeStr, 0, (dwUnicodeLen) * sizeof(WCHAR));
> >>>>> + MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1, lpUnicodeStr,
> dwUnicodeLen);
> >>>>> +
> >>>>> + // Unicode -> UTF8
> >>>>> + LPSTR lpUTF8Str = nullptr;
> >>>>> + DWORD dwUTF8Len = 0;
> >>>>> + dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> >>>>> + lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>> + memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> >>>>> + WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1,
> lpUTF8Str, dwUTF8Len, nullptr, nullptr);
> >>>>> + delete[] lpUnicodeStr;
> >>>>> + return lpUTF8Str;
> >>>>> +}
> >>>>> +
> >>>>> +extern "C" void ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR
> src, SIZE_T maxLength) {
> >>>>> +#ifndef UNICODE
> >>>>> + LPSTR utf8EncodedName = ANSIToUTF8(src);
> >>>>> + strncpy(dest, utf8EncodedName, maxLength - 1);
> >>>>> + delete[] utf8EncodedName;
> >>>>> +#else
> >>>>> + strncpy(dest, src, maxLength - 1);
> >>>>> +#endif
> >>>>> + dest[maxLength - 1] = '\0';
> >>>>> +}
> >>>>> +
> >>>>> \ No newline at end of file
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>> new file mode 100644
> >>>>> --- /dev/null
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>> @@ -0,0 +1,43 @@
> >>>>> +/*
> >>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All
> rights reserved.
> >>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>> + *
> >>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>> + * under the terms of the GNU General Public License version 2
> only, as
> >>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>> + *
> >>>>> + * This code is distributed in the hope that it will be useful,
> but WITHOUT
> >>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>> + * accompanied this code).
> >>>>> + *
> >>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>> + *
> >>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>> + * questions.
> >>>>> + */
> >>>>> +
> >>>>> +#ifndef PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>> +#define PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>> +
> >>>>> +#include<windows.h>
> >>>>> +
> >>>>> +#ifdef __cplusplus
> >>>>> +extern "C" {
> >>>>> +#endif
> >>>>> +
> >>>>> +LPSTR _cdecl ANSIToUTF8(const LPCSTR lpAnsiStr);
> >>>>> +
> >>>>> +void _cdecl ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR src,
> SIZE_T maxLength);
> >>>>> +
> >>>>> +#ifdef __cplusplus
> >>>>> +}
> >>>>> +#endif
> >>>>> +
> >>>>> +#endif
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> @@ -52,6 +52,9 @@
> >>>>> }
> >>>>> #endif
> >>>>>
> >>>>> +/* include to prevent charset problem */
> >>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>> +
> >>>>> #ifdef USE_DEBUG_SILENCING
> >>>>> #define DEBUG_SILENCING0(p) TRACE0(p)
> >>>>> #define DEBUG_SILENCING1(p1,p2) TRACE1(p1,p2)
> >>>>> @@ -86,28 +89,6 @@
> >>>>> 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;
> >>>>> @@ -255,13 +236,7 @@
> >>>>>
> >>>>> 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
> >>>>> + ANSIToUTF8IfNeededAndCopy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>>>> //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> >>>>> desc->maxSimulLines = -1;
> >>>>> /* do not continue enumeration */
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> @@ -31,6 +31,9 @@
> >>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>> }
> >>>>>
> >>>>> +/* include to prevent charset problem */
> >>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>> +
> >>>>> #if USE_PLATFORM_MIDI_IN == TRUE
> >>>>>
> >>>>> #ifdef USE_ERROR
> >>>>> @@ -258,8 +261,7 @@
> >>>>> INT32 err;
> >>>>>
> >>>>> if (getMidiInCaps(deviceID,&midiInCaps,&err)) {
> >>>>> - strncpy(name, midiInCaps.szPname, nameLength-1);
> >>>>> - name[nameLength-1] = 0;
> >>>>> + ANSIToUTF8IfNeededAndCopy(name, midiInCaps.szPname,
> nameLength);
> >>>>> return MIDI_SUCCESS;
> >>>>> }
> >>>>> MIDIIN_CHECK_ERROR;
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> @@ -28,6 +28,9 @@
> >>>>>
> >>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>>
> >>>>> +/* include to prevent charset problem */
> >>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>> +
> >>>>> #if USE_PLATFORM_MIDI_OUT == TRUE
> >>>>>
> >>>>>
> >>>>> @@ -82,8 +85,7 @@
> >>>>> INT32 err;
> >>>>>
> >>>>> if (getMidiOutCaps(deviceID,&midiOutCaps,&err)) {
> >>>>> - strncpy(name, midiOutCaps.szPname, nameLength-1);
> >>>>> - name[nameLength-1] = 0;
> >>>>> + ANSIToUTF8IfNeededAndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>>>> return MIDI_SUCCESS;
> >>>>> }
> >>>>> MIDIOUT_CHECK_ERROR;
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> @@ -38,6 +38,9 @@
> >>>>> #include<mmsystem.h>
> >>>>> #include "Ports.h"
> >>>>>
> >>>>> +/* include to prevent charset problem */
> >>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>> +
> >>>>> #if USE_PORTS == TRUE
> >>>>>
> >>>>> typedef struct tag_PortControlID PortControlID;
> >>>>> @@ -355,8 +358,7 @@
> >>>>> INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> >>>>> MIXERCAPS mixerCaps;
> >>>>> if (mixerGetDevCaps(mixerIndex,&mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>>>> - strncpy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH-1);
> >>>>> - description->name[PORT_STRING_LENGTH-1] = 0;
> >>>>> + ANSIToUTF8IfNeededAndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>>>> sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion& 0xFF00)>> 8, mixerCaps.vDriverVersion&
> 0xFF);
> >>>>> strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> >>>>> return TRUE;
> >>>>> # HG changeset patch
> >>>>> # User Charlie Jiang<cqjjjzr at 126.com>
> >>>>> # Date 1501430954 -28800
> >>>>> # Node ID 505fc2325a7192103b65fa42920e3cd06a1bdf01
> >>>>> # Parent c86ae2f3e1022f9b27ad6918fa342c5a4ee309c0
> >>>>> 8177951: Charset problem when the name of the sound device
> contains Chinese character
> >>>>> Summary: See
> http://mail.openjdk.java.net/pipermail/sound-dev/2017-July/000580.html
> >>>>> Contributed-by: Charlie Jiang<cqjjjzr at 126.com>
> >>>>>
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>> @@ -1,5 +1,5 @@
> >>>>> /*
> >>>>> - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All
> rights reserved.
> >>>>> + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> >>>>> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>> *
> >>>>> * This code is free software; you can redistribute it and/or
> modify it
> >>>>> @@ -27,35 +27,27 @@
> >>>>>
> >>>>> #include<cstring>
> >>>>>
> >>>>> -extern "C" LPSTR ANSIToUTF8(const LPCSTR lpAnsiStr)
> >>>>> -{
> >>>>> - // ANSI -> Unicode
> >>>>> - DWORD dwUnicodeLen = 0;
> >>>>> - LPWSTR lpUnicodeStr = nullptr;
> >>>>> - dwUnicodeLen = MultiByteToWideChar(CP_ACP, 0, lpAnsiStr,
> -1, nullptr, 0);
> >>>>> - lpUnicodeStr = new WCHAR[dwUnicodeLen];
> >>>>> - memset(lpUnicodeStr, 0, (dwUnicodeLen) * sizeof(WCHAR));
> >>>>> - MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1, lpUnicodeStr,
> dwUnicodeLen);
> >>>>> +#ifdef __cplusplus
> >>>>> +extern "C" {
> >>>>> +#endif
> >>>>>
> >>>>> - // Unicode -> UTF8
> >>>>> - LPSTR lpUTF8Str = nullptr;
> >>>>> - DWORD dwUTF8Len = 0;
> >>>>> - dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> >>>>> - lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>> +LPSTR UnicodeToUTF8(const LPCWSTR lpUnicodeStr)
> >>>>> +{
> >>>>> + DWORD dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0,
> lpUnicodeStr, -1, nullptr, 0, nullptr, nullptr);
> >>>>> + LPSTR lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>> memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> >>>>> WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1,
> lpUTF8Str, dwUTF8Len, nullptr, nullptr);
> >>>>> - delete[] lpUnicodeStr;
> >>>>> return lpUTF8Str;
> >>>>> }
> >>>>>
> >>>>> -extern "C" void ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR
> src, SIZE_T maxLength) {
> >>>>> -#ifndef UNICODE
> >>>>> - LPSTR utf8EncodedName = ANSIToUTF8(src);
> >>>>> +void UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src, SIZE_T
> maxLength) {
> >>>>> + LPSTR utf8EncodedName = UnicodeToUTF8(src);
> >>>>> strncpy(dest, utf8EncodedName, maxLength - 1);
> >>>>> delete[] utf8EncodedName;
> >>>>> -#else
> >>>>> - strncpy(dest, src, maxLength - 1);
> >>>>> -#endif
> >>>>> dest[maxLength - 1] = '\0';
> >>>>> }
> >>>>> +
> >>>>> +#ifdef __cplusplus
> >>>>> +}
> >>>>> +#endif
> >>>>>
> >>>>> \ No newline at end of file
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>> @@ -1,5 +1,5 @@
> >>>>> /*
> >>>>> - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All
> rights reserved.
> >>>>> + * Copyright (c) 2017, Oracle and/or its affiliates. All rights
> reserved.
> >>>>> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>> *
> >>>>> * This code is free software; you can redistribute it and/or
> modify it
> >>>>> @@ -32,9 +32,9 @@
> >>>>> extern "C" {
> >>>>> #endif
> >>>>>
> >>>>> -LPSTR _cdecl ANSIToUTF8(const LPCSTR lpAnsiStr);
> >>>>> +LPSTR _cdecl UnicodeToUTF8(const LPCWSTR lpAnsiStr);
> >>>>>
> >>>>> -void _cdecl ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR src,
> SIZE_T maxLength);
> >>>>> +void _cdecl UnicodeToUTF8AndCopy(LPSTR dest, LPCWSTR src,
> SIZE_T maxLength);
> >>>>>
> >>>>> #ifdef __cplusplus
> >>>>> }
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>> @@ -230,13 +230,13 @@
> >>>>> }
> >>>>>
> >>>>> BOOL CALLBACK DS_GetDescEnum(LPGUID lpGuid,
> >>>>> - LPCSTR lpstrDescription,
> >>>>> - LPCSTR lpstrModule,
> >>>>> + LPCWSTR lpstrDescription,
> >>>>> + LPCWSTR lpstrModule,
> >>>>> DirectAudioDeviceDescription*
> desc) {
> >>>>>
> >>>>> INT32 cacheIndex = findCacheItemByGUID(lpGuid,
> g_audioDeviceCache[desc->deviceID].isSource);
> >>>>> if (cacheIndex == desc->deviceID) {
> >>>>> - ANSIToUTF8IfNeededAndCopy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>>>> + UnicodeToUTF8AndCopy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>>>> //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> >>>>> desc->maxSimulLines = -1;
> >>>>> /* do not continue enumeration */
> >>>>> @@ -260,10 +260,10 @@
> >>>>> }
> >>>>> desc->maxSimulLines = 0;
> >>>>> if (g_audioDeviceCache[desc->deviceID].isSource) {
> >>>>> - DirectSoundEnumerate((LPDSENUMCALLBACK) DS_GetDescEnum,
> desc);
> >>>>> + DirectSoundEnumerateW((LPDSENUMCALLBACKW)
> DS_GetDescEnum, desc);
> >>>>> strncpy(desc->description, "DirectSound Playback",
> DAUDIO_STRING_LENGTH);
> >>>>> } else {
> >>>>> - DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)
> DS_GetDescEnum, desc);
> >>>>> + DirectSoundCaptureEnumerateW((LPDSENUMCALLBACKW)
> DS_GetDescEnum, desc);
> >>>>> strncpy(desc->description, "DirectSound Capture",
> DAUDIO_STRING_LENGTH);
> >>>>> }
> >>>>>
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>> @@ -251,17 +251,17 @@
> >>>>> return (INT32) midiInGetNumDevs();
> >>>>> }
> >>>>>
> >>>>> -INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPS* caps, INT32*
> err) {
> >>>>> - (*err) = midiInGetDevCaps(deviceID, caps,
> sizeof(MIDIINCAPS));
> >>>>> +INT32 getMidiInCaps(INT32 deviceID, MIDIINCAPSW* caps, INT32*
> err) {
> >>>>> + (*err) = midiInGetDevCapsW(deviceID, caps,
> sizeof(MIDIINCAPS));
> >>>>> return ((*err) == MMSYSERR_NOERROR);
> >>>>> }
> >>>>>
> >>>>> INT32 MIDI_IN_GetDeviceName(INT32 deviceID, char *name, UINT32
> nameLength) {
> >>>>> - MIDIINCAPS midiInCaps;
> >>>>> + MIDIINCAPSW midiInCaps;
> >>>>> INT32 err;
> >>>>>
> >>>>> if (getMidiInCaps(deviceID,&midiInCaps,&err)) {
> >>>>> - ANSIToUTF8IfNeededAndCopy(name, midiInCaps.szPname,
> nameLength);
> >>>>> + UnicodeToUTF8AndCopy(name, midiInCaps.szPname,
> nameLength);
> >>>>> return MIDI_SUCCESS;
> >>>>> }
> >>>>> MIDIIN_CHECK_ERROR;
> >>>>> @@ -281,7 +281,7 @@
> >>>>>
> >>>>>
> >>>>> INT32 MIDI_IN_GetDeviceVersion(INT32 deviceID, char *name,
> UINT32 nameLength) {
> >>>>> - MIDIINCAPS midiInCaps;
> >>>>> + MIDIINCAPSW midiInCaps;
> >>>>> INT32 err = MIDI_NOT_SUPPORTED;
> >>>>>
> >>>>> if (getMidiInCaps(deviceID,&midiInCaps,&err)&&
> (nameLength>7)) {
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>> @@ -69,23 +69,23 @@
> >>>>> }
> >>>>>
> >>>>>
> >>>>> -INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPS* caps, INT32*
> err) {
> >>>>> +INT32 getMidiOutCaps(INT32 deviceID, MIDIOUTCAPSW* caps, INT32*
> err) {
> >>>>> if (deviceID == 0) {
> >>>>> deviceID = MIDI_MAPPER;
> >>>>> } else {
> >>>>> deviceID--;
> >>>>> }
> >>>>> - (*err) = (INT32) midiOutGetDevCaps(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> >>>>> + (*err) = (INT32) midiOutGetDevCapsW(deviceID, caps,
> sizeof(MIDIOUTCAPS));
> >>>>> return ((*err) == MMSYSERR_NOERROR);
> >>>>> }
> >>>>>
> >>>>>
> >>>>> INT32 MIDI_OUT_GetDeviceName(INT32 deviceID, char *name,
> UINT32 nameLength) {
> >>>>> - MIDIOUTCAPS midiOutCaps;
> >>>>> + MIDIOUTCAPSW midiOutCaps;
> >>>>> INT32 err;
> >>>>>
> >>>>> if (getMidiOutCaps(deviceID,&midiOutCaps,&err)) {
> >>>>> - ANSIToUTF8IfNeededAndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>>>> + UnicodeToUTF8AndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>>>> return MIDI_SUCCESS;
> >>>>> }
> >>>>> MIDIOUT_CHECK_ERROR;
> >>>>> @@ -99,7 +99,7 @@
> >>>>>
> >>>>>
> >>>>> INT32 MIDI_OUT_GetDeviceDescription(INT32 deviceID, char
> *name, UINT32 nameLength) {
> >>>>> - MIDIOUTCAPS midiOutCaps;
> >>>>> + MIDIOUTCAPSW midiOutCaps;
> >>>>> char *desc;
> >>>>> INT32 err;
> >>>>>
> >>>>> @@ -136,7 +136,7 @@
> >>>>>
> >>>>>
> >>>>> INT32 MIDI_OUT_GetDeviceVersion(INT32 deviceID, char *name,
> UINT32 nameLength) {
> >>>>> - MIDIOUTCAPS midiOutCaps;
> >>>>> + MIDIOUTCAPSW midiOutCaps;
> >>>>> INT32 err;
> >>>>>
> >>>>> if (getMidiOutCaps(deviceID,&midiOutCaps,&err)&&
> nameLength>7) {
> >>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>> @@ -356,9 +356,9 @@
> >>>>> ///// implemented functions of Ports.h
> >>>>>
> >>>>> INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> >>>>> - MIXERCAPS mixerCaps;
> >>>>> - if (mixerGetDevCaps(mixerIndex,&mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>>>> - ANSIToUTF8IfNeededAndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>>>> + MIXERCAPSW mixerCaps;
> >>>>> + if (mixerGetDevCapsW(mixerIndex,&mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>>>> + UnicodeToUTF8AndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>>>> sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion& 0xFF00)>> 8, mixerCaps.vDriverVersion&
> 0xFF);
> >>>>> strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> >>>>> return TRUE;
> >>>>>
> >>>>>
> >>>>> At 2017-07-29 05:16:12, "Alex Menkov"<alexey.menkov at oracle.com>
> wrote:
> >>>>>> Hi Charlie,
> >>>>>>
> >>>>>> First of all - you have to sign OSA so Oracle may use your
> code.
> >>>>>>
> >>>>>> About the proposed fix:
> >>>>>> - copyright headers contains wrong years (1999, 2012).
> >>>>>> should be
> >>>>>> * Copyright (c) 2017, Oracle and/or its affiliates. All
> rights reserved.
> >>>>>>
> >>>>>> - do you really need 'extern "C"' stuff? Have you got some
> linkage
> >>>>>> errors without it?
> >>>>>>
> >>>>>> - as I see in the code, javasound libraries cannot be compiled
> with
> >>>>>> UNICODE, so code in "#ifdef UNICODE" doesn't make sense.
> >>>>>>
> >>>>>> - it would be better to define and initialize variables at the
> same time:
> >>>>>> // ANSI -> Unicode
> >>>>>> DWORD dwUnicodeLen = MultiByteToWideChar(CP_ACP, 0,
> lpAnsiStr, -1,
> >>>>>> nullptr, 0);
> >>>>>> LPWSTR lpUnicodeStr = new WCHAR[dwUnicodeLen];
> >>>>>> ...
> >>>>>> // Unicode -> UTF8
> >>>>>> DWORD dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0,
> lpUnicodeStr, -1,
> >>>>>> nullptr, 0, nullptr, nullptr);
> >>>>>> LPSTR lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>>>
> >>>>>> BTW it's not ANSI, it's ACP (Active Code Page) encoding.
> >>>>>>
> >>>>>>
> >>>>>> - I think it would be better (and simpler) to request system to
> get
> >>>>>> Unicode strings (by calling Unicode versions of the functions),
> then
> >>>>>> only a single conversion (Unicode -> utf8) is required:
> >>>>>> void copyUnicodeToUtf8(LPSTR dst, LPCWSTR src, size_t
> dstMaxSize);
> >>>>>>
> >>>>>> For DirectSound:
> >>>>>> convert DS_GetDescEnum to LPDSENUMCALLBACKW type:
> >>>>>>
> >>>>>> BOOL CALLBACK DS_GetDescEnum(LPGUID lpGuid,
> >>>>>> LPCWSTR lpstrDescription,
> >>>>>> LPCWSTR lpstrModule,
> >>>>>> DirectAudioDeviceDescription*
> desc)
> >>>>>> ...
> >>>>>> - strncpy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>>>>> + copyUnicodeToUtf8(desc->name, lpstrDescription,
> >>>>>> DAUDIO_STRING_LENGTH);
> >>>>>>
> >>>>>> and in DAUDIO_GetDirectAudioDeviceDescription call
> >>>>>> DirectSoundEnumerateW/DirectSoundCaptureEnumerateW
> >>>>>> instead of DirectSoundEnumerate/DirectSoundCaptureEnumerate
> >>>>>>
> >>>>>> For MidiOut:
> >>>>>> Use MIDIOUTCAPSW instead MIDIOUTCAPS, midiOutGetDevCapsW
> instead
> >>>>>> midiOutGetDevCaps
> >>>>>>
> >>>>>> Similar changes in other files.
> >>>>>>
> >>>>>> --alex
> >>>>>>
> >>>>>> On 07/20/2017 08:50, CharlieJiang wrote:
> >>>>>>> Hi Sergey,
> >>>>>>>
> >>>>>>> I finished writing the new patch according to your
> suggestions.
> >>>>>>> I wrote a new source file and a header file to handle the
> charset problem.
> >>>>>>> And I fixed this problem in all Direct devices, Ports and MIDI
> devices.
> >>>>>>> But I don't have debugging environment of MIDI devices.
> >>>>>>> So it will be very nice if somebody can test MIDI devices for
> me.
> >>>>>>> here's the new patch, the parent changeset is the previous
> patch(the direct-devices only commit):
> >>>>>>>
> >>>>>>>
> >>>>>>> # HG changeset patch
> >>>>>>> # User Charlie Jiang<cqjjjzr at 126.com>
> >>>>>>> # Date 1500538314 -28800
> >>>>>>> # Node ID c86ae2f3e1022f9b27ad6918fa342c5a4ee309c0
> >>>>>>> # Parent 1bfe64cffda51c00fccf48e9c0c2adb533fa7e5c
> >>>>>>> 8177951: Charset problem when the name of the sound device
> contains Chinese character
> >>>>>>> Summary: Fix issues in the ANSI2UTF-8 function and move it to
> a seperate file and fix Port Sound and MIDI Sound devices.
> >>>>>>> Contributed-by: Charlie Jiang<cqjjjzr at 126.com>
> >>>>>>>
> >>>>>>> diff --git a/make/lib/SoundLibraries.gmk
> b/make/lib/SoundLibraries.gmk
> >>>>>>> --- a/make/lib/SoundLibraries.gmk
> >>>>>>> +++ b/make/lib/SoundLibraries.gmk
> >>>>>>> @@ -61,6 +61,7 @@
> >>>>>>> -DUSE_PLATFORM_MIDI_IN=TRUE \
> >>>>>>> -DUSE_PORTS=TRUE
> >>>>>>> LIBJSOUND_SRC_FILES += \
> >>>>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>>>> PLATFORM_API_WinOS_MidiIn.cpp \
> >>>>>>> PLATFORM_API_WinOS_MidiOut.c \
> >>>>>>> PLATFORM_API_WinOS_Util.c \
> >>>>>>> @@ -190,6 +191,7 @@
> >>>>>>> OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
> >>>>>>> SRC := $(LIBJSOUND_SRC_DIRS), \
> >>>>>>> INCLUDE_FILES := Utilities.c $(LIBJSOUND_DAUDIOFILES)
> \
> >>>>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>>>> PLATFORM_API_WinOS_DirectSound.cpp, \
> >>>>>>> OPTIMIZATION := LOW, \
> >>>>>>> CFLAGS := $(CFLAGS_JDKLIB) \
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>>>> new file mode 100644
> >>>>>>> --- /dev/null
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>>>> @@ -0,0 +1,61 @@
> >>>>>>> +/*
> >>>>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates.
> All rights reserved.
> >>>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>>>> + *
> >>>>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>>>> + * under the terms of the GNU General Public License version
> 2 only, as
> >>>>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>>>> + *
> >>>>>>> + * This code is distributed in the hope that it will be
> useful, but WITHOUT
> >>>>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>>>> + * accompanied this code).
> >>>>>>> + *
> >>>>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>>>> + *
> >>>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>>>> + * questions.
> >>>>>>> + */
> >>>>>>> +
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> +#include<cstring>
> >>>>>>> +
> >>>>>>> +extern "C" LPSTR ANSIToUTF8(const LPCSTR lpAnsiStr)
> >>>>>>> +{
> >>>>>>> + // ANSI -> Unicode
> >>>>>>> + DWORD dwUnicodeLen = 0;
> >>>>>>> + LPWSTR lpUnicodeStr = nullptr;
> >>>>>>> + dwUnicodeLen = MultiByteToWideChar(CP_ACP, 0, lpAnsiStr,
> -1, nullptr, 0);
> >>>>>>> + lpUnicodeStr = new WCHAR[dwUnicodeLen];
> >>>>>>> + memset(lpUnicodeStr, 0, (dwUnicodeLen) * sizeof(WCHAR));
> >>>>>>> + MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1,
> lpUnicodeStr, dwUnicodeLen);
> >>>>>>> +
> >>>>>>> + // Unicode -> UTF8
> >>>>>>> + LPSTR lpUTF8Str = nullptr;
> >>>>>>> + DWORD dwUTF8Len = 0;
> >>>>>>> + dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> >>>>>>> + lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>>>> + memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> >>>>>>> + WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1,
> lpUTF8Str, dwUTF8Len, nullptr, nullptr);
> >>>>>>> + delete[] lpUnicodeStr;
> >>>>>>> + return lpUTF8Str;
> >>>>>>> +}
> >>>>>>> +
> >>>>>>> +extern "C" void ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR
> src, SIZE_T maxLength) {
> >>>>>>> +#ifndef UNICODE
> >>>>>>> + LPSTR utf8EncodedName = ANSIToUTF8(src);
> >>>>>>> + strncpy(dest, utf8EncodedName, maxLength - 1);
> >>>>>>> + delete[] utf8EncodedName;
> >>>>>>> +#else
> >>>>>>> + strncpy(dest, src, maxLength - 1);
> >>>>>>> +#endif
> >>>>>>> + dest[maxLength - 1] = '\0';
> >>>>>>> +}
> >>>>>>> +
> >>>>>>> \ No newline at end of file
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>>>> new file mode 100644
> >>>>>>> --- /dev/null
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>>>> @@ -0,0 +1,43 @@
> >>>>>>> +/*
> >>>>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates.
> All rights reserved.
> >>>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>>>> + *
> >>>>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>>>> + * under the terms of the GNU General Public License version
> 2 only, as
> >>>>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>>>> + *
> >>>>>>> + * This code is distributed in the hope that it will be
> useful, but WITHOUT
> >>>>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>>>> + * accompanied this code).
> >>>>>>> + *
> >>>>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>>>> + *
> >>>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>>>> + * questions.
> >>>>>>> + */
> >>>>>>> +
> >>>>>>> +#ifndef PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>>>> +#define PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>>>> +
> >>>>>>> +#include<windows.h>
> >>>>>>> +
> >>>>>>> +#ifdef __cplusplus
> >>>>>>> +extern "C" {
> >>>>>>> +#endif
> >>>>>>> +
> >>>>>>> +LPSTR _cdecl ANSIToUTF8(const LPCSTR lpAnsiStr);
> >>>>>>> +
> >>>>>>> +void _cdecl ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR src,
> SIZE_T maxLength);
> >>>>>>> +
> >>>>>>> +#ifdef __cplusplus
> >>>>>>> +}
> >>>>>>> +#endif
> >>>>>>> +
> >>>>>>> +#endif
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> @@ -52,6 +52,9 @@
> >>>>>>> }
> >>>>>>> #endif
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #ifdef USE_DEBUG_SILENCING
> >>>>>>> #define DEBUG_SILENCING0(p) TRACE0(p)
> >>>>>>> #define DEBUG_SILENCING1(p1,p2) TRACE1(p1,p2)
> >>>>>>> @@ -86,28 +89,6 @@
> >>>>>>> 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;
> >>>>>>> @@ -255,13 +236,7 @@
> >>>>>>>
> >>>>>>> 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
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(desc->name,
> lpstrDescription, DAUDIO_STRING_LENGTH);
> >>>>>>> //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> >>>>>>> desc->maxSimulLines = -1;
> >>>>>>> /* do not continue enumeration */
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> @@ -31,6 +31,9 @@
> >>>>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>>>> }
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PLATFORM_MIDI_IN == TRUE
> >>>>>>>
> >>>>>>> #ifdef USE_ERROR
> >>>>>>> @@ -258,8 +261,7 @@
> >>>>>>> INT32 err;
> >>>>>>>
> >>>>>>> if (getMidiInCaps(deviceID,&midiInCaps,&err)) {
> >>>>>>> - strncpy(name, midiInCaps.szPname, nameLength-1);
> >>>>>>> - name[nameLength-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(name, midiInCaps.szPname,
> nameLength);
> >>>>>>> return MIDI_SUCCESS;
> >>>>>>> }
> >>>>>>> MIDIIN_CHECK_ERROR;
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> @@ -28,6 +28,9 @@
> >>>>>>>
> >>>>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PLATFORM_MIDI_OUT == TRUE
> >>>>>>>
> >>>>>>>
> >>>>>>> @@ -82,8 +85,7 @@
> >>>>>>> INT32 err;
> >>>>>>>
> >>>>>>> if (getMidiOutCaps(deviceID,&midiOutCaps,&err)) {
> >>>>>>> - strncpy(name, midiOutCaps.szPname, nameLength-1);
> >>>>>>> - name[nameLength-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>>>>>> return MIDI_SUCCESS;
> >>>>>>> }
> >>>>>>> MIDIOUT_CHECK_ERROR;
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> @@ -38,6 +38,9 @@
> >>>>>>> #include<mmsystem.h>
> >>>>>>> #include "Ports.h"
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PORTS == TRUE
> >>>>>>>
> >>>>>>> typedef struct tag_PortControlID PortControlID;
> >>>>>>> @@ -355,8 +358,7 @@
> >>>>>>> INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> >>>>>>> MIXERCAPS mixerCaps;
> >>>>>>> if (mixerGetDevCaps(mixerIndex,&mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>>>>>> - strncpy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH-1);
> >>>>>>> - description->name[PORT_STRING_LENGTH-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>>>>>> sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion& 0xFF00)>> 8, mixerCaps.vDriverVersion&
> 0xFF);
> >>>>>>> strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> >>>>>>> return TRUE;
> >>>>>>>
> >>>>>>>
> >>>>>>>
> ===================================================================================================
> >>>>>>>
> =================================EOF===============================================================
> >>>>>>>
> ===================================================================================================
> >>>>>>>
> >>>>>>>
> >>>>>>> And if you need a patch that can be directly applied to the
> root repo, then use this:
> >>>>>>>
> >>>>>>>
> >>>>>>> diff --git a/make/lib/SoundLibraries.gmk
> b/make/lib/SoundLibraries.gmk
> >>>>>>> --- a/make/lib/SoundLibraries.gmk
> >>>>>>> +++ b/make/lib/SoundLibraries.gmk
> >>>>>>> @@ -61,6 +61,7 @@
> >>>>>>> -DUSE_PLATFORM_MIDI_IN=TRUE \
> >>>>>>> -DUSE_PORTS=TRUE
> >>>>>>> LIBJSOUND_SRC_FILES += \
> >>>>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>>>> PLATFORM_API_WinOS_MidiIn.cpp \
> >>>>>>> PLATFORM_API_WinOS_MidiOut.c \
> >>>>>>> PLATFORM_API_WinOS_Util.c \
> >>>>>>> @@ -190,6 +191,7 @@
> >>>>>>> OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
> >>>>>>> SRC := $(LIBJSOUND_SRC_DIRS), \
> >>>>>>> INCLUDE_FILES := Utilities.c $(LIBJSOUND_DAUDIOFILES)
> \
> >>>>>>> + PLATFORM_API_WinOS_Charset_Util.cpp \
> >>>>>>> PLATFORM_API_WinOS_DirectSound.cpp, \
> >>>>>>> OPTIMIZATION := LOW, \
> >>>>>>> CFLAGS := $(CFLAGS_JDKLIB) \
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>>>> new file mode 100644
> >>>>>>> --- /dev/null
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.cpp
> >>>>>>> @@ -0,0 +1,61 @@
> >>>>>>> +/*
> >>>>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates.
> All rights reserved.
> >>>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>>>> + *
> >>>>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>>>> + * under the terms of the GNU General Public License version
> 2 only, as
> >>>>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>>>> + *
> >>>>>>> + * This code is distributed in the hope that it will be
> useful, but WITHOUT
> >>>>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>>>> + * accompanied this code).
> >>>>>>> + *
> >>>>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>>>> + *
> >>>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>>>> + * questions.
> >>>>>>> + */
> >>>>>>> +
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> +#include<cstring>
> >>>>>>> +
> >>>>>>> +extern "C" LPSTR ANSIToUTF8(const LPCSTR lpAnsiStr)
> >>>>>>> +{
> >>>>>>> + // ANSI -> Unicode
> >>>>>>> + DWORD dwUnicodeLen = 0;
> >>>>>>> + LPWSTR lpUnicodeStr = nullptr;
> >>>>>>> + dwUnicodeLen = MultiByteToWideChar(CP_ACP, 0, lpAnsiStr,
> -1, nullptr, 0);
> >>>>>>> + lpUnicodeStr = new WCHAR[dwUnicodeLen];
> >>>>>>> + memset(lpUnicodeStr, 0, (dwUnicodeLen) * sizeof(WCHAR));
> >>>>>>> + MultiByteToWideChar(CP_ACP, 0, lpAnsiStr, -1,
> lpUnicodeStr, dwUnicodeLen);
> >>>>>>> +
> >>>>>>> + // Unicode -> UTF8
> >>>>>>> + LPSTR lpUTF8Str = nullptr;
> >>>>>>> + DWORD dwUTF8Len = 0;
> >>>>>>> + dwUTF8Len = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr,
> -1, nullptr, 0, nullptr, nullptr);
> >>>>>>> + lpUTF8Str = new CHAR[dwUTF8Len];
> >>>>>>> + memset(lpUTF8Str, 0, sizeof(CHAR) * (dwUTF8Len));
> >>>>>>> + WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1,
> lpUTF8Str, dwUTF8Len, nullptr, nullptr);
> >>>>>>> + delete[] lpUnicodeStr;
> >>>>>>> + return lpUTF8Str;
> >>>>>>> +}
> >>>>>>> +
> >>>>>>> +extern "C" void ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR
> src, SIZE_T maxLength) {
> >>>>>>> +#ifndef UNICODE
> >>>>>>> + LPSTR utf8EncodedName = ANSIToUTF8(src);
> >>>>>>> + strncpy(dest, utf8EncodedName, maxLength - 1);
> >>>>>>> + delete[] utf8EncodedName;
> >>>>>>> +#else
> >>>>>>> + strncpy(dest, src, maxLength - 1);
> >>>>>>> +#endif
> >>>>>>> + dest[maxLength - 1] = '\0';
> >>>>>>> +}
> >>>>>>> +
> >>>>>>> \ No newline at end of file
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>>>> new file mode 100644
> >>>>>>> --- /dev/null
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Charset_Util.h
> >>>>>>> @@ -0,0 +1,43 @@
> >>>>>>> +/*
> >>>>>>> + * Copyright (c) 1999, 2012, Oracle and/or its affiliates.
> All rights reserved.
> >>>>>>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
> HEADER.
> >>>>>>> + *
> >>>>>>> + * This code is free software; you can redistribute it and/or
> modify it
> >>>>>>> + * under the terms of the GNU General Public License version
> 2 only, as
> >>>>>>> + * published by the Free Software Foundation. Oracle
> designates this
> >>>>>>> + * particular file as subject to the "Classpath" exception as
> provided
> >>>>>>> + * by Oracle in the LICENSE file that accompanied this code.
> >>>>>>> + *
> >>>>>>> + * This code is distributed in the hope that it will be
> useful, but WITHOUT
> >>>>>>> + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> >>>>>>> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
> Public License
> >>>>>>> + * version 2 for more details (a copy is included in the
> LICENSE file that
> >>>>>>> + * accompanied this code).
> >>>>>>> + *
> >>>>>>> + * You should have received a copy of the GNU General Public
> License version
> >>>>>>> + * 2 along with this work; if not, write to the Free Software
> Foundation,
> >>>>>>> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA.
> >>>>>>> + *
> >>>>>>> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores,
> CA 94065 USA
> >>>>>>> + * or visit www.oracle.com if you need additional information
> or have any
> >>>>>>> + * questions.
> >>>>>>> + */
> >>>>>>> +
> >>>>>>> +#ifndef PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>>>> +#define PLATFORM_API_WINOS_CHARSET_UTILS_H
> >>>>>>> +
> >>>>>>> +#include<windows.h>
> >>>>>>> +
> >>>>>>> +#ifdef __cplusplus
> >>>>>>> +extern "C" {
> >>>>>>> +#endif
> >>>>>>> +
> >>>>>>> +LPSTR _cdecl ANSIToUTF8(const LPCSTR lpAnsiStr);
> >>>>>>> +
> >>>>>>> +void _cdecl ANSIToUTF8IfNeededAndCopy(LPSTR dest, LPCSTR src,
> SIZE_T maxLength);
> >>>>>>> +
> >>>>>>> +#ifdef __cplusplus
> >>>>>>> +}
> >>>>>>> +#endif
> >>>>>>> +
> >>>>>>> +#endif
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> >>>>>>> @@ -52,6 +52,9 @@
> >>>>>>> }
> >>>>>>> #endif
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #ifdef USE_DEBUG_SILENCING
> >>>>>>> #define DEBUG_SILENCING0(p) TRACE0(p)
> >>>>>>> #define DEBUG_SILENCING1(p1,p2) TRACE1(p1,p2)
> >>>>>>> @@ -233,7 +236,7 @@
> >>>>>>>
> >>>>>>> INT32 cacheIndex = findCacheItemByGUID(lpGuid,
> g_audioDeviceCache[desc->deviceID].isSource);
> >>>>>>> if (cacheIndex == desc->deviceID) {
> >>>>>>> - strncpy(desc->name, lpstrDescription,
> DAUDIO_STRING_LENGTH);
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(desc->name,
> lpstrDescription, DAUDIO_STRING_LENGTH);
> >>>>>>> //strncpy(desc->description, lpstrModule,
> DAUDIO_STRING_LENGTH);
> >>>>>>> desc->maxSimulLines = -1;
> >>>>>>> /* do not continue enumeration */
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiIn.cpp
> >>>>>>> @@ -31,6 +31,9 @@
> >>>>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>>>> }
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PLATFORM_MIDI_IN == TRUE
> >>>>>>>
> >>>>>>> #ifdef USE_ERROR
> >>>>>>> @@ -258,8 +261,7 @@
> >>>>>>> INT32 err;
> >>>>>>>
> >>>>>>> if (getMidiInCaps(deviceID,&midiInCaps,&err)) {
> >>>>>>> - strncpy(name, midiInCaps.szPname, nameLength-1);
> >>>>>>> - name[nameLength-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(name, midiInCaps.szPname,
> nameLength);
> >>>>>>> return MIDI_SUCCESS;
> >>>>>>> }
> >>>>>>> MIDIIN_CHECK_ERROR;
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_MidiOut.c
> >>>>>>> @@ -28,6 +28,9 @@
> >>>>>>>
> >>>>>>> #include "PLATFORM_API_WinOS_Util.h"
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PLATFORM_MIDI_OUT == TRUE
> >>>>>>>
> >>>>>>>
> >>>>>>> @@ -82,8 +85,7 @@
> >>>>>>> INT32 err;
> >>>>>>>
> >>>>>>> if (getMidiOutCaps(deviceID,&midiOutCaps,&err)) {
> >>>>>>> - strncpy(name, midiOutCaps.szPname, nameLength-1);
> >>>>>>> - name[nameLength-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(name, midiOutCaps.szPname,
> nameLength);
> >>>>>>> return MIDI_SUCCESS;
> >>>>>>> }
> >>>>>>> MIDIOUT_CHECK_ERROR;
> >>>>>>> diff --git
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> ---
> a/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> +++
> b/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_Ports.c
> >>>>>>> @@ -38,6 +38,9 @@
> >>>>>>> #include<mmsystem.h>
> >>>>>>> #include "Ports.h"
> >>>>>>>
> >>>>>>> +/* include to prevent charset problem */
> >>>>>>> +#include "PLATFORM_API_WinOS_Charset_Util.h"
> >>>>>>> +
> >>>>>>> #if USE_PORTS == TRUE
> >>>>>>>
> >>>>>>> typedef struct tag_PortControlID PortControlID;
> >>>>>>> @@ -355,8 +358,7 @@
> >>>>>>> INT32 PORT_GetPortMixerDescription(INT32 mixerIndex,
> PortMixerDescription* description) {
> >>>>>>> MIXERCAPS mixerCaps;
> >>>>>>> if (mixerGetDevCaps(mixerIndex,&mixerCaps,
> sizeof(MIXERCAPS)) == MMSYSERR_NOERROR) {
> >>>>>>> - strncpy(description->name, mixerCaps.szPname,
> PORT_STRING_LENGTH-1);
> >>>>>>> - description->name[PORT_STRING_LENGTH-1] = 0;
> >>>>>>> + ANSIToUTF8IfNeededAndCopy(description->name,
> mixerCaps.szPname, PORT_STRING_LENGTH);
> >>>>>>> sprintf(description->version, "%d.%d",
> (mixerCaps.vDriverVersion& 0xFF00)>> 8, mixerCaps.vDriverVersion&
> 0xFF);
> >>>>>>> strncpy(description->description, "Port Mixer",
> PORT_STRING_LENGTH-1);
> >>>>>>> return TRUE;
> >>>>>>>
> >>>>>>>
> >>>>>>> About the issue of the OCA, because actually I won't often
> push code to the OpenJDK repo,
> >>>>>>> so I think it's unnecessary to join the OCB now, and the steps
> to join it is pretty complex.
> >>>>>>>
> >>>>>>> Cheers,
> >>>>>>> Charlie Jiang
> >>>>>>> 2017-7-20
> >>>>>>>
> >>>>>>> PS: a picture of the effect of the new patch:
> >>>>>>> http://imgur.com/a/SjlAU
> >>>>>>>
> >>>>>>>
> ===================================================================================================
> >>>>>>>
> =================================EOF===============================================================
> >>>>>>>
> ===================================================================================================
> >>>>>>>
> >>>>>>>
> >>>>>>> At 2017-07-18 08:38:15, "Sergey
> Bylokhov"<sergey.bylokhov at oracle.com> wrote:
> >>>>>>>
> >>>>>>> p { margin: 0; }
> >>>>>>> Hello.
> >>>>>>> I uploaded the current patch to cr.openjdk:
> >>>>>>> http://cr.openjdk.java.net/~serb/8177951/webrev.00
> >>>>>>>
> >>>>>>> I have tested the patch and here is my observation:
> >>>>>>> - The patch works for direct devices, but it looks like the
> same bug exists in Ports(also reproduced by your testcase), did you
> have a chance to look into this issue as well?
> >>>>>>> - jdk uses "warning-as-error" policy during the build, so
> currently there is a build failure, because of this warning:
> >>>>>>> PLATFORM_API_WinOS_DirectSound.cpp(93) : warning
> C4267: 'initializing' : conversion from 'size_t' to 'DWORD', possible
> loss of data
> >>>>>>> - Note that the memory which is allocated by "new[]" should
> be deallocated by the "delete[]", but current fix use simple
> "delete".
> >>>>>>> - Can you please sign and submit the OCA[1], which will
> allow you to contribute to the openjdk?
> >>>>>>>
> >>>>>>> [1]
> http://www.oracle.com/technetwork/community/oca-486395.html
> >>>>>>>
> >>>>>>>
> >>>>>>> ----- cqjjjzr at 126.com wrote:
> >>>>>>>
> >>>>>>>>
> >>>>>>> Hello,
> >>>>>>> Please review this bug report:
> https://bugs.openjdk.java.net/browse/JDK-8177951
> >>>>>>>
> >>>>>>> A brief description of the issue:
> >>>>>>> In non-English Windows, the DirectAudioDeviceProvider can't
> work properly, AudioSystem.getMixerInfo()[0].getName() (or any other
> index, as long as the name of mixer contains non-ASCII characters)will
> return a corrupted string (all non-ASCII chars become messy codes).
> >>>>>>> The main reason is in native codes, we get a string in
> ANSI(platform-dependent) charset. But in the code the string is just
> processed as a UTF-8 string. So the JVM encodes ANSI string by UTF-8
> encoding.
> >>>>>>>
> >>>>>>> Detailed description:
> >>>>>>> The performace of the bug is contained in the link above, I'll
> talk about the reason of the issue. All research below are based on
> OpenJDK 9, but I think OpenJDK 8 is also applicable.
> >>>>>>>
> >>>>>>> In
> jdk/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp,
> Function DS_GetDesc_Enum, Line 236, the name of the device is
> gotten(called by function DirectSoundDeviceEnumerate) from the OS, in
> ANSI charset, in a LPCSTR. And you just copy the ANSI encoded string
> to the DirectAudioDeviceDescription struct. So let's look at the
> jdk/src/java.desktop/share/native/libjsound/DirectAudioDeviceProvider.c,
> Function getDirectAudioDeviceDescription and
> Java_com_sun_media_sound_DirectAudioDeviceProvider_nNewDirectAudioDeviceInfo,
> Line 48 and 98, you called NewStringUTF function with a ANSI encoded
> string. So we got a UTF-8 encoded ANSI string. But obviously we need a
> UTF-8 encoded Unicode String.
> >>>>>>>
> >>>>>>> I wrote to Oracle but they can't reproduce the issue, so I
> went on fixing the bug by myself. I wrote a function to convert ANSI
> string to UTF-8 encoded Unicode string.
> >>>>>>>
> >>>>>>> And I found a problem: In Multi-Byte compiling mode,
> DirectSoundDeviceEnumerate will call DirectSoundDeviceEnumerateA and
> it will present a ANSI string as the argument, but in Unicode mode,
> DirectSoundDeviceEnumerate calls DirectSoundDeviceEnumerateW which
> presents a UTF-8 encoded Unicode string! So I think it's necessary to
> check if the compiler is in Unicode mode(by checking UNICODE macro),
> and only convert the string when it's in Multi-Byte mode.
> >>>>>>>
> >>>>>>> But, I don't have the debugging environment, I have problem
> configuring the compiler of OpenJDK. LINK : error LNK2001: unresolved
> external symbol _mainCRTStartup when executing ./configure script. So
> I can't test the validness of the patch. I'll be grateful if someone
> can help solve the configuring problem or test the patch for me. Even
> if you can compile the JDK with the patch is OK.
> >>>>>>> If you'd like to test the patch, you can test it with the
> first device from DirectSoundDeviceEnumerate, 'Primary Sound Driver'.
> Maybe you don't have Chinese font, I'll attach a picture to the
> correct output.
> >>>>>>>
> >>>>>>> The patch is below and attached with the E-Mail. It's
> applicable for OpenJDK9, maybe 8 if you change it.
> >>>>>>> https://imgur.com/a/6kgeU
> >>>>>>> The code in the picture is just for generate a output, in the
> Unicode mode, so it's not applicable for JDK.
> >>>>>>>
> >>>>>>> ***
> old/jdk/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> 2017-06-21 03:57:42.000000000 +0800
> >>>>>>> ---
> new/jdk/src/java.desktop/windows/native/libjsound/PLATFORM_API_WinOS_DirectSound.cpp
> 2017-06-24 16:26:57.232247800 +0800
> >>>>>>> ***************
> >>>>>>> *** 86,91 ****
> >>>>>>> --- 86,113 ----
> >>>>>>> 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;
> >>>>>>> ***************
> >>>>>>> *** 233,239 ****
> >>>>>>> --- 255,267 ----
> >>>>>>>
> >>>>>>> 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 */
> >>>>>>>
> >>>>>>> Cheers,
> >>>>>>> Charlie Jiang
> >>>>>>>>
> >>>>>>>
More information about the sound-dev
mailing list