From 1bf6dead10e016f4e33bb8fd0a70baaeaa162454 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 16 Sep 2020 15:14:26 +0200 Subject: [PATCH] alsa: add option to force a samplerate --- spa/include/spa/param/audio/raw.h | 1 + spa/plugins/alsa/alsa-pcm-sink.c | 2 ++ spa/plugins/alsa/alsa-pcm-source.c | 2 ++ spa/plugins/alsa/alsa-pcm.c | 7 +++++++ spa/plugins/alsa/alsa-pcm.h | 1 + 5 files changed, 13 insertions(+) diff --git a/spa/include/spa/param/audio/raw.h b/spa/include/spa/param/audio/raw.h index 18debcce4..849a88c92 100644 --- a/spa/include/spa/param/audio/raw.h +++ b/spa/include/spa/param/audio/raw.h @@ -222,6 +222,7 @@ struct spa_audio_info_raw { #define SPA_KEY_AUDIO_CHANNEL "audio.channel" /**< an audio channel as string, * Ex. "FL" */ #define SPA_KEY_AUDIO_CHANNELS "audio.channels" /**< an audio channel count as int */ +#define SPA_KEY_AUDIO_RATE "audio.rate" /**< an audio sample rate as int */ struct spa_audio_info_dsp { enum spa_audio_format format; /*< format, one of the DSP formats in enum spa_audio_format_dsp */ diff --git a/spa/plugins/alsa/alsa-pcm-sink.c b/spa/plugins/alsa/alsa-pcm-sink.c index 6f0afaf3a..b35becba5 100644 --- a/spa/plugins/alsa/alsa-pcm-sink.c +++ b/spa/plugins/alsa/alsa-pcm-sink.c @@ -763,6 +763,8 @@ impl_init(const struct spa_handle_factory *factory, snprintf(this->props.device, 63, "%s", info->items[i].value); } else if (!strcmp(info->items[i].key, SPA_KEY_AUDIO_CHANNELS)) { this->default_channels = atoi(info->items[i].value); + } else if (!strcmp(info->items[i].key, SPA_KEY_AUDIO_RATE)) { + this->default_rate = atoi(info->items[i].value); } } diff --git a/spa/plugins/alsa/alsa-pcm-source.c b/spa/plugins/alsa/alsa-pcm-source.c index 06077f642..0e0bf9b80 100644 --- a/spa/plugins/alsa/alsa-pcm-source.c +++ b/spa/plugins/alsa/alsa-pcm-source.c @@ -782,6 +782,8 @@ impl_init(const struct spa_handle_factory *factory, snprintf(this->props.device, 63, "%s", info->items[i].value); } else if (!strcmp(info->items[i].key, SPA_KEY_AUDIO_CHANNELS)) { this->default_channels = atoi(info->items[i].value); + } else if (!strcmp(info->items[i].key, SPA_KEY_AUDIO_RATE)) { + this->default_rate = atoi(info->items[i].value); } } return 0; diff --git a/spa/plugins/alsa/alsa-pcm.c b/spa/plugins/alsa/alsa-pcm.c index 78c4a3f7a..8c993700b 100644 --- a/spa/plugins/alsa/alsa-pcm.c +++ b/spa/plugins/alsa/alsa-pcm.c @@ -341,6 +341,13 @@ spa_alsa_enum_format(struct state *state, int seq, uint32_t start, uint32_t num, CHECK(snd_pcm_hw_params_get_rate_min(params, &min, &dir), "get_rate_min"); CHECK(snd_pcm_hw_params_get_rate_max(params, &max, &dir), "get_rate_max"); + if (state->default_rate != 0) { + if (min < state->default_rate) + min = state->default_rate; + if (max > state->default_rate) + max = state->default_rate; + } + spa_pod_builder_prop(&b, SPA_FORMAT_AUDIO_rate, 0); spa_pod_builder_push_choice(&b, &f[1], SPA_CHOICE_None, 0); diff --git a/spa/plugins/alsa/alsa-pcm.h b/spa/plugins/alsa/alsa-pcm.h index 6f8499e25..463bb350c 100644 --- a/spa/plugins/alsa/alsa-pcm.h +++ b/spa/plugins/alsa/alsa-pcm.h @@ -104,6 +104,7 @@ struct state { struct spa_audio_info current_format; unsigned int default_channels; + unsigned int default_rate; snd_pcm_uframes_t buffer_frames; snd_pcm_uframes_t period_frames;