int AmeSystemSound::setupMixer(QString card, QString device) { char *name; long int a, b; long alsa_min_vol = 0, alsa_max_vol = 100; int err, index; mixer_element = 0; qDebug("AmeSystemSound::SoundOutput: setupMixer()"); if ((err = getMixer(&mixer, card)) < 0) return err; parseMixerName(device.toAscii().data(), &name, &index); mixer_element = getMixerElem(mixer, name, index); free(name); if (!mixer_element) { qWarning("SoundOutput: Failed to find mixer element"); return -1; } /* This hack was copied from xmms. * Work around a bug in alsa-lib up to 1.0.0rc2 where the * new range don't take effect until the volume is changed. * This hack should be removed once we depend on Alsa 1.0.0. */ snd_mixer_selem_get_playback_volume(mixer_element, SND_MIXER_SCHN_FRONT_LEFT, &a); snd_mixer_selem_get_playback_volume(mixer_element, SND_MIXER_SCHN_FRONT_RIGHT, &b); snd_mixer_selem_get_playback_volume_range(mixer_element, &alsa_min_vol, &alsa_max_vol); snd_mixer_selem_set_playback_volume_range(mixer_element, 0, 100); if (alsa_max_vol == 0) { mixer_element = NULL; return -1; } setVolume(a * 100 / alsa_max_vol); qDebug("SoundOutput: setupMixer() success"); return 0; }
int VolumeALSA::setupMixer(QString card, QString device) { char *name; int err, index; pcm_element = 0; qDebug("OutputALSA: setupMixer()"); if ((err = getMixer(&m_mixer, card)) < 0) return err; parseMixerName(device.toAscii().data(), &name, &index); pcm_element = getMixerElem(m_mixer, name, index); free(name); if (!pcm_element) { qWarning("OutputALSA: Failed to find mixer element"); return -1; } if((err = snd_mixer_selem_set_playback_volume_range(pcm_element, 0, 100)) < 0) { qWarning("OutputALSA: Unable to set volume range: %s", snd_strerror(-err)); pcm_element = NULL; return -1; } // setup socket notifiers to monitor the state changes of the mixer int n = snd_mixer_poll_descriptors_count(m_mixer); if(n > 0) { struct pollfd* fds = new struct pollfd[n]; n = snd_mixer_poll_descriptors(m_mixer, fds, n); for(int i = 0; i < n; ++i) { int sock = fds[i].fd; QSocketNotifier* sn = new QSocketNotifier(sock, QSocketNotifier::Read, this); connect(sn, SIGNAL(activated(int)), SIGNAL(changed())); } delete []fds; } qDebug("OutputALSA: setupMixer() success"); return 0; }