From b579a024db43358ed2cad9e1946560750d3db7dc Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 14 Apr 2005 14:22:13 +0000 Subject: [PATCH] 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. --- src/pcm/pcm_params.c | 58 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index c62d1c2b..3947d196 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -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; } -- 2.47.1