[alsa-devel] hdsp driver broken for Multiface II Rev 35
Andreas Degert
ad at papyrus-gmbh.de
Mon Jan 14 02:21:42 CET 2008
Hi folks,
changeset 5326 from 2007/08/31 broke the driver for this card revision.
There was an older thread about this problem which didn't seem to come
to a conclusion.
ioctl SNDRV_HDSP_IOCTL_GET_VERSION returns
io_type = 1 (Multiface)
firmware_rev = 0x35
which is correct. The old code for hdsp_playback_to_output_key looks
like this:
static int hdsp_playback_to_output_key (struct hdsp *hdsp, int in, int out)
{
switch (hdsp->firmware_rev) {
case 0xa:
return (64 * out) + (32 + (in));
case 0x96:
case 0x97:
return (32 * out) + (16 + (in));
default:
return (52 * out) + (26 + (in));
}
}
For my card the result is "(52 * out) + (26 + (in))". The new code
looks like this:
static int hdsp_playback_to_output_key (struct hdsp *hdsp, int in, int out)
{
switch (hdsp->io_type) {
case Multiface:
case Digiface:
default:
return (64 * out) + (32 + (in));
case H9632:
return (32 * out) + (16 + (in));
case H9652:
return (52 * out) + (26 + (in));
}
}
which gives the wrong result "(64 * out) + (32 + (in))". The old code
returns this when firmware_rev == 0xa, which might be the revision of
the older Multiface (not Multiface II). I changed the code to
static int hdsp_playback_to_output_key (struct hdsp *hdsp, int in, int out)
{
switch (hdsp->io_type) {
case Multiface:
case Digiface:
default:
if (hdsp->firmware_rev == 0xa)
return (64 * out) + (32 + (in));
else
return (52 * out) + (26 + (in));
case H9632:
return (32 * out) + (16 + (in));
case H9652:
return (52 * out) + (26 + (in));
}
}
Another possibility would be to go back to the old version of the code
and only make changes for io_type H9632/H9652 with new firmware
revisions:
static int hdsp_playback_to_output_key (struct hdsp *hdsp, int in, int out)
{
switch (hdsp->firmware_rev) {
case 0xa:
return (64 * out) + (32 + (in));
case 0x96:
case 0x97:
return (32 * out) + (16 + (in));
}
switch (hdsp->io_type) {
case H9632:
return (32 * out) + (16 + (in));
case Multiface:
case H9652:
return (52 * out) + (26 + (in));
case Digiface:
??? is there a Digiface with revision != 0xa ???
default:
??? HDSP_IO_Type Undefined ???
}
}
Similar changes must be made to hdsp_input_to_output_key. Does anyone
know which firmware revision exist for which card (io_type) ?
thank you
Andreas Degert
More information about the Alsa-devel
mailing list