diff -ur .orig/dmasound_awacs.c .mod/dmasound_awacs.c --- .orig/dmasound_awacs.c Tue Feb 26 09:35:34 2002 +++ .mod/dmasound_awacs.c Tue Feb 26 23:17:40 2002 @@ -753,6 +753,16 @@ dmasound.dsp.size = size; } } + else { + dmasound.soft.format = req_format; + dmasound.soft.size = size; + dmasound.hard.format = format; + if (dmasound.minDev == SND_DEV_DSP) { + dmasound.dsp.format = format; + dmasound.dsp.size = size; + } + format = req_format; + } return format; } @@ -2692,7 +2702,7 @@ __init set_hw_byteswap(struct device_node *io) { struct device_node *mio ; - unsigned int *p, kl = 0 ; + unsigned int kl = 0 ; /* if seems that Keylargo can't byte-swap */ diff -ur .orig/dmasound_core.c .mod/dmasound_core.c --- .orig/dmasound_core.c Tue Feb 26 09:35:34 2002 +++ .mod/dmasound_core.c Tue Feb 26 23:17:40 2002 @@ -1263,7 +1263,7 @@ if (result < 0) return result; if (format != data) - return -EINVAL; + return -ENOSYS; return 0; } else return -EINVAL ; diff -ur .orig/trans_16.c .mod/trans_16.c --- .orig/trans_16.c Tue Feb 26 09:35:35 2002 +++ .mod/trans_16.c Tue Feb 26 23:17:40 2002 @@ -163,23 +163,30 @@ ssize_t count, used; int stereo = dmasound.soft.stereo; short *fp = (short *) &frame[*frameUsed]; + short *up = (short *) userPtr; frameLeft >>= 2; userCount >>= (stereo? 2: 1); used = count = min_t(unsigned long, userCount, frameLeft); - if (!stereo) { - short *up = (short *) userPtr; - while (count > 0) { - short data; + while (count > 0) { + short data; + if (get_user(data, up++)) + return -EFAULT; + if ((dmasound.hard.format == AFMT_S16_BE) && (dmasound.soft.format == AFMT_S16_LE)) { + *fp++ = swab16( data ); + } else { + *fp++ = data; + } + if (stereo) { if (get_user(data, up++)) return -EFAULT; + } + if ((dmasound.hard.format == AFMT_S16_BE) && (dmasound.soft.format == AFMT_S16_LE)) { + *fp++ = swab16( data ); + } else { *fp++ = data; - *fp++ = data; - count--; } - } else { - if (copy_from_user(fp, userPtr, count * 4)) - return -EFAULT; + count--; } *frameUsed += used * 4; return stereo? used * 4: used * 2; @@ -203,13 +210,21 @@ if (get_user(data, up++)) return -EFAULT; data ^= mask; - *fp++ = data; + if ((dmasound.hard.format == AFMT_S16_BE) && (dmasound.soft.format == AFMT_S16_LE)) { + *fp++ = swab16(data); + } else { + *fp++ = data; + } if (stereo) { if (get_user(data, up++)) return -EFAULT; data ^= mask; } - *fp++ = data; + if ((dmasound.hard.format == AFMT_S16_BE) && (dmasound.soft.format == AFMT_S16_LE)) { + *fp++ = swab16(data); + } else { + *fp++ = data; + } count--; } *frameUsed += used * 4;