mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-21 13:36:39 +00:00
ext/alsa/gstalsa.c: - don't call set_periods_integer anymore, it breaks the configuration randomly
Original commit message from CVS: * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), (gst_alsa_start_audio): - don't call set_periods_integer anymore, it breaks the configuration randomly - call snd_pcm_hw_params_set_access directly instead of using masks - don't fail if the sw_params can't be set, just use the default params and hope it works. Alsalib has weird issues when you touch sw_params and does no proper error reporting about what failed. * ext/alsa/gstalsa.c: (gst_alsa_open_audio), (gst_alsa_close_audio): make our alsa debugging go via gst debugging and not conditionally defined * ext/alsa/gstalsa.h: add ALSA_DEBUG_FLUSH macro * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper), (plugin_init): wrap alsa errors to be printed via the gst debugging system and not spammed to stderr
This commit is contained in:
parent
5528abe7af
commit
f157024ae8
4 changed files with 91 additions and 41 deletions
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
||||||
|
2004-06-06 Benjamin Otte <otte@gnome.org>
|
||||||
|
|
||||||
|
* ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params),
|
||||||
|
(gst_alsa_set_hw_params), (gst_alsa_set_sw_params),
|
||||||
|
(gst_alsa_start_audio):
|
||||||
|
- don't call set_periods_integer anymore, it breaks the
|
||||||
|
configuration randomly
|
||||||
|
- call snd_pcm_hw_params_set_access directly instead of using masks
|
||||||
|
- don't fail if the sw_params can't be set, just use the default
|
||||||
|
params and hope it works. Alsalib has weird issues when you touch
|
||||||
|
sw_params and does no proper error reporting about what failed.
|
||||||
|
* ext/alsa/gstalsa.c: (gst_alsa_open_audio),
|
||||||
|
(gst_alsa_close_audio):
|
||||||
|
make our alsa debugging go via gst debugging and not conditionally
|
||||||
|
defined
|
||||||
|
* ext/alsa/gstalsa.h:
|
||||||
|
add ALSA_DEBUG_FLUSH macro
|
||||||
|
* ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper),
|
||||||
|
(plugin_init):
|
||||||
|
wrap alsa errors to be printed via the gst debugging system and not
|
||||||
|
spammed to stderr
|
||||||
|
|
||||||
2004-06-04 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
2004-06-04 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||||
|
|
||||||
* gst/qtdemux/qtdemux.c: (gst_qtdemux_init),
|
* gst/qtdemux/qtdemux.c: (gst_qtdemux_init),
|
||||||
|
|
|
@ -1186,11 +1186,8 @@ gst_alsa_open_audio (GstAlsa * this)
|
||||||
|
|
||||||
GST_INFO ("Opening alsa device \"%s\"...", this->device);
|
GST_INFO ("Opening alsa device \"%s\"...", this->device);
|
||||||
|
|
||||||
#if 0
|
ERROR_CHECK (snd_output_buffer_open (&this->out),
|
||||||
/* enable this to get better debugging */
|
|
||||||
ERROR_CHECK (snd_output_stdio_attach (&this->out, stderr, 0),
|
|
||||||
"error opening log output: %s");
|
"error opening log output: %s");
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((ret = snd_pcm_open (&this->handle, this->device,
|
if ((ret = snd_pcm_open (&this->handle, this->device,
|
||||||
GST_ALSA_GET_CLASS (this)->stream, SND_PCM_NONBLOCK)) < 0) {
|
GST_ALSA_GET_CLASS (this)->stream, SND_PCM_NONBLOCK)) < 0) {
|
||||||
|
@ -1237,7 +1234,6 @@ static gboolean
|
||||||
gst_alsa_probe_hw_params (GstAlsa * this, GstAlsaFormat * format)
|
gst_alsa_probe_hw_params (GstAlsa * this, GstAlsaFormat * format)
|
||||||
{
|
{
|
||||||
snd_pcm_hw_params_t *hw_params;
|
snd_pcm_hw_params_t *hw_params;
|
||||||
snd_pcm_access_mask_t *mask;
|
|
||||||
snd_pcm_uframes_t period_size;
|
snd_pcm_uframes_t period_size;
|
||||||
unsigned int period_count;
|
unsigned int period_count;
|
||||||
|
|
||||||
|
@ -1249,28 +1245,21 @@ gst_alsa_probe_hw_params (GstAlsa * this, GstAlsaFormat * format)
|
||||||
|
|
||||||
snd_pcm_hw_params_alloca (&hw_params);
|
snd_pcm_hw_params_alloca (&hw_params);
|
||||||
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_any (this->handle, hw_params));
|
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_any (this->handle, hw_params));
|
||||||
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_periods_integer (this->handle,
|
|
||||||
hw_params));
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* enable this for soundcard specific debugging */
|
|
||||||
snd_pcm_hw_params_dump (hw_params, this->out);
|
snd_pcm_hw_params_dump (hw_params, this->out);
|
||||||
#endif
|
ALSA_DEBUG_FLUSH (this);
|
||||||
|
|
||||||
mask = alloca (snd_pcm_access_mask_sizeof ());
|
|
||||||
snd_pcm_access_mask_none (mask);
|
|
||||||
if (GST_ELEMENT (this)->numpads == 1) {
|
if (GST_ELEMENT (this)->numpads == 1) {
|
||||||
snd_pcm_access_mask_set (mask,
|
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_access (this->handle,
|
||||||
this->
|
hw_params, this->
|
||||||
mmap ? SND_PCM_ACCESS_MMAP_INTERLEAVED : SND_PCM_ACCESS_RW_INTERLEAVED);
|
mmap ? SND_PCM_ACCESS_MMAP_INTERLEAVED :
|
||||||
|
SND_PCM_ACCESS_RW_INTERLEAVED));
|
||||||
} else {
|
} else {
|
||||||
snd_pcm_access_mask_set (mask,
|
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_access (this->handle,
|
||||||
this->
|
hw_params, this->
|
||||||
mmap ? SND_PCM_ACCESS_MMAP_NONINTERLEAVED :
|
mmap ? SND_PCM_ACCESS_MMAP_NONINTERLEAVED :
|
||||||
SND_PCM_ACCESS_RW_NONINTERLEAVED);
|
SND_PCM_ACCESS_RW_NONINTERLEAVED));
|
||||||
}
|
}
|
||||||
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_access_mask (this->handle,
|
|
||||||
hw_params, mask));
|
|
||||||
|
|
||||||
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_format (this->handle, hw_params,
|
SIMPLE_ERROR_CHECK (snd_pcm_hw_params_set_format (this->handle, hw_params,
|
||||||
format->format));
|
format->format));
|
||||||
|
@ -1298,7 +1287,6 @@ static gboolean
|
||||||
gst_alsa_set_hw_params (GstAlsa * this)
|
gst_alsa_set_hw_params (GstAlsa * this)
|
||||||
{
|
{
|
||||||
snd_pcm_hw_params_t *hw_params;
|
snd_pcm_hw_params_t *hw_params;
|
||||||
snd_pcm_access_mask_t *mask;
|
|
||||||
|
|
||||||
g_return_val_if_fail (this != NULL, FALSE);
|
g_return_val_if_fail (this != NULL, FALSE);
|
||||||
g_return_val_if_fail (this->handle != NULL, FALSE);
|
g_return_val_if_fail (this->handle != NULL, FALSE);
|
||||||
|
@ -1314,27 +1302,21 @@ gst_alsa_set_hw_params (GstAlsa * this)
|
||||||
snd_pcm_hw_params_alloca (&hw_params);
|
snd_pcm_hw_params_alloca (&hw_params);
|
||||||
ERROR_CHECK (snd_pcm_hw_params_any (this->handle, hw_params),
|
ERROR_CHECK (snd_pcm_hw_params_any (this->handle, hw_params),
|
||||||
"Broken configuration for this PCM: %s");
|
"Broken configuration for this PCM: %s");
|
||||||
ERROR_CHECK (snd_pcm_hw_params_set_periods_integer (this->handle, hw_params),
|
|
||||||
"cannot restrict period size to integral value: %s");
|
|
||||||
|
|
||||||
/* enable this for soundcard specific debugging */
|
snd_pcm_hw_params_dump (hw_params, this->out);
|
||||||
/* snd_pcm_hw_params_dump (hw_params, this->out); */
|
ALSA_DEBUG_FLUSH (this);
|
||||||
|
|
||||||
mask = alloca (snd_pcm_access_mask_sizeof ());
|
|
||||||
snd_pcm_access_mask_none (mask);
|
|
||||||
if (GST_ELEMENT (this)->numpads == 1) {
|
if (GST_ELEMENT (this)->numpads == 1) {
|
||||||
snd_pcm_access_mask_set (mask,
|
ERROR_CHECK (snd_pcm_hw_params_set_access (this->handle, hw_params, this->
|
||||||
this->
|
mmap ? SND_PCM_ACCESS_MMAP_INTERLEAVED :
|
||||||
mmap ? SND_PCM_ACCESS_MMAP_INTERLEAVED : SND_PCM_ACCESS_RW_INTERLEAVED);
|
SND_PCM_ACCESS_RW_INTERLEAVED),
|
||||||
|
"This plugin does not support your harware: %s");
|
||||||
} else {
|
} else {
|
||||||
snd_pcm_access_mask_set (mask,
|
ERROR_CHECK (snd_pcm_hw_params_set_access (this->handle, hw_params, this->
|
||||||
this->
|
mmap ? SND_PCM_ACCESS_MMAP_NONINTERLEAVED :
|
||||||
mmap ? SND_PCM_ACCESS_MMAP_NONINTERLEAVED :
|
SND_PCM_ACCESS_RW_NONINTERLEAVED),
|
||||||
SND_PCM_ACCESS_RW_NONINTERLEAVED);
|
"This plugin does not support your harware: %s");
|
||||||
}
|
}
|
||||||
ERROR_CHECK (snd_pcm_hw_params_set_access_mask (this->handle, hw_params,
|
|
||||||
mask),
|
|
||||||
"The Gstreamer ALSA plugin does not support your hardware. Error: %s");
|
|
||||||
|
|
||||||
if (this->format) {
|
if (this->format) {
|
||||||
ERROR_CHECK (snd_pcm_hw_params_set_format (this->handle, hw_params,
|
ERROR_CHECK (snd_pcm_hw_params_set_format (this->handle, hw_params,
|
||||||
|
@ -1349,7 +1331,7 @@ gst_alsa_set_hw_params (GstAlsa * this)
|
||||||
}
|
}
|
||||||
|
|
||||||
ERROR_CHECK (snd_pcm_hw_params_set_periods_near (this->handle, hw_params,
|
ERROR_CHECK (snd_pcm_hw_params_set_periods_near (this->handle, hw_params,
|
||||||
&this->period_count, 0), "error setting buffer size to %u: %s",
|
&this->period_count, 0), "error setting period count to %u: %s",
|
||||||
(guint) this->period_count);
|
(guint) this->period_count);
|
||||||
ERROR_CHECK (snd_pcm_hw_params_set_period_size_near (this->handle, hw_params,
|
ERROR_CHECK (snd_pcm_hw_params_set_period_size_near (this->handle, hw_params,
|
||||||
&this->period_size, 0), "error setting period size to %u frames: %s",
|
&this->period_size, 0), "error setting period size to %u frames: %s",
|
||||||
|
@ -1384,6 +1366,9 @@ gst_alsa_set_sw_params (GstAlsa * this)
|
||||||
ERROR_CHECK (snd_pcm_sw_params_current (this->handle, sw_params),
|
ERROR_CHECK (snd_pcm_sw_params_current (this->handle, sw_params),
|
||||||
"Could not get current software parameters: %s");
|
"Could not get current software parameters: %s");
|
||||||
|
|
||||||
|
snd_pcm_sw_params_dump (sw_params, this->out);
|
||||||
|
ALSA_DEBUG_FLUSH (this);
|
||||||
|
|
||||||
ERROR_CHECK (snd_pcm_sw_params_set_silence_size (this->handle, sw_params, 0),
|
ERROR_CHECK (snd_pcm_sw_params_set_silence_size (this->handle, sw_params, 0),
|
||||||
"could not set silence size: %s");
|
"could not set silence size: %s");
|
||||||
ERROR_CHECK (snd_pcm_sw_params_set_silence_threshold (this->handle, sw_params,
|
ERROR_CHECK (snd_pcm_sw_params_set_silence_threshold (this->handle, sw_params,
|
||||||
|
@ -1401,7 +1386,6 @@ gst_alsa_set_sw_params (GstAlsa * this)
|
||||||
"Unable to set transfer align for playback: %s");
|
"Unable to set transfer align for playback: %s");
|
||||||
ERROR_CHECK (snd_pcm_sw_params (this->handle, sw_params),
|
ERROR_CHECK (snd_pcm_sw_params (this->handle, sw_params),
|
||||||
"could not set sw_params: %s");
|
"could not set sw_params: %s");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1413,7 +1397,8 @@ gst_alsa_start_audio (GstAlsa * this)
|
||||||
if (!gst_alsa_set_hw_params (this))
|
if (!gst_alsa_set_hw_params (this))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!gst_alsa_set_sw_params (this))
|
if (!gst_alsa_set_sw_params (this))
|
||||||
return FALSE;
|
GST_WARNING_OBJECT (this,
|
||||||
|
"setting software parameters failed, we'll trust the defaults");
|
||||||
|
|
||||||
GST_FLAG_SET (this, GST_ALSA_RUNNING);
|
GST_FLAG_SET (this, GST_ALSA_RUNNING);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1475,6 +1460,8 @@ gst_alsa_stop_audio (GstAlsa * this)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_alsa_close_audio (GstAlsa * this)
|
gst_alsa_close_audio (GstAlsa * this)
|
||||||
{
|
{
|
||||||
|
gint err;
|
||||||
|
|
||||||
/* if there's no pads, we never open. So we don't close either. */
|
/* if there's no pads, we never open. So we don't close either. */
|
||||||
if (!gst_element_get_pad_list (GST_ELEMENT (this)))
|
if (!gst_element_get_pad_list (GST_ELEMENT (this)))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1482,6 +1469,11 @@ gst_alsa_close_audio (GstAlsa * this)
|
||||||
g_return_val_if_fail (this != NULL, FALSE);
|
g_return_val_if_fail (this != NULL, FALSE);
|
||||||
g_return_val_if_fail (this->handle != NULL, FALSE);
|
g_return_val_if_fail (this->handle != NULL, FALSE);
|
||||||
|
|
||||||
|
ALSA_DEBUG_FLUSH (this);
|
||||||
|
err = snd_output_close (this->out);
|
||||||
|
if (err != 0)
|
||||||
|
GST_ERROR_OBJECT (this, "failed to close debugging output: %s",
|
||||||
|
snd_strerror (err));
|
||||||
ERROR_CHECK (snd_pcm_close (this->handle), "Error closing device: %s");
|
ERROR_CHECK (snd_pcm_close (this->handle), "Error closing device: %s");
|
||||||
|
|
||||||
this->handle = NULL;
|
this->handle = NULL;
|
||||||
|
|
|
@ -35,6 +35,17 @@ GST_DEBUG_CATEGORY_EXTERN (alsa_debug);
|
||||||
#define GST_CAT_DEFAULT alsa_debug
|
#define GST_CAT_DEFAULT alsa_debug
|
||||||
|
|
||||||
|
|
||||||
|
#define ALSA_DEBUG_FLUSH(this) G_STMT_START{ \
|
||||||
|
gchar *__str; \
|
||||||
|
ssize_t __size; \
|
||||||
|
__size = snd_output_buffer_string (this->out, &__str); \
|
||||||
|
if (__size > 0) { \
|
||||||
|
GST_INFO_OBJECT (this, "%*s", __size, __str); \
|
||||||
|
if (snd_output_flush (this->out) != 0) \
|
||||||
|
GST_ERROR_OBJECT (this, "error flushing output buffer"); \
|
||||||
|
} \
|
||||||
|
}G_STMT_END
|
||||||
|
|
||||||
/* error checking for standard alsa functions */
|
/* error checking for standard alsa functions */
|
||||||
/* NOTE: these functions require a GObject *this and can only be used in
|
/* NOTE: these functions require a GObject *this and can only be used in
|
||||||
functions that return TRUE on success and FALSE on error */
|
functions that return TRUE on success and FALSE on error */
|
||||||
|
|
|
@ -29,9 +29,31 @@
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY (alsa_debug);
|
GST_DEBUG_CATEGORY (alsa_debug);
|
||||||
|
|
||||||
|
/* ALSA debugging wrapper */
|
||||||
|
static void
|
||||||
|
gst_alsa_error_wrapper (const char *file, int line, const char *function,
|
||||||
|
int err, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
gchar *str;
|
||||||
|
|
||||||
|
va_start (args, fmt);
|
||||||
|
str = g_strdup_vprintf (fmt, args);
|
||||||
|
va_end (args);
|
||||||
|
/* FIXME: use GST_LEVEL_ERROR here? Currently warning is used because we're
|
||||||
|
* able to catch enough of the errors that would be printed otherwise
|
||||||
|
*/
|
||||||
|
gst_debug_log (alsa_debug, GST_LEVEL_WARNING, file, function, line, NULL,
|
||||||
|
"alsalib error: %s%s%s", str, err ? ": " : "",
|
||||||
|
err ? snd_strerror (err) : "");
|
||||||
|
g_free (str);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
if (!gst_element_register (plugin, "alsamixer", GST_RANK_NONE,
|
if (!gst_element_register (plugin, "alsamixer", GST_RANK_NONE,
|
||||||
GST_TYPE_ALSA_MIXER))
|
GST_TYPE_ALSA_MIXER))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -43,6 +65,9 @@ plugin_init (GstPlugin * plugin)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (alsa_debug, "alsa", 0, "alsa plugins");
|
GST_DEBUG_CATEGORY_INIT (alsa_debug, "alsa", 0, "alsa plugins");
|
||||||
|
err = snd_lib_error_set_handler (gst_alsa_error_wrapper);
|
||||||
|
if (err != 0)
|
||||||
|
GST_WARNING ("failed to set alsa error handler");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue