mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] Multiple soundcard support in register_sound_special()
@ 2002-01-06 18:36 Chris Rankin
  0 siblings, 0 replies; only message in thread
From: Chris Rankin @ 2002-01-06 18:36 UTC (permalink / raw)
  To: jgarzik, zab; +Cc: linux-kernel

I am feeling "lucky" and so I am going to post this patch again
:-). This patch is needed to allow ALSA to provide OSS compatibility
for multiple sound cards, because ALSA uses the
register_sound_special() function exclusively to create OSS device
nodes. With the patch (and devfs), my /dev/sound directory looks like
this:

$ ls -als /dev/sound
total 0
   0 drwxr-xr-x    1 root     root            0 Jan  1  1970 .
   0 drwxr-xr-x    1 root     root            0 Jan  1  1970 ..
   0 crw-rw-rw-    1 root     root      14,  14 Jan  1  1970 admmidi
   0 crw-rw-rw-    1 root     root      14,  12 Jan  1  1970 adsp
   0 crw-rw-rw-    1 root     root      14,  13 Jan  1  1970 amidi
   0 crw-rw-rw-    1 root     root      14,   4 Jan  1  1970 audio
   0 crw-rw-rw-    1 root     root      14,  20 Jan  1  1970 audio1
   0 crw-rw-rw-    1 root     root      14,   9 Jan  1  1970 dmmidi
   0 crw-rw-rw-    1 root     root      14,   3 Jan  1  1970 dsp
   0 crw-rw-rw-    1 root     root      14,  19 Jan  1  1970 dsp1
   0 crw-rw-rw-    1 root     root      14,   2 Jan  1  1970 midi
   0 crw-rw-rw-    1 root     root      14,   0 Jan  1  1970 mixer
   0 crw-rw-rw-    1 root     root      14,  16 Jan  1  1970 mixer1
   0 crw-rw-rw-    1 root     root      14,   1 Jan  1  1970 sequencer
   0 crw-rw-rw-    1 root     root      14,   8 Jan  1  1970 sequencer2

Without it, my /dev/sound directory looks like this:

$ ls -als /dev/sound
total 0
   0 drwxr-xr-x    1 root     root            0 Jan  1  1970 .
   0 drwxr-xr-x    1 root     root            0 Jan  1  1970 ..
   0 crw-r--r--    1 root     root      14,  14 Jan  1  1970 admmidi
   0 crw-r--r--    1 root     root      14,  12 Jan  1  1970 adsp
   0 crw-r--r--    1 root     root      14,  13 Jan  1  1970 amidi
   0 crw-rw-rw-    1 root     root      14,   4 Jan  1  1970 audio
   0 crw-r--r--    1 root     root      14,   9 Jan  1  1970 dmmidi
   0 crw-rw-rw-    1 root     root      14,   3 Jan  1  1970 dsp
   0 crw-------    1 root     root      14,   2 Jan  1  1970 midi00
   0 crw-rw-rw-    1 root     root      14,   0 Jan  1  1970 mixer
   0 crw-rw-rw-    1 root     root      14,   1 Jan  1  1970 sequencer
   0 crw-r--r--    1 root     root      14,   8 Jan  1  1970 sequencer2
   0 crw-------    1 root     root      14,  16 Jan  1  1970 unknown

and the following errors are written into my kernel log:

Jan  6 18:10:27 twopit kernel: devfs: devfs_register(unknown): could not append to parent, err: -17
Jan  6 18:10:27 twopit kernel: devfs: devfs_register(unknown): could not append to parent, err: -17

These errors are presumably caused by devices "mixer1", "dsp1" and
"audio1" all fighting over the "unknown" slot. Could someone please
apply the patch? Any feedback on any cleanups it might need would
also be appreciated. Note that the uniqueness of the sequencer and
sequencer2 devices is preserved.

Cheers,
Chris

--- linux-2.4.17/drivers/sound/sound_core.c.orig	Sun Jan  6 17:31:30 2002
+++ linux-2.4.17/drivers/sound/sound_core.c	Sun Jan  6 17:39:43 2002
@@ -17,7 +17,7 @@
  *	plug into this. The fact they dont all go via OSS doesn't mean 
  *	they don't have to implement the OSS API. There is a lot of logic
  *	to keeping much of the OSS weight out of the code in a compatibility
- *	module, but its up to the driver to rember to load it...
+ *	module, but it's up to the driver to remember to load it...
  *
  *	The code provides a set of functions for registration of devices
  *	by type. This is done rather than providing a single call so that
@@ -173,10 +173,10 @@
 		return r;
 	}
 	
-	if (r == low)
+	if ( r < SOUND_STEP )
 		sprintf (name_buf, "%s", name);
 	else
-		sprintf (name_buf, "%s%d", name, (r - low) / SOUND_STEP);
+		sprintf (name_buf, "%s%d", name, (r / SOUND_STEP));
 	s->de = devfs_register (devfs_handle, name_buf,
 				DEVFS_FL_NONE, SOUND_MAJOR, s->unit_minor,
 				S_IFCHR | mode, fops, NULL);
@@ -231,17 +231,20 @@
  
 int register_sound_special(struct file_operations *fops, int unit)
 {
-	char *name;
+	const int chain = (unit & 0x0F);
+	int max_unit = chain + 128;
+	const char *name;
 
-	switch (unit) {
+	switch (chain) {
 	    case 0:
 		name = "mixer";
 		break;
 	    case 1:
 		name = "sequencer";
+		max_unit = unit + 1;
 		break;
 	    case 2:
-		name = "midi00";
+		name = "midi";
 		break;
 	    case 3:
 		name = "dsp";
@@ -260,6 +263,7 @@
 		break;
 	    case 8:
 		name = "sequencer2";
+		max_unit = unit + 1;
 		break;
 	    case 9:
 		name = "dmmidi";
@@ -280,10 +284,10 @@
 		name = "admmidi";
 		break;
 	    default:
-		name = "unknown";
+		name = "unknownX";
 		break;
 	}
-	return sound_insert_unit(&chains[unit&15], fops, -1, unit, unit+1,
+	return sound_insert_unit(&chains[chain], fops, -1, unit, max_unit,
 				 name, S_IRUSR | S_IWUSR);
 }
  

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-01-06 18:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-01-06 18:36 [PATCH] Multiple soundcard support in register_sound_special() Chris Rankin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®