423 |
emu->ac97 = NULL; |
emu->ac97 = NULL; |
424 |
} |
} |
425 |
|
|
426 |
|
/* |
427 |
|
*/ |
428 |
|
static int remove_ctl(snd_card_t *card, const char *name) |
429 |
|
{ |
430 |
|
snd_ctl_elem_id_t id; |
431 |
|
memset(&id, 0, sizeof(id)); |
432 |
|
strcpy(id.name, name); |
433 |
|
id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; |
434 |
|
return snd_ctl_remove_id(card, &id); |
435 |
|
} |
436 |
|
|
437 |
|
static snd_kcontrol_t *ctl_find(snd_card_t *card, const char *name) |
438 |
|
{ |
439 |
|
snd_ctl_elem_id_t sid; |
440 |
|
memset(&sid, 0, sizeof(sid)); |
441 |
|
strcpy(sid.name, name); |
442 |
|
sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER; |
443 |
|
return snd_ctl_find_id(card, &sid); |
444 |
|
} |
445 |
|
|
446 |
|
static int rename_ctl(snd_card_t *card, const char *src, const char *dst) |
447 |
|
{ |
448 |
|
snd_kcontrol_t *kctl = ctl_find(card, src); |
449 |
|
if (kctl) { |
450 |
|
strcpy(kctl->id.name, dst); |
451 |
|
return 0; |
452 |
|
} |
453 |
|
return -ENOENT; |
454 |
|
} |
455 |
|
|
456 |
int __devinit snd_emu10k1_mixer(emu10k1_t *emu) |
int __devinit snd_emu10k1_mixer(emu10k1_t *emu) |
457 |
{ |
{ |
458 |
ac97_t ac97; |
ac97_t ac97; |
460 |
snd_kcontrol_t *kctl; |
snd_kcontrol_t *kctl; |
461 |
snd_card_t *card = emu->card; |
snd_card_t *card = emu->card; |
462 |
|
|
463 |
if (!emu->APS) { |
if (!emu->no_ac97) { |
464 |
memset(&ac97, 0, sizeof(ac97)); |
memset(&ac97, 0, sizeof(ac97)); |
465 |
ac97.write = snd_emu10k1_ac97_write; |
ac97.write = snd_emu10k1_ac97_write; |
466 |
ac97.read = snd_emu10k1_ac97_read; |
ac97.read = snd_emu10k1_ac97_read; |
468 |
ac97.private_free = snd_emu10k1_mixer_free_ac97; |
ac97.private_free = snd_emu10k1_mixer_free_ac97; |
469 |
if ((err = snd_ac97_mixer(emu->card, &ac97, &emu->ac97)) < 0) |
if ((err = snd_ac97_mixer(emu->card, &ac97, &emu->ac97)) < 0) |
470 |
return err; |
return err; |
471 |
|
if (emu->audigy && emu->revision == 4) { |
472 |
|
/* Master/PCM controls on ac97 of Audigy2 has no effect */ |
473 |
|
/* FIXME: keep master volume/switch to be sure. |
474 |
|
* once after we check that they play really no roles, |
475 |
|
* they shall be removed. |
476 |
|
*/ |
477 |
|
rename_ctl(card, "Master Playback Switch", "AC97 Master Playback Switch"); |
478 |
|
rename_ctl(card, "Master Playback Volume", "AC97 Master Playback Volume"); |
479 |
|
/* pcm controls are removed */ |
480 |
|
remove_ctl(card, "PCM Playback Switch"); |
481 |
|
remove_ctl(card, "PCM Playback Volume"); |
482 |
|
} |
483 |
} else { |
} else { |
484 |
strcpy(emu->card->mixername, "EMU APS"); |
if (emu->APS) |
485 |
|
strcpy(emu->card->mixername, "EMU APS"); |
486 |
|
else if (emu->audigy) |
487 |
|
strcpy(emu->card->mixername, "SB Audigy"); |
488 |
|
else |
489 |
|
strcpy(emu->card->mixername, "Emu10k1"); |
490 |
|
} |
491 |
|
|
492 |
|
if (emu->audigy && emu->revision == 4) { |
493 |
|
/* Audigy2 and Audigy2 EX */ |
494 |
|
/* use the conventional names */ |
495 |
|
rename_ctl(card, "Wave Playback Volume", "PCM Playback Volume"); |
496 |
|
rename_ctl(card, "Wave Playback Volume", "PCM Capture Volume"); |
497 |
|
rename_ctl(card, "Wave Master Playback Volume", "Master Playback Volume"); |
498 |
} |
} |
499 |
|
|
500 |
if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL) |
if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL) |
510 |
if ((err = snd_ctl_add(card, kctl))) |
if ((err = snd_ctl_add(card, kctl))) |
511 |
return err; |
return err; |
512 |
|
|
513 |
|
/* intiailize the routing and volume table for each pcm playback stream */ |
514 |
for (pcm = 0; pcm < 32; pcm++) { |
for (pcm = 0; pcm < 32; pcm++) { |
515 |
emu10k1_pcm_mixer_t *mix; |
emu10k1_pcm_mixer_t *mix; |
516 |
int v; |
int v; |
530 |
mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff; |
mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff; |
531 |
} |
} |
532 |
|
|
533 |
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL) |
if (! emu->APS) { /* FIXME: APS has these controls? */ |
534 |
return -ENOMEM; |
/* sb live! and audigy */ |
535 |
if ((err = snd_ctl_add(card, kctl))) |
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL) |
536 |
return err; |
return -ENOMEM; |
537 |
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL) |
if ((err = snd_ctl_add(card, kctl))) |
538 |
return -ENOMEM; |
return err; |
539 |
if ((err = snd_ctl_add(card, kctl))) |
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL) |
540 |
return err; |
return -ENOMEM; |
541 |
|
if ((err = snd_ctl_add(card, kctl))) |
542 |
|
return err; |
543 |
|
} |
544 |
|
|
545 |
if (emu->audigy) { |
if (emu->audigy) { |
546 |
if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL) |
if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL) |
547 |
return -ENOMEM; |
return -ENOMEM; |
548 |
if ((err = snd_ctl_add(card, kctl))) |
if ((err = snd_ctl_add(card, kctl))) |
549 |
return err; |
return err; |
550 |
} else { |
} else if (! emu->APS) { |
551 |
|
/* sb live! */ |
552 |
if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL) |
if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL) |
553 |
return -ENOMEM; |
return -ENOMEM; |
554 |
if ((err = snd_ctl_add(card, kctl))) |
if ((err = snd_ctl_add(card, kctl))) |