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