From: Bill Fink <billfink@mindspring.com>
To: LinuxPPC Developers <linuxppc-dev@lists.linuxppc.org>
Cc: YellowDog Linux General
<yellowdog-general@lists.terrasoftsolutions.com>,
Bill Fink <billfink@mindspring.com>
Subject: dmasound audio patch
Date: Sun, 7 Apr 2002 17:23:58 -0400 [thread overview]
Message-ID: <20020407172358.36f3fd3e.billfink@mindspring.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1011 bytes --]
Hi,
A friend of mine, Rob Scott, worked up a patch to the dmasound driver
that fixes some of the PPC endianness issues by doing byte swapping
in the driver. He uses it on a Titanium PowerBook, and I am using it
on a dual 500 MHz G4 with good results. Before the patch, using xmms
with the AudioCD Reader plugin, I had to use the esound driver since
the OSS driver just gave static. Now I can use the OSS driver directly,
so there's no need to run the esd daemon.
I know this patch probably isn't politically correct, since as I understand
it Linus doesn't believe that things such as byte swapping should be done
in the kernel. But then he lives on a little endian machine and doesn't
need to mess with dozens of broken audio applications. So if you're not
worried about kernel political correctness, you might want to give this
patch a try. Of course I make no warranty of any kind, but I can attest
that it works fine on a couple of different PPC systems with BenH kernels
around 2.4.18.
-Bill
[-- Attachment #2: dmasound.patch --]
[-- Type: application/octet-stream, Size: 2721 bytes --]
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;
next reply other threads:[~2002-04-07 21:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-04-07 21:23 Bill Fink [this message]
2002-04-08 10:30 ` dmasound audio patch Michel Dänzer
2002-04-08 12:41 ` Bill Fink
2002-04-08 12:50 ` Michel Dänzer
2002-04-08 14:14 ` Bill Fink
2002-04-08 13:22 ` Bill Fink
2002-04-08 11:49 ` Benjamin Herrenschmidt
2002-04-08 19:23 ` Bill Fink
2002-04-08 18:45 ` Benjamin Herrenschmidt
2002-04-09 1:52 ` Bill Fink
2002-04-09 2:24 ` jeffk
2002-04-09 7:18 ` Ethan Benson
-- strict thread matches above, loose matches on Subject: below --
2002-04-10 3:36 Bill Fink
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020407172358.36f3fd3e.billfink@mindspring.com \
--to=billfink@mindspring.com \
--cc=linuxppc-dev@lists.linuxppc.org \
--cc=yellowdog-general@lists.terrasoftsolutions.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).