[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