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](http://blogs.msdn.com/oldnewthing/archive/2005/03/08/389527.aspx) 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()` and `WideCharToMultiByte()` functions to perform the conversions, with `CP_ACP` and `CP_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 the `CP_ACP` (ANSI) codepage.
* I use `IID_IDirectMusic8::EnumPort()` to get port information from DirectMusic...
* ... and convert `DMUS_PORTCAPS.wszDescription` using the `CP_OEMCP` codepage.