Ticket #1217: alsa.patch

File alsa.patch, 4.0 KB (added by mythtv@…, 15 years ago)
  • libs/libmyth/audiooutputalsa.cpp

     
    450450
    451451int AudioOutputALSA::GetVolumeChannel(int channel)
    452452{
     453    snd_mixer_selem_id_t *sid;
     454    snd_mixer_elem_t *elem;
    453455    long actual_volume, volume;
    454456
    455457    if (mixer_handle == NULL)
     
    461463
    462464    if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
    463465    {
    464         Error(QString("mixer unable to find control %1").arg(mixer_control));
    465         CloseMixer();
    466         return 0;
     466        VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1").arg(mixer_control));
     467        return 100;
    467468    }
    468469
    469     GetVolumeRange();
     470    if (!snd_mixer_selem_has_playback_channel(elem, (snd_mixer_selem_channel_id_t)channel))
     471    {
     472        snd_mixer_selem_id_set_index(sid, channel);
     473        if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
     474        {
     475            VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1 %2").arg(mixer_control).arg(channel));
     476            return 100;
     477        }
     478    }
    470479
     480    GetVolumeRange(elem);
     481
    471482    snd_mixer_selem_get_playback_volume(elem, (snd_mixer_selem_channel_id_t)channel,
    472483                                        &actual_volume);
    473484    volume = (int)((actual_volume - playback_vol_min) *
     
    482493
    483494void AudioOutputALSA::SetCurrentVolume(QString control, int channel, int volume)
    484495{
     496    snd_mixer_selem_id_t *sid;
     497    snd_mixer_elem_t *elem;
    485498    int err, set_vol;
    486499
    487500    VERBOSE(VB_AUDIO, QString("Setting %1 volume to %2")
     
    495508
    496509        if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
    497510        {
    498             Error(QString("mixer unable to find control %1").arg(control));
     511            VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1").arg(control));
    499512            return;
    500513        }
    501514
    502         GetVolumeRange();
     515        if (!snd_mixer_selem_has_playback_channel(elem, (snd_mixer_selem_channel_id_t)channel))
     516        {
     517            snd_mixer_selem_id_set_index(sid, channel);
     518            if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
     519            {
     520                VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1 %2").arg(control).arg(channel));
     521                return;
     522            }
     523        }
    503524
     525        GetVolumeRange(elem);
     526
    504527        set_vol = (int)(volume / volume_range_multiplier +
    505528                        playback_vol_min + 0.5);
    506529
    507530        if ((err = snd_mixer_selem_set_playback_volume(elem,
    508531            (snd_mixer_selem_channel_id_t)channel, set_vol)) < 0)
    509532        {
    510             Error(QString("mixer set channel %1 err %2: %3")
     533            VERBOSE(VB_IMPORTANT, QString("mixer set channel %1 err %2: %3")
    511534                  .arg(channel).arg(err).arg(snd_strerror(err)));
    512535            return;
    513536        }
     
    558581
    559582    VERBOSE(VB_AUDIO, QString("Opening mixer %1").arg(device));
    560583
    561     // TODO: This is opening card 0. Fix for case of multiple soundcards
    562584    if ((err = snd_mixer_open(&mixer_handle, 0)) < 0)
    563585    {
    564586        Error(QString("Mixer device open error %1: %2")
     
    592614    }
    593615}
    594616
    595 inline void AudioOutputALSA::GetVolumeRange(void)
     617inline void AudioOutputALSA::GetVolumeRange(snd_mixer_elem_t *elem)
    596618{
    597619    snd_mixer_selem_get_playback_volume_range(elem, &playback_vol_min,
    598620                                              &playback_vol_max);
  • libs/libmyth/audiooutputalsa.h

     
    5353    void OpenMixer(bool setstartingvolume);
    5454    void CloseMixer(void);
    5555    void SetupMixer(void);
    56     inline void GetVolumeRange(void);
     56    inline void GetVolumeRange(snd_mixer_elem_t *elem);
    5757
    5858    snd_mixer_t          *mixer_handle;
    59     snd_mixer_elem_t     *elem;
    60     snd_mixer_selem_id_t *sid;
    6159
    6260    QString mixer_control;  // e.g. "PCM"
    6361