static void opl3sa2_mixer_reset(opl3sa2_mixerdata *devc) { if(devc) { opl3sa2_set_volume(devc, DEFAULT_VOLUME, DEFAULT_VOLUME); devc->volume_l = devc->volume_r = DEFAULT_VOLUME; opl3sa2_set_mic(devc, DEFAULT_MIC); devc->mic = DEFAULT_MIC; opl3sa3_set_bass(devc, DEFAULT_TIMBRE); opl3sa3_set_treble(devc, DEFAULT_TIMBRE); devc->bass = devc->treble = DEFAULT_TIMBRE; } }
static void opl3sa2_mixer_reset(opl3sa2_mixerdata* devc, int card) { if(devc) { opl3sa2_set_volume(devc, DEFAULT_VOLUME, DEFAULT_VOLUME); devc->volume_l = devc->volume_r = DEFAULT_VOLUME; opl3sa2_set_mic(devc, DEFAULT_MIC); devc->mic = DEFAULT_MIC; if(chipset[card] == CHIPSET_OPL3SA3) { opl3sa3_set_bass(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE); devc->bass_l = devc->bass_r = DEFAULT_TIMBRE; opl3sa3_set_treble(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE); devc->treble_l = devc->treble_r = DEFAULT_TIMBRE; } } }
static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) { int cmdf = cmd & 0xff; opl3sa2_mixerdata* devc = (opl3sa2_mixerdata*) mixer_devs[dev]->devc; switch(cmdf) { case SOUND_MIXER_VOLUME: case SOUND_MIXER_MIC: case SOUND_MIXER_BASS: case SOUND_MIXER_TREBLE: case SOUND_MIXER_DEVMASK: case SOUND_MIXER_STEREODEVS: case SOUND_MIXER_RECMASK: case SOUND_MIXER_CAPS: case SOUND_MIXER_RECSRC: break; default: return call_ad_mixer(devc, cmd, arg); } if(((cmd >> 8) & 0xff) != 'M') return -EINVAL; if(_SIOC_DIR (cmd) & _SIOC_WRITE) { switch (cmdf) { case SOUND_MIXER_RECSRC: if(devc->ad_mixer_dev != -1) return call_ad_mixer(devc, cmd, arg); else { if(*(int*)arg != 0) return -EINVAL; return 0; } case SOUND_MIXER_VOLUME: arg_to_volume_stereo(*(unsigned int*)arg, &devc->volume_l, &devc->volume_r); opl3sa2_set_volume(devc, devc->volume_l, devc->volume_r); *(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r); return 0; case SOUND_MIXER_MIC: arg_to_volume_mono(*(unsigned int*)arg, &devc->mic); opl3sa2_set_mic(devc, devc->mic); *(int*)arg = ret_vol_mono(devc->mic); return 0; case SOUND_MIXER_BASS: if(chipset != CHIPSET_OPL3SA2) { arg_to_volume_mono(*(unsigned int*)arg, &devc->bass); opl3sa3_set_bass(devc, devc->bass); *(int*)arg = ret_vol_mono(devc->bass); return 0; } return -EINVAL; case SOUND_MIXER_TREBLE: if(chipset != CHIPSET_OPL3SA2) { arg_to_volume_mono(*(unsigned int *)arg, &devc->treble); opl3sa3_set_treble(devc, devc->treble); *(int*)arg = ret_vol_mono(devc->treble); return 0; } return -EINVAL; default: return -EINVAL; } } else { /* * Return parameters */ switch (cmdf) { case SOUND_MIXER_DEVMASK: if(call_ad_mixer(devc, cmd, arg) == -EINVAL) *(int*)arg = 0; /* no mixer devices */ *(int*)arg |= (SOUND_MASK_VOLUME | SOUND_MASK_MIC); /* OPL3-SA2 has no bass and treble mixers */ if(chipset != CHIPSET_OPL3SA2) *(int*)arg |= (SOUND_MASK_BASS | SOUND_MASK_TREBLE); return 0; case SOUND_MIXER_STEREODEVS: if(call_ad_mixer(devc, cmd, arg) == -EINVAL) *(int*)arg = 0; /* no stereo devices */ *(int*)arg |= SOUND_MASK_VOLUME; return 0; case SOUND_MIXER_RECMASK: if(devc->ad_mixer_dev != -1) { return call_ad_mixer(devc, cmd, arg); } else { /* No recording devices */ return (*(int*)arg = 0); } case SOUND_MIXER_CAPS: if(devc->ad_mixer_dev != -1) { return call_ad_mixer(devc, cmd, arg); } else { *(int*)arg = SOUND_CAP_EXCL_INPUT; return 0; } case SOUND_MIXER_RECSRC: if(devc->ad_mixer_dev != -1) { return call_ad_mixer(devc, cmd, arg); } else { /* No recording source */ return (*(int*)arg = 0); } case SOUND_MIXER_VOLUME: *(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r); return 0; case SOUND_MIXER_MIC: *(int*)arg = ret_vol_mono(devc->mic); return 0; case SOUND_MIXER_BASS: if(chipset != CHIPSET_OPL3SA2) { *(int*)arg = ret_vol_mono(devc->bass); return 0; } else { return -EINVAL; } case SOUND_MIXER_TREBLE: if(chipset != CHIPSET_OPL3SA2) { *(int*)arg = ret_vol_mono(devc->treble); return 0; } else { return -EINVAL; } default: return -EINVAL; } } }
static int opl3sa3_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) { int cmdf = cmd & 0xff; opl3sa2_mixerdata* devc = (opl3sa2_mixerdata*) mixer_devs[dev]->devc; switch(cmdf) { case SOUND_MIXER_BASS: case SOUND_MIXER_TREBLE: case SOUND_MIXER_DIGITAL1: case SOUND_MIXER_DEVMASK: case SOUND_MIXER_STEREODEVS: break; default: return opl3sa2_mixer_ioctl(dev, cmd, arg); } if(((cmd >> 8) & 0xff) != 'M') return -EINVAL; if(_SIOC_DIR (cmd) & _SIOC_WRITE) { switch (cmdf) { case SOUND_MIXER_BASS: arg_to_vol_stereo(*(unsigned int*)arg, &devc->bass_l, &devc->bass_r); opl3sa3_set_bass(devc, devc->bass_l, devc->bass_r); *(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r); return 0; case SOUND_MIXER_TREBLE: arg_to_vol_stereo(*(unsigned int*)arg, &devc->treble_l, &devc->treble_r); opl3sa3_set_treble(devc, devc->treble_l, devc->treble_r); *(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r); return 0; case SOUND_MIXER_DIGITAL1: arg_to_vol_stereo(*(unsigned int*)arg, &devc->wide_l, &devc->wide_r); opl3sa3_set_wide(devc, devc->wide_l, devc->wide_r); *(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r); return 0; default: return -EINVAL; } } else { /* * Return parameters */ switch (cmdf) { case SOUND_MIXER_DEVMASK: *(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_MIC | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_DIGITAL1); return 0; case SOUND_MIXER_STEREODEVS: *(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_DIGITAL1); return 0; case SOUND_MIXER_BASS: *(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r); return 0; case SOUND_MIXER_TREBLE: *(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r); return 0; case SOUND_MIXER_DIGITAL1: *(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r); return 0; default: return -EINVAL; } } }