Update of /cvsroot/alsa/alsa-kernel/pci/emu10k1 In directory sc8-pr-cvs1:/tmp/cvs-serv20331
Modified Files: emu10k1.c emu10k1_main.c emufx.c emumixer.c irq.c Log Message: - fixed the detection of audigy2 EX. no ac97 mixer is built on this board. - mo' better mixer for audigy2. Wave is renamed to PCM, additional Master (digital) volume. - make sure to disable all interrupts when unprocessed status bits remain. Index: emu10k1.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emu10k1.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- emu10k1.c 21 Jun 2003 07:52:38 -0000 1.18 +++ emu10k1.c 25 Jul 2003 10:39:38 -0000 1.19 @@ -135,11 +135,9 @@ snd_card_free(card); return err; } - if (!emu->APS) { /* APS board has not an AC97 mixer */ - if ((err = snd_emu10k1_mixer(emu)) < 0) { - snd_card_free(card); - return err; - } + if ((err = snd_emu10k1_mixer(emu)) < 0) { + snd_card_free(card); + return err; } if (emu->audigy) { if ((err = snd_emu10k1_audigy_midi(emu)) < 0) { Index: emu10k1_main.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emu10k1_main.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- emu10k1_main.c 2 Apr 2003 14:35:56 -0000 1.24 +++ emu10k1_main.c 25 Jul 2003 10:39:38 -0000 1.25 @@ -674,6 +674,14 @@ if (emu->serial == 0x40011102) { emu->card_type = EMU10K1_CARD_EMUAPS; emu->APS = 1; + emu->no_ac97 = 1; /* APS has no AC97 chip */ + } + else if (emu->revision == 4 && emu->serial == 0x10051102) { + /* Audigy 2 EX has apparently no effective AC97 controls + * (for both input and output), so we skip the AC97 detections + */ + snd_printdd(KERN_INFO "Audigy2 EX is detected. skpping ac97.\n"); + emu->no_ac97 = 1; } emu->fx8010.fxbus_mask = 0x303f; Index: emufx.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emufx.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- emufx.c 1 Jul 2003 10:07:54 -0000 1.35 +++ emufx.c 25 Jul 2003 10:39:38 -0000 1.36 @@ -1238,7 +1238,10 @@ static int __devinit _snd_emu10k1_audigy_init_efx(emu10k1_t *emu) { - int err, i, z, gpr, tmp, playback, capture, nctl; + int err, i, z, gpr, nctl; + const int playback = 10; + const int capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */ + const int tmp = 0x88; u32 ptr; emu10k1_fx8010_code_t *icode; emu10k1_fx8010_control_gpr_t *controls, *ctl; @@ -1261,19 +1264,15 @@ strcpy(icode->name, "Audigy DSP code for ALSA"); ptr = 0; nctl = 0; - playback = 10; - capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */ gpr = capture + 10; - tmp = 0x88; /* stop FX processor */ snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP); - /* Wave Playback */ + /* Wave Playback Volume */ A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT)); A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT)); - snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, - emu->revision == 4 ? 50 : 100); + snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100); gpr += 2; /* Wave Surround Playback */ @@ -1497,6 +1496,14 @@ snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0); gpr += 2; + /* Master volume for audigy2 */ + if (emu->revision == 4) { + A_OP(icode, &ptr, iMAC0, A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS)); + A_OP(icode, &ptr, iMAC0, A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr+1), A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS)); + snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0); + gpr += 2; + } + /* digital outputs */ A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS); @@ -1504,7 +1511,7 @@ A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS); /* analog speakers */ - if (emu->audigy && emu->revision == 4) { /* audigy2 */ + if (emu->revision == 4) { /* audigy2 */ A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); } else { A_PUT_STEREO_OUTPUT(A_EXTOUT_AC97_L, A_EXTOUT_AC97_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); Index: emumixer.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emumixer.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- emumixer.c 9 Apr 2003 15:00:04 -0000 1.15 +++ emumixer.c 25 Jul 2003 10:39:38 -0000 1.16 @@ -423,6 +423,36 @@ emu->ac97 = NULL; } +/* + */ +static int remove_ctl(snd_card_t *card, const char *name) +{ + snd_ctl_elem_id_t id; + memset(&id, 0, sizeof(id)); + strcpy(id.name, name); + id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; + return snd_ctl_remove_id(card, &id); +} + +static snd_kcontrol_t *ctl_find(snd_card_t *card, const char *name) +{ + snd_ctl_elem_id_t sid; + memset(&sid, 0, sizeof(sid)); + strcpy(sid.name, name); + sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER; + return snd_ctl_find_id(card, &sid); +} + +static int rename_ctl(snd_card_t *card, const char *src, const char *dst) +{ + snd_kcontrol_t *kctl = ctl_find(card, src); + if (kctl) { + strcpy(kctl->id.name, dst); + return 0; + } + return -ENOENT; +} + int __devinit snd_emu10k1_mixer(emu10k1_t *emu) { ac97_t ac97; @@ -430,7 +460,7 @@ snd_kcontrol_t *kctl; snd_card_t *card = emu->card; - if (!emu->APS) { + if (!emu->no_ac97) { memset(&ac97, 0, sizeof(ac97)); ac97.write = snd_emu10k1_ac97_write; ac97.read = snd_emu10k1_ac97_read; @@ -438,8 +468,33 @@ ac97.private_free = snd_emu10k1_mixer_free_ac97; if ((err = snd_ac97_mixer(emu->card, &ac97, &emu->ac97)) < 0) return err; + if (emu->audigy && emu->revision == 4) { + /* Master/PCM controls on ac97 of Audigy2 has no effect */ + /* FIXME: keep master volume/switch to be sure. + * once after we check that they play really no roles, + * they shall be removed. + */ + rename_ctl(card, "Master Playback Switch", "AC97 Master Playback Switch"); + rename_ctl(card, "Master Playback Volume", "AC97 Master Playback Volume"); + /* pcm controls are removed */ + remove_ctl(card, "PCM Playback Switch"); + remove_ctl(card, "PCM Playback Volume"); + } } else { - strcpy(emu->card->mixername, "EMU APS"); + if (emu->APS) + strcpy(emu->card->mixername, "EMU APS"); + else if (emu->audigy) + strcpy(emu->card->mixername, "SB Audigy"); + else + strcpy(emu->card->mixername, "Emu10k1"); + } + + if (emu->audigy && emu->revision == 4) { + /* Audigy2 and Audigy2 EX */ + /* use the conventional names */ + rename_ctl(card, "Wave Playback Volume", "PCM Playback Volume"); + rename_ctl(card, "Wave Playback Volume", "PCM Capture Volume"); + rename_ctl(card, "Wave Master Playback Volume", "Master Playback Volume"); } if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL) @@ -455,6 +510,7 @@ if ((err = snd_ctl_add(card, kctl))) return err; + /* intiailize the routing and volume table for each pcm playback stream */ for (pcm = 0; pcm < 32; pcm++) { emu10k1_pcm_mixer_t *mix; int v; @@ -474,21 +530,25 @@ mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff; } - if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; + if (! emu->APS) { /* FIXME: APS has these controls? */ + /* sb live! and audigy */ + if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL) + return -ENOMEM; + if ((err = snd_ctl_add(card, kctl))) + return err; + if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL) + return -ENOMEM; + if ((err = snd_ctl_add(card, kctl))) + return err; + } if (emu->audigy) { if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL) return -ENOMEM; if ((err = snd_ctl_add(card, kctl))) return err; - } else { + } else if (! emu->APS) { + /* sb live! */ if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL) return -ENOMEM; if ((err = snd_ctl_add(card, kctl))) Index: irq.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/irq.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- irq.c 23 Apr 2003 13:25:10 -0000 1.8 +++ irq.c 25 Jul 2003 10:39:38 -0000 1.9 @@ -55,15 +55,13 @@ if (status & IPR_CHANNELLOOP) { int voice; int voice_max = status & IPR_CHANNELNUMBERMASK; - int voice_max_l; u32 val; emu10k1_voice_t *pvoice = emu->voices; val = snd_emu10k1_ptr_read(emu, CLIPL, 0); - voice_max_l = voice_max; - if (voice_max_l >= 0x20) - voice_max_l = 0x1f; - for (voice = 0; voice <= voice_max_l; voice++) { + for (voice = 0; voice <= voice_max; voice++) { + if (voice == 0x20) + val = snd_emu10k1_ptr_read(emu, CLIPH, 0); if (val & 1) { if (pvoice->use && pvoice->interrupt != NULL) { pvoice->interrupt(emu, pvoice); @@ -75,21 +73,6 @@ val >>= 1; pvoice++; } - if (voice_max > 0x1f) { - val = snd_emu10k1_ptr_read(emu, CLIPH, 0); - for (; voice <= voice_max; voice++) { - if(val & 1) { - if (pvoice->use && pvoice->interrupt != NULL) { - pvoice->interrupt(emu, pvoice); - snd_emu10k1_voice_intr_ack(emu, voice); - } else { - snd_emu10k1_voice_intr_disable(emu, voice); - } - } - val >>= 1; - pvoice++; - } - } status &= ~IPR_CHANNELLOOP; } status &= ~IPR_CHANNELNUMBERMASK; @@ -150,9 +133,27 @@ status &= ~IPR_FXDSP; } if (status) { - snd_printd(KERN_WARNING "emu10k1: unhandled interrupt: 0x%08x\n", status); + unsigned int bits; + snd_printk(KERN_ERR "emu10k1: unhandled interrupt: 0x%08x\n", status); + //make sure any interrupts we don't handle are disabled: + bits = INTE_FXDSPENABLE | + INTE_PCIERRORENABLE | + INTE_VOLINCRENABLE | + INTE_VOLDECRENABLE | + INTE_MUTEENABLE | + INTE_MICBUFENABLE | + INTE_ADCBUFENABLE | + INTE_EFXBUFENABLE | + INTE_GPSPDIFENABLE | + INTE_CDSPDIFENABLE | + INTE_INTERVALTIMERENB | + INTE_MIDITXENABLE | + INTE_MIDIRXENABLE; + if (emu->audigy) + bits |= INTE_A_MIDITXENABLE2 | INTE_A_MIDIRXENABLE2; + snd_emu10k1_intr_disable(emu, bits); } - outl(orig_status, emu->port + IPR); /* ack */ + outl(orig_status, emu->port + IPR); /* ack all */ } return IRQ_RETVAL(handled); } ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog