Hello,
I noticed that when reading MIDI port names from MME, the names are multi-byte strings encoded using the ANSI Codepage, which my app uses by default. When receiving those names from the DirectMusic driver, the names are wide-character strings encoded with the OEM Codepage. See this article by Raymond Chen for a quick refresher on Codepages.
On my German system, this means that when using the current codepage, which turns out to be the ANSI one, I get "Audiogerät" from MME, and "Audiogeröt" from DirectMusic, the latter being wrong. This gets fixed when I treat that last name as OEM-encoded instead.
So how do I know with which codepage to decode those names? Why does the name coming from DirectMusic get encoded differently? Does it come from the USB driver? The COM framework? DirectMusic? How can I know for sure which codepage to use when reading the names of my MIDI ports?
For info:
- I use the
MultiByteToWideChar()
andWideCharToMultiByte()
functions to perform the conversions, withCP_ACP
andCP_OEMCP
as argument for the codepage to use. - I use
midiInGetDeviceCaps()
to get MIDI port information from the MME subsystem... - ... and convert
MIDIINCAPS.szPname
using theCP_ACP
(ANSI) codepage. - I use
IID_IDirectMusic8::EnumPort()
to get port information from DirectMusic... - ... and convert
DMUS_PORTCAPS.wszDescription
using theCP_OEMCP
codepage.