Some more testing done.
Fisrt of all, "linux_quirk" confirmed (Linux 3.2, ALSA 1.0.24).
Without it, switching from a 16/44.1 stream to a 24/96 one will mess up playback.
This happen even if the lo-s/r track playback is stopped (by pressing "stop") before starting the hi-s/r track playback. Only pressing "stop" and then "play" again
after the hi-s/r track (messy) playback have been started fixes the problem.
Curiously, switching between 16/44.1 and 24/48 works just fine.
Perhaps the problem arose only when the s/r difference between the two streams is large?
Switching back to lower s/r (24/96 -> 16/44.1) seems to work without problems also without "linux_quirk".
(player used for these tests: "gogglesmm" version 0.12.3).
BTW: what happen if you forget to switch and leave "linux_quirk" enabled on MacOS/X or Windows?
Does it work OK on Linux in UAC1 mode?
there seems to be a few minor problems.
First of all, WidgetControl.py (version from git "audio-widget", 2012-04-27) does not recognize the widget in UAC1 mode. Error: "DG8SAQ/MOBO device not found".
I guess this may have to do with the changed IDs? maybe productid=0x03e9 should match with "vendorid1" (0x16c0) instead of vendorid2 (0xfffe) ?
Try this patch, seems to work here.
Code:
--- WidgetControl.py~ 2012-05-05 10:35:41.951960360 +0200
+++ WidgetControl.py 2012-05-05 12:36:04.699761123 +0200
@@ -33,8 +33,8 @@
vendorid2 = 0xfffe
productid1 = 0x05dc
productid2 = 0x03e8
-productid3 = 0x0007
-productid4 = 0x03e9
+productid3 = 0x03e9
+productid4 = 0x0007
confignum = 1
interfacenum= 0
timeout = 1500
@@ -151,7 +151,7 @@
founddev = dev
foundbus = bus
break
- if (dev.idVendor == vendorid2) & (dev.idProduct == productid3):
+ if (dev.idVendor == vendorid1) & (dev.idProduct == productid3):
founddev = dev
foundbus = bus
break
(patch more complex than strictly required, I have also re-ordered it for purely "esthetic" reasons).
Other problem is that playing a 44.1/16 stream on the ALSA raw device "hw:n,0" fails with error:
Code:
play FAIL formats: can't open output file `hw:2,0': select_format error: Operation not permitted
using plughw:2,0 instead works fine.
Same stream in UAC2 mode works fine with both "hw:n,0" and "plughw:n,0" devices.
I guess in UAC2 mode it also accepts 16 bit streams directly while in UAC1 it only accept 32bit ones? Or perhaps it's a matter of what capabilities are known/announced to ALSA? Or is it some intrinsic difference between UAC1 & UAC2?
checking /proc/asound/DG8SAQI2C/stream0 I get the following for UAC1:
Code:
www.obdev.at DG8SAQ-I2C at usb-0000:00:1a.1-2, full speed : USB Audio
Playback:
Status: Stop
Interface 3
Altset 1
Format: S24_3LE
Channels: 2
Endpoint: 4 OUT (ASYNC)
Rates: 44100, 48000
and for UAC2:
Code:
www.obdev.at DG8SAQ-I2C at usb-0000:00:1a.7-4, high speed : USB Audio
Playback:
Status: Stop
Interface 2
Altset 1
Format: S32_LE
Channels: 2
Endpoint: 2 OUT (ASYNC)
Rates: 44100, 88200, 132300, 176400, 48000, 96000, 144000, 192000
Data packet interval: 250 us
I guess that it is the S24_3LE vs S32_LE that makes the difference. Would it be possibile to use S32_LE also in UAC1? or are they standard-mandated formats?