I'm working on Bug 14559 and have run into an interesting UI problem.
In WinMM, there are three "classes" of devices: waveIn, waveOut, and
mixer. Windows 7's WinMM implementation provides one mixer for each
waveIn and waveOut device. The "WCHAR caps.szPname[32]" field for the
matching mixer and waveIn/Out device are the same. Some applications,
in this case Rosetta Stone 3, use the matching szPname fields to
determine which mixer to associate with which device.
The problem turns up when we have duplicate input and output device
names. Consider:
waveOut:
0: default
1: HDA Intel Analog
2: HDA Intel Digital
waveIn:
0: default
1: HDA Intel Analog
mixer:
0: default
1: HDA Intel Analog
2: HDA Intel Digital
3: default
4: HDA Intel Analog
Rosetta Stone chooses waveIn[0] and starts iterating over the mixers'
szPname fields, finding that mixer[0] matches. But, mixer[0] is
actually associated with the waveOut default, not the waveIn default.
Bad things happen.
Windows 7 solves this problem implicitly by providing unique device
names at the MMDevAPI level. For instance, the input device is
Microphone and the output devices are Stereo and Headphones. Hacking
the registry to force duplicate MMDevAPI device names actually does
result in duplicate mixer names. But Wine's backends don't provide
this kind of information, so we simply provide the ALSA device name as
the device's name.
As an attempt to solve this in Wine, I added a prefix to each MMDevice
indicating its flow direction. The unique identifier must be a
prefix, as WinMM's szPname field truncates at 31 characters. This
gives WinMM device names like:
waveOut:
0: Out: default
1: Out: HDA Intel Analog
2: Out: HDA Intel Digital
This solves the Rosetta Stone issue, as you can see in the bug. But
when testing this in other applications, it quickly becomes silly.
Audacity 1.3 adds its own "Out: " prefix to WinMM device names,
creating "Out: Out: default" in the UI.
Dynamically adding prefixes only if a duplicate device is present
causes issues with duplicates appearing/disappearing. Trying to
remember if a duplicate has ever been present is quite "ugly" in code,
requiring storing that kind of information in the registry.
So I don't know what to do. Have ugly, redundant device names? Leave
Rosetta Stone broken, as it is arguably an application bug? Try to
guess at the device type, and insert names like "Speakers" and
"Microphone" into the MMDevAPI device name, even if that might be
wrong?
Thoughts?
Andrew