All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Charbonnel <thomas@undata.org>
To: alsa-devel@lists.sourceforge.net
Subject: hdsp9632 mixer fix + gcc 2.9x compile fix
Date: Thu, 06 Nov 2003 13:37:35 +0100	[thread overview]
Message-ID: <3FAA408F.50201@undata.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 180 bytes --]

Hi,

The attached patch fixes matrix mixer and metering problems spotted by 
Pentti Ala-Vannesluoma for H9632 cards and gcc 2.9x compile errors 
reported by Martin Langer.

Thomas

[-- Attachment #2: hdsp9632.patch --]
[-- Type: text/plain, Size: 5394 bytes --]

--- hdsp.c.cvs	2003-11-01 09:06:45.000000000 +0100
+++ hdsp.c	2003-11-06 13:06:28.000000000 +0100
@@ -454,6 +454,7 @@
 	unsigned short	      state;		     /* stores state bits */
 	u32		      firmware_cache[24413]; /* this helps recover from accidental iobox power failure */
 	size_t                period_bytes; 	     /* guess what this is */
+	unsigned char	      max_channels;
 	unsigned char	      qs_in_channels;	     /* quad speed mode for H9632 */
 	unsigned char         ds_in_channels;
 	unsigned char         ss_in_channels;	    /* different for multiface/digiface */
@@ -1169,11 +1170,11 @@
 		/* set thru for all channels */
 
 		if (enable) {
-			for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
+			for (i = 0; i < hdsp->max_channels; i++) {
 				hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,i,i), UNITY_GAIN);
 			}
 		} else {
-			for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
+			for (i = 0; i < hdsp->max_channels; i++) {
 				hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,i,i), MINUS_INFINITY_GAIN);
 			}
 		}
@@ -1181,7 +1182,7 @@
 	} else {
 		int mapped_channel;
 
-		snd_assert(channel < HDSP_MAX_CHANNELS, return);
+		snd_assert(channel < hdsp->max_channels, return);
 
 		mapped_channel = hdsp->channel_map[channel];
 
@@ -2902,9 +2903,9 @@
 
 	source = ucontrol->value.integer.value[0];
 	destination = ucontrol->value.integer.value[1];
-
-	if (source > 25) {
-		addr = hdsp_playback_to_output_key(hdsp,source-26,destination);
+	
+	if (source >= hdsp->max_channels) {
+		addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination);
 	} else {
 		addr = hdsp_input_to_output_key(hdsp,source, destination);
 	}
@@ -2931,8 +2932,8 @@
 	source = ucontrol->value.integer.value[0];
 	destination = ucontrol->value.integer.value[1];
 
-	if (source > 25) {
-		addr = hdsp_playback_to_output_key(hdsp,source-26, destination);
+	if (source >= hdsp->max_channels) {
+		addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels, destination);
 	} else {
 		addr = hdsp_input_to_output_key(hdsp,source, destination);
 	}
@@ -3177,7 +3178,7 @@
 
 int snd_hdsp_create_controls(snd_card_t *card, hdsp_t *hdsp)
 {
-	unsigned int idx, limit;
+	unsigned int idx;
 	int err;
 	snd_kcontrol_t *kctl;
 
@@ -3676,12 +3677,13 @@
 		   odd numbered channels to right, even to left.
 		*/
 		if (hdsp->io_type == H9632) {
-			lineouts_base = 14;
+			/* this is the phones/analog output */
+			lineouts_base = 10;
 		} else {
 			lineouts_base = 26;
 		}
 		
-		for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
+		for (i = 0; i < hdsp->max_channels; i++) {
 			if (i & 1) { 
 				if (hdsp_write_gain (hdsp, hdsp_input_to_output_key (hdsp, i, lineouts_base), UNITY_GAIN) ||
 				    hdsp_write_gain (hdsp, hdsp_playback_to_output_key (hdsp, i, lineouts_base), UNITY_GAIN)) {
@@ -3793,7 +3795,7 @@
 {
 	int mapped_channel;
 
-        snd_assert(channel >= 0 || channel < HDSP_MAX_CHANNELS, return NULL);
+        snd_assert(channel >= 0 || channel < hdsp->max_channels, return NULL);
         
 	if ((mapped_channel = hdsp->channel_map[channel]) < 0) {
 		return NULL;
@@ -3963,7 +3965,7 @@
 	hdsp_t *hdsp = _snd_pcm_substream_chip(substream);
 	int mapped_channel;
 
-	snd_assert(info->channel < HDSP_MAX_CHANNELS, return -EINVAL);
+	snd_assert(info->channel < hdsp->max_channels, return -EINVAL);
 
 	if ((mapped_channel = hdsp->channel_map[info->channel]) < 0) {
 		return -EINVAL;
@@ -4487,8 +4489,8 @@
 
 static int snd_hdsp_hwdep_dummy_op(snd_hwdep_t *hw, struct file *file)
 {
-    /* we have nothing to initialize but the call is required */
-    return 0;
+	/* we have nothing to initialize but the call is required */
+	return 0;
 }
 
 
@@ -4545,10 +4547,11 @@
 		}
 		if (hdsp->io_type == H9632) {
 			int j;
+			hdsp_9632_meters_t *m;
 			int doublespeed = 0;
 			if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DoubleSpeedStatus)
 				doublespeed = 1;
-			hdsp_9632_meters_t *m = (hdsp_9632_meters_t *)hdsp->iobase+HDSP_9632_metersBase;
+			m = (hdsp_9632_meters_t *)(hdsp->iobase+HDSP_9632_metersBase);
 			peak_rms = (hdsp_peak_rms_t *)arg;
 			for (i = 0, j = 0; i < 16; ++i, ++j) {
 				if (copy_to_user((void *)peak_rms->input_peaks+i*4, &(m->input_peak[j]), 4) != 0)
@@ -4814,7 +4817,7 @@
 		return -EIO;
 	}
 	
-	for (i = 0; i < HDSP_MAX_CHANNELS; ++i) {
+	for (i = 0; i < hdsp->max_channels; ++i) {
 		hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1);
 		hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1);
 	}
@@ -4841,8 +4844,9 @@
 	
 	case H9632:
 		status = hdsp_read(hdsp, HDSP_statusRegister);
-		aebi_channels = (status & HDSP_AEBI) ? 4 : 0;
-		aebo_channels = (status & HDSP_AEBO) ? 4 : 0;
+		/* HDSP_AEBx bits are low when AEB are connected */
+		aebi_channels = (status & HDSP_AEBI) ? 0 : 4;
+		aebo_channels = (status & HDSP_AEBO) ? 0 : 4;
 		hdsp->card_name = "RME Hammerfall HDSP 9632";
 		hdsp->ss_in_channels = H9632_SS_CHANNELS+aebi_channels;
 		hdsp->ds_in_channels = H9632_DS_CHANNELS+aebi_channels;
@@ -4929,7 +4933,6 @@
 {
 	struct pci_dev *pci = hdsp->pci;
 	int err;
-	int i;
 	int is_9652 = 0;
 	int is_9632 = 0;
 
@@ -4948,6 +4951,7 @@
 	hdsp->control_register = 0;
 	hdsp->control2_register = 0;
 	hdsp->io_type = Undefined;
+	hdsp->max_channels = 26;
 
 	hdsp->card = card;
 	
@@ -4974,6 +4978,7 @@
 		break;
 	case 0x96:
 		hdsp->card_name = "RME HDSP 9632";
+		hdsp->max_channels = 16;
 		is_9632 = 1;
 		break;
 	default:

             reply	other threads:[~2003-11-06 12:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-11-06 12:37 Thomas Charbonnel [this message]
2003-11-07 11:18 ` hdsp update Benouille
2003-11-07 12:55   ` Thomas Charbonnel
     [not found] ` <3FAB5CE6.70306@ifrance.com>
     [not found]   ` <3FAB857A.80707@undata.org>
2003-11-07 13:20     ` hdsp9632 mixer fix + gcc 2.9x compile fix Benouille
2003-11-07 14:33       ` Thomas Charbonnel
2003-11-07 18:30 ` Takashi Iwai

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=3FAA408F.50201@undata.org \
    --to=thomas@undata.org \
    --cc=alsa-devel@lists.sourceforge.net \
    /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.