#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
_fail:
if (mode == SND_TRY)
*params = save;
+ if (err < 0)
+ dump_hw_params(params, "set_min", var, *val, err);
return err;
}
_fail:
if (mode == SND_TRY)
*params = save;
+ if (err < 0)
+ dump_hw_params(params, "set_max", var, *val, err);
return err;
}
_fail:
if (mode == SND_TRY)
*params = save;
+ if (err < 0)
+ dump_hw_params(params, "set_minmax", var, *min, err);
return err;
}
_fail:
if (mode == SND_TRY)
*params = save;
+ if (err < 0)
+ dump_hw_params(params, "set", var, val, err);
return err;
}
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;
} 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:
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;
}