Hi all,

now that I'm very happy that azt3328.c has made it into CVS,
I want to submit the following changes:

- "PCBeep Playback Volume" is a special volume ctrl, not standard mono volume,
  leading to control value change problems
- improved snd_azf3328_mixer_new() to resemble snd_sbmixer_init()

Have fun,

Andreas Mohr

P.S.: Expect an ALS4000 mixer patch soon !

Index: alsa-driver/pci/azt3328.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pci/azt3328.c,v
retrieving revision 1.1
diff -u -r1.1 azt3328.c
--- alsa-driver/pci/azt3328.c   28 Oct 2002 11:51:36 -0000      1.1
+++ alsa-driver/pci/azt3328.c   9 Nov 2002 22:04:03 -0000
@@ -70,7 +70,7 @@
  *   - when Ctrl-C'ing mpg321, the playback loops a bit
  *     (premature DMA playback reset ?)
  *   - full-duplex sometimes breaks (IRQ management issues ?).
- *     Once even a spontaneous REBOOT !!!
+ *     Once even a spontaneous REBOOT happened !!!
  * 
  * TODO
  *  - where is Wave In Switch to be found ??? (who can check on Windows ??)
@@ -376,11 +376,11 @@
   .private_value = COMPOSE_MIXER_REG(reg, is_right_chan ? 0 : 8, 0, mask, 1, 0), \
 }
 
-#define AZF3328_MIXER_VOL_SPECIAL(xname, reg, mask, shift) \
+#define AZF3328_MIXER_VOL_SPECIAL(xname, reg, mask, shift, invert) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
   .info = snd_azf3328_info_mixer, \
   .get = snd_azf3328_get_mixer, .put = snd_azf3328_put_mixer, \
-  .private_value = COMPOSE_MIXER_REG(reg, shift, 0, mask, 0, 0), \
+  .private_value = COMPOSE_MIXER_REG(reg, shift, 0, mask, invert, 0), \
 }
 
 static int snd_azf3328_info_mixer(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t 
*uinfo)
@@ -474,7 +474,7 @@
        AZF3328_MIXER_VOL_STEREO("Line Playback Volume", IDX_MIXER_LINEIN, 0x1f),
        AZF3328_MIXER_VOL_STEREO("Wave Capture Volume", IDX_MIXER_WAVEIN, 0x07),
        AZF3328_MIXER_SWITCH("PCBeep Playback Switch", IDX_MIXER_PCBEEP, 15, 1),
-       AZF3328_MIXER_VOL_MONO("PCBeep Playback Volume", IDX_MIXER_PCBEEP, 0x1f, 1),
+       AZF3328_MIXER_VOL_SPECIAL("PCBeep Playback Volume", IDX_MIXER_PCBEEP, 0x0f, 1, 
+1),
        AZF3328_MIXER_SWITCH("Modem Playback Switch", IDX_MIXER_MODEMOUT, 15, 1),
        AZF3328_MIXER_VOL_MONO("Modem Playback Volume", IDX_MIXER_MODEMOUT, 0x1f, 1),
        AZF3328_MIXER_SWITCH("Modem Capture Switch", IDX_MIXER_MODEMIN, 15, 1),
@@ -485,11 +485,11 @@
        AZF3328_MIXER_VOL_STEREO("Aux Playback Volume", IDX_MIXER_AUX, 0x1f),
        AZF3328_MIXER_SWITCH("Modem Out Select", IDX_MIXER_ADVCTL2, 8, 1),
        AZF3328_MIXER_SWITCH("Mono Select Source", IDX_MIXER_ADVCTL2, 9, 1),
-       AZF3328_MIXER_VOL_SPECIAL("Tone Control - Treble", IDX_MIXER_BASSTREBLE, 0x07, 
1),
-       AZF3328_MIXER_VOL_SPECIAL("Tone Control - Bass", IDX_MIXER_BASSTREBLE, 0x07, 
9),
+       AZF3328_MIXER_VOL_SPECIAL("Tone Control - Treble", IDX_MIXER_BASSTREBLE, 0x07, 
+1, 0),
+       AZF3328_MIXER_VOL_SPECIAL("Tone Control - Bass", IDX_MIXER_BASSTREBLE, 0x07, 
+9, 0),
        AZF3328_MIXER_SWITCH("3D Control - Toggle", IDX_MIXER_ADVCTL2, 13, 0),
-       AZF3328_MIXER_VOL_SPECIAL("3D Control - Volume", IDX_MIXER_ADVCTL1, 0x07, 1), 
/* "3D Width" */
-       AZF3328_MIXER_VOL_SPECIAL("3D Control - Space", IDX_MIXER_ADVCTL1, 0x03, 8), 
/* "Hifi 3D" */
+       AZF3328_MIXER_VOL_SPECIAL("3D Control - Volume", IDX_MIXER_ADVCTL1, 0x07, 1, 
+0), /* "3D Width" */
+       AZF3328_MIXER_VOL_SPECIAL("3D Control - Space", IDX_MIXER_ADVCTL1, 0x03, 8, 
+0), /* "Hifi 3D" */
 #if MIXER_TESTING
        AZF3328_MIXER_SWITCH("0", IDX_MIXER_ADVCTL2, 0, 0),
        AZF3328_MIXER_SWITCH("1", IDX_MIXER_ADVCTL2, 1, 0),
@@ -509,6 +509,26 @@
        AZF3328_MIXER_SWITCH("15", IDX_MIXER_ADVCTL2, 15, 0),
 #endif
 };
+
+#define AZF3328_INIT_VALUES (sizeof(snd_azf3328_init_values)/sizeof(unsigned int)/2)
+
+static unsigned int snd_azf3328_init_values[][2] = {
+        { IDX_MIXER_PLAY_MASTER,       MIXER_MUTE_MASK|0x1f1f },
+        { IDX_MIXER_MODEMOUT,          MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_BASSTREBLE,         0x0000 },
+       { IDX_MIXER_PCBEEP,             MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_MODEMIN,            MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_MIC,                MIXER_MUTE_MASK|0x001f },
+       { IDX_MIXER_LINEIN,             MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_CDAUDIO,            MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_VIDEO,              MIXER_MUTE_MASK|0x1f1f },
+       { IDX_MIXER_AUX,                MIXER_MUTE_MASK|0x1f1f },
+        { IDX_MIXER_WAVEOUT,           MIXER_MUTE_MASK|0x1f1f },
+        { IDX_MIXER_FMSYNTH,           MIXER_MUTE_MASK|0x1f1f },
+        { IDX_MIXER_WAVEIN,            0x0707 },
+        { IDX_MIXER_REC_MASTER,                MIXER_MUTE_MASK|0x0707 },
+};
+
 static int __devinit snd_azf3328_mixer_new(azf3328_t *chip)
 {
        snd_card_t *card;
@@ -520,48 +540,23 @@
 
        card = chip->card;
 
-       strcpy(card->mixername, "AZF3328 mixer");
-
-       /* reset mixer */
+       /* mixer reset */
        snd_azf3328_mixer_write(chip, IDX_MIXER_RESET, 0x0, WORD_VALUE);
 
-       /* shut down or initialize mixer controls */
-       snd_azf3328_mixer_write(chip, IDX_MIXER_PLAY_MASTER,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_MODEMOUT,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_BASSTREBLE,
-                       0x0000, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_PCBEEP,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_MODEMIN,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_MIC,
-                       MIXER_MUTE_MASK|0x001f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_LINEIN,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_CDAUDIO,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_VIDEO,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_AUX,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_WAVEOUT,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_FMSYNTH,
-                       MIXER_MUTE_MASK|0x1f1f, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_WAVEIN,
-                       0x0707, WORD_VALUE);
-       snd_azf3328_mixer_write(chip, IDX_MIXER_REC_MASTER,
-                       MIXER_MUTE_MASK|0x0707, WORD_VALUE);
+       /* mute and zero volume channels */
+       for (idx = 0; idx < AZF3328_INIT_VALUES; idx++) {
+               snd_azf3328_mixer_write(chip, snd_azf3328_init_values[idx][0], 
+snd_azf3328_init_values[idx][1], WORD_VALUE);
+       }
        
        /* add mixer controls */
        sw = snd_azf3328_mixer_controls;
        for (idx = 0; idx < NUM_CONTROLS(snd_azf3328_mixer_controls); idx++, sw++) {
-               err = snd_ctl_add(chip->card, snd_ctl_new1(sw, chip));
-               if (err < 0)
+               if ((err = snd_ctl_add(chip->card, snd_ctl_new1(sw, chip))) < 0)
                        return err;
        }
+       snd_component_add(card, "AZF3328 mixer");
+       strcpy(card->mixername, "AZF3328 mixer");
+
        snd_azf3328_dbgcallleave();
        return 0;
 }
@@ -951,7 +946,7 @@
 
         /* fast path out, to ease interrupt sharing */
        if (!(status & (IRQ_PLAYBACK|IRQ_RECORDING|IRQ_MPU401|IRQ_SOMEIRQ)))
-               return; /* must be interrupt for another card */
+               return; /* must be interrupt for another device */
 
        snd_azf3328_dbgplay("Interrupt %ld !\nIDX_IO_PLAY_FLAGS %04x, 
IDX_IO_PLAY_IRQMASK %04x, IDX_IO_IRQSTATUS %04x\n", count, 
inw(chip->codec_port+IDX_IO_PLAY_FLAGS), inw(chip->codec_port+IDX_IO_PLAY_IRQMASK), 
inw(chip->codec_port+IDX_IO_IRQSTATUS));
                
@@ -1453,7 +1448,7 @@
 #ifdef MODULE
        printk(
 "azt3328: EXPERIMENTAL driver for Aztech AZF3328-based soundcards (e.g. PCI168).\n"
-"azt3328: Aztech does NOT support this driver and/or the soundcard in any way,\n"
+"azt3328: Aztech does NOT support this driver and/or the soundcard (yet),\n"
 "azt3328: so simply don't even bother to try to get some support from them.\n"
 "azt3328: Please mail to [EMAIL PROTECTED] for further info\n"
 "azt3328: (bug notification, driver development etc.).\n");

-- 
Andreas Mohr                        Stauferstr. 6, D-71272 Renningen, Germany
Tel. +49 7159 800604                http://mohr.de.tt


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to