summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@suse.cz>2003-09-25 18:37:18 +0200
committerJaroslav Kysela <perex@suse.cz>2003-09-25 18:37:18 +0200
commit3b1998711bec1cd8a8a9f219e411a8259e2cf963 (patch)
tree86ea5a5bd06a1f48ad48d894312d5a4508f36d1d
parent5e63ebcadb132db401edd24bfa477eadd295132c (diff)
ALSA CVS update
D:2003/08/29 10:22:27 C:EMU10K1/EMU10K2 driver A:Takashi Iwai <tiwai@suse.de> F:include/emu10k1.h:1.30->1.31 F:pci/emu10k1/emu10k1.c:1.20->1.21 F:pci/emu10k1/emufx.c:1.37->1.38 F:pci/emu10k1/emupcm.c:1.21->1.22 L:Peter Zubaj <pzad@pobox.sk>: L:- Added the support of AC3 passthrough on Audigy. L: L:James Courtier-Dutton <James@superbug.demon.co.uk>: L:- Use different driver name for Audigy2.
-rw-r--r--include/sound/emu10k1.h2
-rw-r--r--sound/pci/emu10k1/emu10k1.c5
-rw-r--r--sound/pci/emu10k1/emufx.c32
-rw-r--r--sound/pci/emu10k1/emupcm.c5
4 files changed, 35 insertions, 9 deletions
diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
index 1fbd9f3fa82b..78078e874480 100644
--- a/include/sound/emu10k1.h
+++ b/include/sound/emu10k1.h
@@ -1152,6 +1152,8 @@ int snd_emu10k1_proc_init(emu10k1_t * emu);
#define FXBUS_MIDI_RIGHT 0x05
#define FXBUS_PCM_CENTER 0x06
#define FXBUS_PCM_LFE 0x07
+#define FXBUS_PT_LEFT 20
+#define FXBUS_PT_RIGHT 21
#define FXBUS_MIDI_REVERB 0x0c
#define FXBUS_MIDI_CHORUS 0x0d
diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c
index 4bf067461036..6deea6359ddc 100644
--- a/sound/pci/emu10k1/emu10k1.c
+++ b/sound/pci/emu10k1/emu10k1.c
@@ -170,7 +170,10 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci,
}
#endif
- if (emu->audigy) {
+ if (emu->audigy && (emu->revision == 4) ) {
+ strcpy(card->driver, "Audigy2");
+ strcpy(card->shortname, "Sound Blaster Audigy2");
+ } else if (emu->audigy) {
strcpy(card->driver, "Audigy");
strcpy(card->shortname, "Sound Blaster Audigy");
} else if (emu->APS) {
diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
index c038e776f6c9..4f5f128937b0 100644
--- a/sound/pci/emu10k1/emufx.c
+++ b/sound/pci/emu10k1/emufx.c
@@ -1235,6 +1235,7 @@ static void __devinit snd_emu10k1_init_stereo_onoff_control(emu10k1_fx8010_contr
*/
#define A_GPR_ACCU 0xd6
+#define A_GPR_COND 0xd7
static int __devinit _snd_emu10k1_audigy_init_efx(emu10k1_t *emu)
{
@@ -1502,13 +1503,7 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
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);
- A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
- A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
+ }
/* analog speakers */
if (emu->revision == 4) { /* audigy2 */
@@ -1523,6 +1518,29 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
/* headphone */
A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
+ /* digital outputs */
+// A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
+
+ /* IEC958 Optical Raw Playback Switch */
+ icode->gpr_map[gpr++] = 0x1008;
+ icode->gpr_map[gpr++] = 0xffff0000;
+ for (z = 0; z < 2; z++) {
+ A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000);
+ A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001);
+ A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2));
+ A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000);
+ A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z);
+ A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);
+ A_SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
+ A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
+ }
+ snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "IEC958 Optical Raw Playback Switch", gpr, 0);
+ gpr += 2;
+
+ A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
+ A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
+ A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
+
/* ADC buffer */
A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_L, capture);
A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1);
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 3e309c3dcd8a..c92c58a74f6d 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -666,8 +666,11 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(snd_pcm_substream_t * subs
#else /* EMU10K1 Open Source code from Creative */
if (ptr < epcm->ccca_start_addr)
ptr += runtime->buffer_size - epcm->ccca_start_addr;
- else
+ else {
ptr -= epcm->ccca_start_addr;
+ if (ptr >= runtime->buffer_size)
+ ptr -= runtime->buffer_size;
+ }
#endif
// printk("ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", ptr, runtime->buffer_size, runtime->period_size);
return ptr;