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