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
--- 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: