On Friday, February 10, 2012 10:50:33 PM Нискородов Серёжа wrote:
Not only sample type, but sample rate to. For example, dmix plugin have predefined samplerate for mixing, so if WINE send other samplerate to it without "plug:" wrapper, in best case you will get error message and no sound.
As I mentioned, native mmdevapi doesn't do samplerate conversion or channel remixing. For shared mode, the device only opens with a pre-defined, user- selected rate and channel config. The only thing the default native mmdevapi will do is accept different sample depths/type (prefering float32). It's up to the app or whatever component is using mmdevapi to convert to the rate/channels given by GetMixFormat.
Any other conversion besides sample type is reliant on the user having installed plugins that'll do the wanted conversion. If it really becomes an issue (which it shouldn't), Wine could support these and have some by default.
FWIW, my custom dmix device for 5.1 Surround output shows up in aplay -L with a colon, as it's defined to accept arguments for the output device instead of hardcoding one, and neither plain 'dmix' or 'default' get listed. The only name without a colon is 'null'.
Seems like devices without a colon in names is only devices defined in /etc/asound.conf or in ~/.asoundrc
My dmix51 device is defined in /etc/asound.conf. The difference is, it's defined to accept CARD, DEV, and SUBDEV parameters similar to regular dmix, so ALSA will enumerate it for each CARD and DEV that can support its output parameters.
dmix51:CARD=NVidia,DEV=1 HDA NVidia, ALC888 Digital Direct sample mixing device (5.1 Surround)
All but "dmix51:CARD=NVidia,DEV=0" is completely useless
Do you can play wav mono 11025Hz directly to your dmix51 device? Without "plug:" wrapper? With my soundcard I can't.
Nope, it won't open in a rate other than 48000hz without plug:. But again, that's fine for mmdevapi as it doesn't support rate conversion by default.
So I can enumerate dmix*: devices to, I even can enumerate all devices, but I see almost no sence in this.
What I'd suggest is using snd_card_next, snd_ctl_open (which won't lock the device like snd_pcm_open), snd_ctl_pcm_next_device, and related, to enumerate available card names and device indices, and have a configuration option in winecfg or somewhere to specify the prefix used ("dmix:", "plughw:", something custom, etc). Maybe another option to specify an additional list of custom devices that can't be detected this way, though most users shouldn't need that with the appropriate device prefix selected.
Just make sure to use the card name given by snd_ctl_card_info_get_id, so that the CARD parameter remains constant even if the card index changes.