summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2018-11-02 18:43:39 +0200
committerJari Vetoniemi <mailroxas@gmail.com>2018-11-02 18:43:39 +0200
commit4433e7159fdf91e30e38321808ab947262067ea1 (patch)
treee43ade00ee3a61a96848669f1de7848f6b0bcb58
parent4e8fc8f9919a427ac776d9b665068d62fc4645e1 (diff)
support formats regardless of getcaps support
some alsa programs wont fallback to anything that would work natively. this sort of sucks since some do, so we may end up doing pointless transcoding.
-rw-r--r--src/pcm.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/pcm.c b/src/pcm.c
index abf94ab..6f0106c 100644
--- a/src/pcm.c
+++ b/src/pcm.c
@@ -706,9 +706,7 @@ snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj)
free(obj);
}
-struct _snd_pcm_format_mask {
- snd_pcm_format_t supported[ARRAY_SIZE(SUPPORTED_FORMATS)];
-};
+struct _snd_pcm_format_mask { bool noop; };
size_t
snd_pcm_format_mask_sizeof(void)
@@ -719,17 +717,17 @@ snd_pcm_format_mask_sizeof(void)
int
snd_pcm_format_mask_test(const snd_pcm_format_mask_t *mask, snd_pcm_format_t val)
{
- for (size_t i = 0; i < ARRAY_SIZE(mask->supported) && mask->supported[i] != SND_PCM_FORMAT_UNKNOWN; ++i) {
- if (mask->supported[i] == val)
+ for (size_t i = 0; i < ARRAY_SIZE(SUPPORTED_FORMATS); ++i) {
+ if (SUPPORTED_FORMATS[i].fmt == val)
return true;
}
+ WARNX("format `0x%x` not supported by yet", val);
return false;
}
void
snd_pcm_hw_params_get_format_mask(snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask)
{
- if (mask) memcpy(mask->supported, params->limits.supported, sizeof(mask->supported));
}
int
@@ -740,16 +738,30 @@ snd_pcm_hw_params_test_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_p
return (snd_pcm_format_mask_test(&mask, val) ? 0 : -1);
}
+static bool
+has_native_support(snd_pcm_hw_params_t *params, snd_pcm_format_t val)
+{
+ for (size_t i = 0; i < ARRAY_SIZE(params->limits.supported) && params->limits.supported[i] != SND_PCM_FORMAT_UNKNOWN; ++i) {
+ if (params->limits.supported[i] == val)
+ return true;
+ }
+ return false;
+}
+
int
snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val)
{
const struct format_info *info;
- if (!(info = format_info_for_format(val)))
+ if (!(info = format_info_for_format(val))) {
+ WARNX("format `0x%x` not supported yet", val);
return -1;
+ }
params->format = val;
WARNX("%s", info->name);
- params->needs_conversion = (snd_pcm_hw_params_test_format(pcm, params, val) != 0);
+
+ if ((params->needs_conversion = !has_native_support(params, val)))
+ WARNX1("format needs to be transcoded!");
const struct sio_par old = params->par;
params->par.bits = info->enc.bits;