Ticket #1217: 1217-v1.patch

File 1217-v1.patch, 9.1 KB (added by danielk, 15 years ago)

fixes some problems with original patch

  • libs/libmyth/audiooutputbase.h

     
    5252    // Send output events showing current progress
    5353    virtual void Status(void);
    5454
    55     QString GetError() { return lastError; };
    56 
    5755    virtual void SetSourceBitrate(int rate);
    5856
    5957    //  Only really used by the AudioOutputNULL object
     
    116114    bool buffer_output_data_for_use; //  used by AudioOutputNULL
    117115   
    118116 private:
    119     QString lastError;
    120 
    121117    // resampler
    122118    bool need_resampler;
    123119    SRC_STATE *src_ctx;
  • libs/libmyth/audiooutputalsa.cpp

     
    455455    if (mixer_handle == NULL)
    456456        return 100;
    457457
     458    snd_mixer_selem_id_t *sid;
    458459    snd_mixer_selem_id_alloca(&sid);
    459460    snd_mixer_selem_id_set_index(sid, 0);
    460461    snd_mixer_selem_id_set_name(sid, mixer_control.ascii());
    461462
    462     if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
     463    snd_mixer_elem_t *elem = snd_mixer_find_selem(mixer_handle, sid);
     464    if (!elem)
    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")
     467                .arg(mixer_control));
     468        return 100;
    467469    }
    468470
    469     GetVolumeRange();
     471    snd_mixer_selem_channel_id_t chan = (snd_mixer_selem_channel_id_t) channel;
     472    if (!snd_mixer_selem_has_playback_channel(elem, chan))
     473    {
     474        snd_mixer_selem_id_set_index(sid, channel);
     475        if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
     476        {
     477            VERBOSE(VB_IMPORTANT, QString("Mixer unable to find control %1 %2")
     478                    .arg(mixer_control).arg(channel));
     479            return 100;
     480        }
     481    }
    470482
     483    GetVolumeRange(elem);
     484
    471485    snd_mixer_selem_get_playback_volume(elem, (snd_mixer_selem_channel_id_t)channel,
    472486                                        &actual_volume);
    473487    volume = (int)((actual_volume - playback_vol_min) *
     
    482496
    483497void AudioOutputALSA::SetCurrentVolume(QString control, int channel, int volume)
    484498{
    485     int err, set_vol;
    486 
    487499    VERBOSE(VB_AUDIO, QString("Setting %1 volume to %2")
    488500            .arg(control).arg(volume));
    489501
    490     if (mixer_handle != NULL)
     502    if (!mixer_handle)
     503        return; // no mixer, nothing to do
     504
     505    snd_mixer_selem_id_t *sid;
     506    snd_mixer_selem_id_alloca(&sid);
     507    snd_mixer_selem_id_set_index(sid, 0);
     508    snd_mixer_selem_id_set_name(sid, control.ascii());
     509
     510    snd_mixer_elem_t *elem = snd_mixer_find_selem(mixer_handle, sid);
     511    if (!elem)
    491512    {
    492         snd_mixer_selem_id_alloca(&sid);
    493         snd_mixer_selem_id_set_index(sid, 0);
    494         snd_mixer_selem_id_set_name(sid, control.ascii());
     513        VERBOSE(VB_IMPORTANT, QString("Mixer unable to find control %1")
     514                .arg(control));
     515        return;
     516    }
    495517
     518    snd_mixer_selem_channel_id_t chan = (snd_mixer_selem_channel_id_t) channel;
     519    if (!snd_mixer_selem_has_playback_channel(elem, chan))
     520    {
     521        snd_mixer_selem_id_set_index(sid, channel);
    496522        if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
    497523        {
    498             Error(QString("mixer unable to find control %1").arg(control));
     524            VERBOSE(VB_IMPORTANT,
     525                    QString("mixer unable to find control %1 %2")
     526                    .arg(control).arg(channel));
    499527            return;
    500528        }
     529    }
    501530
    502         GetVolumeRange();
     531    GetVolumeRange(elem);
    503532
    504         set_vol = (int)(volume / volume_range_multiplier +
     533    int set_vol = (int)(volume / volume_range_multiplier +
    505534                        playback_vol_min + 0.5);
    506535
    507         if ((err = snd_mixer_selem_set_playback_volume(elem,
    508             (snd_mixer_selem_channel_id_t)channel, set_vol)) < 0)
    509         {
    510             Error(QString("mixer set channel %1 err %2: %3")
    511                   .arg(channel).arg(err).arg(snd_strerror(err)));
    512             return;
    513         }
    514         else
    515         {
    516             VERBOSE(VB_AUDIO, QString("channel %1 vol set to %2")
    517                               .arg(channel).arg(set_vol));
    518         }
     536    int err = snd_mixer_selem_set_playback_volume(elem, chan, set_vol);
     537    if (err < 0)
     538    {
     539        VERBOSE(VB_IMPORTANT, QString("mixer set channel %1 err %2: %3")
     540                .arg(channel).arg(err).arg(snd_strerror(err)));
    519541    }
     542    else
     543    {
     544        VERBOSE(VB_AUDIO, QString("channel %1 vol set to %2")
     545                .arg(channel).arg(set_vol));
     546    }
    520547}
    521548
    522549void AudioOutputALSA::OpenMixer(bool setstartingvolume)
     
    561588    // TODO: This is opening card 0. Fix for case of multiple soundcards
    562589    if ((err = snd_mixer_open(&mixer_handle, 0)) < 0)
    563590    {
    564         Error(QString("Mixer device open error %1: %2")
    565               .arg(err).arg(snd_strerror(err)));
     591        Warn(QString("Mixer device open error %1: %2")
     592             .arg(err).arg(snd_strerror(err)));
    566593        mixer_handle = NULL;
    567594        return;
    568595    }
    569596
    570597    if ((err = snd_mixer_attach(mixer_handle, device.ascii())) < 0)
    571598    {
    572         Error(QString("Mixer attach error %1: %2\nCheck Mixer Name in Setup: %3")
    573               .arg(err).arg(snd_strerror(err)).arg(device.ascii()));
     599        Warn(QString("Mixer attach error %1: %2"
     600                     "\n\t\t\tCheck Mixer Name in Setup: '%3'")
     601             .arg(err).arg(snd_strerror(err)).arg(device));
    574602        CloseMixer();
    575603        return;
    576604    }
    577605
    578606    if ((err = snd_mixer_selem_register(mixer_handle, NULL, NULL)) < 0)
    579607    {
    580         Error(QString("Mixer register error %1: %2")
    581               .arg(err).arg(snd_strerror(err)));
     608        Warn(QString("Mixer register error %1: %2")
     609             .arg(err).arg(snd_strerror(err)));
    582610        CloseMixer();
    583611        return;
    584612    }
    585613
    586614    if ((err = snd_mixer_load(mixer_handle)) < 0)
    587615    {
    588         Error(QString("Mixer load error %1: %2")
    589               .arg(err).arg(snd_strerror(err)));
     616        Warn(QString("Mixer load error %1: %2")
     617             .arg(err).arg(snd_strerror(err)));
    590618        CloseMixer();
    591619        return;
    592620    }
    593621}
    594622
    595 inline void AudioOutputALSA::GetVolumeRange(void)
     623void AudioOutputALSA::GetVolumeRange(snd_mixer_elem_t *elem)
    596624{
    597625    snd_mixer_selem_get_playback_volume_range(elem, &playback_vol_min,
    598626                                              &playback_vol_max);
  • libs/libmyth/audiooutputbase.cpp

     
    1515
    1616AudioOutputBase::AudioOutputBase(QString audiodevice, int,
    1717                                 int, int,
    18                                  AudioOutputSource source, bool set_initial_vol)
     18                                 AudioOutputSource source,
     19                                 bool set_initial_vol)
    1920{
    2021    pthread_mutex_init(&audio_buflock, NULL);
    2122    pthread_mutex_init(&avsync_lock, NULL);
  • libs/libmyth/audiooutput.h

     
    2222                                 int audio_channels, int audio_samplerate,
    2323                                 AudioOutputSource source, bool set_initial_vol);
    2424
    25     AudioOutput() : VolumeBase(), OutputListeners() { lastError = QString::null; };
     25    AudioOutput() :
     26        VolumeBase(),             OutputListeners(),
     27        lastError(QString::null), lastWarn(QString::null) {}
     28
    2629    virtual ~AudioOutput() { };
    2730
    2831    // reconfigure sound out for new params
     
    5558
    5659    virtual void SetSourceBitrate(int ) { }
    5760
    58     QString GetError() { return lastError; };
     61    QString GetError(void)   const { return lastError; }
     62    QString GetWarning(void) const { return lastWarn; }
    5963
    6064    //  Only really used by the AudioOutputNULL object
    6165   
    6266    virtual void bufferOutputData(bool y) = 0;
    6367    virtual int readOutputData(unsigned char *read_buffer, int max_length) = 0;
    6468
    65  protected:
     69  protected:
    6670    void Error(QString msg)
    67      { lastError = msg; VERBOSE(VB_IMPORTANT, lastError); };
     71        { lastError = msg; VERBOSE(VB_IMPORTANT, "Error: " + lastError); }
     72    void Warn(QString msg)
     73        { lastWarn  = msg; VERBOSE(VB_IMPORTANT, "Warning: " + lastWarn); }
    6874
    69  private:
     75  protected:
    7076    QString lastError;
     77    QString lastWarn;
    7178};
    7279
    7380#endif
  • libs/libmyth/audiooutputalsa.h

     
    5353    void OpenMixer(bool setstartingvolume);
    5454    void CloseMixer(void);
    5555    void SetupMixer(void);
    56     inline void GetVolumeRange(void);
     56    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