void ad1848_mute_channel(struct ad1848_softc *sc, int device, int mute) { u_char reg; reg = ad_read(sc, mixer_channel_info[device].left_reg); if (mute & MUTE_LEFT) { if (device == AD1848_MONITOR_CHANNEL) { if (sc->open_mode & FREAD) ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 0); ad_write(sc, mixer_channel_info[device].left_reg, reg & ~DIGITAL_MIX1_ENABLE); } else if (device == AD1848_OUT_CHANNEL) ad_write(sc, mixer_channel_info[device].left_reg, reg | MONO_OUTPUT_MUTE); else ad_write(sc, mixer_channel_info[device].left_reg, reg | 0x80); } else if (!(sc->mute[device] & MUTE_LEFT)) { if (device == AD1848_MONITOR_CHANNEL) { ad_write(sc, mixer_channel_info[device].left_reg, reg | DIGITAL_MIX1_ENABLE); if (sc->open_mode & FREAD) ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 1); } else if (device == AD1848_OUT_CHANNEL) ad_write(sc, mixer_channel_info[device].left_reg, reg & ~MONO_OUTPUT_MUTE); else ad_write(sc, mixer_channel_info[device].left_reg, reg & ~0x80); } if (!mixer_channel_info[device].right_reg) return; reg = ad_read(sc, mixer_channel_info[device].right_reg); if (mute & MUTE_RIGHT) { ad_write(sc, mixer_channel_info[device].right_reg, reg | 0x80); } else if (!(sc->mute[device] & MUTE_RIGHT)) { ad_write(sc, mixer_channel_info[device].right_reg, reg &~0x80); } }
int ad1848_isa_open(void *addr, int flags) { struct ad1848_isa_softc *isc; struct ad1848_softc *sc; int error, state; isc = addr; sc = &isc->sc_ad1848; DPRINTF(("ad1848_isa_open: sc=%p\n", isc)); state = 0; if (isc->sc_playdrq != -1) { error = isa_drq_alloc(isc->sc_ic, isc->sc_playdrq); if (error != 0) return EBUSY; state |= 1; } if (isc->sc_recdrq != -1 && isc->sc_recdrq != isc->sc_playdrq) { error = isa_drq_alloc(isc->sc_ic, isc->sc_recdrq); if (error != 0) goto bad; state |= 2; } #ifndef AUDIO_NO_POWER_CTL /* Power-up chip */ if (isc->powerctl) isc->powerctl(isc->powerarg, flags); #endif /* Init and mute wave output */ ad1848_mute_wave_output(sc, WAVE_MUTE2_INIT, 1); error = ad1848_open(sc, flags); if (error) { #ifndef AUDIO_NO_POWER_CTL if (isc->powerctl) isc->powerctl(isc->powerarg, 0); #endif goto bad; } DPRINTF(("ad1848_isa_open: opened\n")); return 0; bad: if (state & 1) isa_drq_free(isc->sc_ic, isc->sc_playdrq); if (state & 2) isa_drq_free(isc->sc_ic, isc->sc_recdrq); return error; }