Add verbose hw_params debugging

Added the verbose hw_params dump for debugging.
The verbose error message is shown with the current hw_params dump
when $LIBASOUND_DEBUG is set.
This commit is contained in:
Takashi Iwai 2005-04-14 14:22:13 +00:00
parent 0aed1ab2af
commit b579a024db

View file

@ -21,6 +21,42 @@
#include "pcm_local.h"
#ifndef NDEBUG
/*
* dump hw_params when $LIBASOUND_DEBUG is set
*/
static void dump_hw_params(snd_pcm_hw_params_t *params, const char *type,
snd_pcm_hw_param_t var, unsigned int val, int err)
{
const char *verbose = getenv("LIBASOUND_DEBUG");
snd_output_t *out;
if (! verbose || ! *verbose)
return;
if (snd_output_stdio_attach(&out, stderr, 0) < 0)
return;
fprintf(stderr, "ALSA ERROR hw_params: %s (%s)\n",
type, snd_pcm_hw_param_name(var));
fprintf(stderr, " value = ");
switch (var) {
case SND_PCM_HW_PARAM_ACCESS:
fprintf(stderr, "%s", snd_pcm_access_name(val));
break;
case SND_PCM_HW_PARAM_FORMAT:
fprintf(stderr, "%s", snd_pcm_format_name(val));
break;
case SND_PCM_HW_PARAM_SUBFORMAT:
fprintf(stderr, "%s", snd_pcm_subformat_name(val));
break;
default:
fprintf(stderr, "%u", val);
}
fprintf(stderr, " : %s\n", snd_strerror(err));
snd_pcm_hw_params_dump(params, out);
snd_output_close(out);
}
#endif
static inline int hw_is_mask(snd_pcm_hw_param_t var)
{
#if SND_PCM_HW_PARAM_FIRST_MASK == 0
@ -438,6 +474,8 @@ int snd_pcm_hw_param_set_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
_fail:
if (mode == SND_TRY)
*params = save;
if (err < 0)
dump_hw_params(params, "set_min", var, *val, err);
return err;
}
@ -513,6 +551,8 @@ int snd_pcm_hw_param_set_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
_fail:
if (mode == SND_TRY)
*params = save;
if (err < 0)
dump_hw_params(params, "set_max", var, *val, err);
return err;
}
@ -625,6 +665,8 @@ int snd_pcm_hw_param_set_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
_fail:
if (mode == SND_TRY)
*params = save;
if (err < 0)
dump_hw_params(params, "set_minmax", var, *min, err);
return err;
}
@ -713,6 +755,8 @@ int snd_pcm_hw_param_set(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
_fail:
if (mode == SND_TRY)
*params = save;
if (err < 0)
dump_hw_params(params, "set", var, val, err);
return err;
}
@ -807,8 +851,12 @@ int snd_pcm_hw_param_set_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
err = snd_pcm_hw_param_set_min(pcm, params, SND_CHANGE, var, &min, &mindir);
i = hw_param_interval(params, var);
if (!snd_interval_empty(i) && snd_interval_single(i))
return snd_pcm_hw_param_get_min(params, var, val, dir);
if (!snd_interval_empty(i) && snd_interval_single(i)) {
err = snd_pcm_hw_param_get_min(params, var, val, dir);
if (err < 0)
dump_hw_params(params, "set_near", var, *val, err);
return err;
}
if (err >= 0) {
snd_pcm_hw_params_t params1;
@ -827,8 +875,10 @@ int snd_pcm_hw_param_set_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
} else {
*params = save;
err = snd_pcm_hw_param_set_max(pcm, params, SND_CHANGE, var, &max, &maxdir);
if (err < 0)
if (err < 0) {
dump_hw_params(params, "set_near", var, *val, err);
return err;
}
last = 1;
}
_end:
@ -836,6 +886,8 @@ int snd_pcm_hw_param_set_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir);
else
err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir);
if (err < 0)
dump_hw_params(params, "set_near", var, *val, err);
return err;
}