All of lore.kernel.org
 help / color / mirror / Atom feed
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;

             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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.