[mythtv-commits] Ticket #8267: bug in alsa use.

MythTV mythtv at cvs.mythtv.org
Thu Apr 1 12:11:42 UTC 2010


#8267: bug in alsa use.
-----------------------------------+----------------------------------------
 Reporter:  dengxf@…               |       Owner:  jyavenard
     Type:  defect                 |      Status:  new      
 Priority:  minor                  |   Milestone:  0.23     
Component:  MythTV - Audio Output  |     Version:  0.23rc1  
 Severity:  medium                 |     Mlocked:  0        
-----------------------------------+----------------------------------------
 function SetParameters in audiooutputalsa.cpp, there is a wrong usage of
 alsa api.
 snd_pcm_hw_params_get_buffer_size or snd_pcm_hw_params_get_period_size
 should be called after snd_pcm_hw_params.
 if it is called before snd_pcm_hw_params, they maybe failed.
 for example:
 call snd_pcm_hw_params_set_rate_near with 12000, when call
 snd_pcm_hw_params_get_buffer_size, it will failed.

 here is a patch:
 --- audiooutputalsa.cpp.orig    2010-04-01 20:09:31.000000000 +0800
 +++ audiooutputalsa.cpp 2010-04-01 20:09:59.000000000 +0800
 @@ -421,16 +421,6 @@
          return err;
      }

 -    if ((err = snd_pcm_hw_params_get_buffer_size(params, &buffer_size)) <
 0)
 -    {
 -        Error(QString("Unable to get buffer size for playback: %1")
 -              .arg(snd_strerror(err)));
 -        return err;
 -    } else {
 -        VERBOSE(VB_AUDIO, QString("get_buffer_size returned
 %1").arg(buffer_size));
 -    }
 -    soundcard_buffer_size = buffer_size * audio_bytes_per_sample;
 -
      /* set the period time */
      if ((err = snd_pcm_hw_params_set_period_time_near(
                      handle, params, &period_time, &dir)) < 0)
 @@ -442,20 +432,30 @@
          VERBOSE(VB_AUDIO, QString("set_period_time_near returned
 %1").arg(period_time));
      }

 -    if ((err = snd_pcm_hw_params_get_period_size(params, &period_size,
 -                                                &dir)) < 0) {
 -        Error(QString("Unable to get period size for playback: %1")
 +    /* write the parameters to device */
 +    if ((err = snd_pcm_hw_params(handle, params)) < 0) {
 +        Error(QString("Unable to set hw params for playback: %1")
 +              .arg(snd_strerror(err)));
 +        return err;
 +    }
 +
 +    if ((err = snd_pcm_hw_params_get_buffer_size(params, &buffer_size)) <
 0)
 +    {
 +        Error(QString("Unable to get buffer size for playback: %1")
                .arg(snd_strerror(err)));
          return err;
      } else {
 -        VERBOSE(VB_AUDIO, QString("get_period_size returned
 %1").arg(period_size));
 +        VERBOSE(VB_AUDIO, QString("get_buffer_size returned
 %1").arg(buffer_size));
      }
 +    soundcard_buffer_size = buffer_size * audio_bytes_per_sample;

 -    /* write the parameters to device */
 -    if ((err = snd_pcm_hw_params(handle, params)) < 0) {
 -        Error(QString("Unable to set hw params for playback: %1")
 +    if ((err = snd_pcm_hw_params_get_period_size(params, &period_size,
 +                                                &dir)) < 0) {
 +        Error(QString("Unable to get period size for playback: %1")
                .arg(snd_strerror(err)));
          return err;
 +    } else {
 +        VERBOSE(VB_AUDIO, QString("get_period_size returned
 %1").arg(period_size));
      }

      /* get the current swparams */

-- 
Ticket URL: <http://svn.mythtv.org/trac/ticket/8267>
MythTV <http://www.mythtv.org/>
MythTV


More information about the mythtv-commits mailing list