From 85bb050ab758dde97f83d8475f687d2cf64d59da Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Fri, 6 Jan 2023 21:26:47 +0100 Subject: [PATCH 1/4] Plugins (alsa): Open device "default" rather than "hw:0,0" (cherry picked from commit 7a6f4481abad14aa8a9f4b53ae1245dca235f1c6) --- libvisual-plugins/plugins/input/alsa/input_alsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libvisual-plugins/plugins/input/alsa/input_alsa.c b/libvisual-plugins/plugins/input/alsa/input_alsa.c index 6557b97ae..3b3e31696 100644 --- a/libvisual-plugins/plugins/input/alsa/input_alsa.c +++ b/libvisual-plugins/plugins/input/alsa/input_alsa.c @@ -50,7 +50,7 @@ static int inp_alsa_init (VisPluginData *plugin); static void inp_alsa_cleanup (VisPluginData *plugin); static int inp_alsa_upload (VisPluginData *plugin, VisAudio *audio); -static const char *inp_alsa_var_cdevice = "hw:0,0"; +static const char *inp_alsa_var_cdevice = "default"; static const int inp_alsa_var_samplerate = 44100; static const int inp_alsa_var_channels = 2; From b5c4c8632cb2b9a1f4e1b73b260c2b6edc79a8be Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Sat, 7 Jan 2023 23:16:16 +0100 Subject: [PATCH 2/4] Plugins (alsa): Clarify that snd_pcm_readi is thinking in frames With 2 channels and 24 bit (3 byte) per sample per channel, each frame consists of 6 bytes. Related: https://www.alsa-project.org/wiki/FramesPeriods (cherry picked from commit c811683160e41fde73a0667a420eef63a2c83f20) --- libvisual-plugins/plugins/input/alsa/input_alsa.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libvisual-plugins/plugins/input/alsa/input_alsa.c b/libvisual-plugins/plugins/input/alsa/input_alsa.c index 3b3e31696..9fe3a93df 100644 --- a/libvisual-plugins/plugins/input/alsa/input_alsa.c +++ b/libvisual-plugins/plugins/input/alsa/input_alsa.c @@ -206,10 +206,11 @@ int inp_alsa_upload (VisPluginData *plugin, VisAudio *audio) alsaPrivate *priv = visual_plugin_get_private (plugin); int16_t data[PCM_BUF_SIZE]; - int rcnt; + const snd_pcm_uframes_t frames_wanted = sizeof(data) / sizeof(data[0]) / inp_alsa_var_channels; + snd_pcm_sframes_t rcnt; do { - rcnt = snd_pcm_readi(priv->chandle, data, PCM_BUF_SIZE / 2); + rcnt = snd_pcm_readi(priv->chandle, data, frames_wanted); if (rcnt > 0) { VisBuffer *buffer; From 66fe06ad3a9e1c0ef21618e47b12411f750947d3 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Sat, 7 Jan 2023 23:43:56 +0100 Subject: [PATCH 3/4] Plugins (alsa): Clarify upload buffer size math (cherry picked from commit d3fcd4ba70440ef1bc2190b0f8e4bf6d861d668b) --- libvisual-plugins/plugins/input/alsa/input_alsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libvisual-plugins/plugins/input/alsa/input_alsa.c b/libvisual-plugins/plugins/input/alsa/input_alsa.c index 9fe3a93df..e524792ee 100644 --- a/libvisual-plugins/plugins/input/alsa/input_alsa.c +++ b/libvisual-plugins/plugins/input/alsa/input_alsa.c @@ -215,7 +215,7 @@ int inp_alsa_upload (VisPluginData *plugin, VisAudio *audio) if (rcnt > 0) { VisBuffer *buffer; - buffer = visual_buffer_new_wrap_data (data, rcnt*2*sizeof(int16_t), FALSE); + buffer = visual_buffer_new_wrap_data (data, rcnt * sizeof(data[0]) * inp_alsa_var_channels, FALSE); visual_audio_input (audio, buffer, VISUAL_AUDIO_SAMPLE_RATE_44100, VISUAL_AUDIO_SAMPLE_FORMAT_S16, VISUAL_AUDIO_SAMPLE_CHANNEL_STEREO); From 85c9e0f0c2de2c2fd5055bc53016feb766c14e26 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Sat, 7 Jan 2023 23:30:25 +0100 Subject: [PATCH 4/4] Plugins (alsa): Reduce latency (cherry picked from commit 934b9c3ef3f0dea431ff23ce4eca87917f2843a3) --- libvisual-plugins/plugins/input/alsa/CMakeLists.txt | 2 +- libvisual-plugins/plugins/input/alsa/input_alsa.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libvisual-plugins/plugins/input/alsa/CMakeLists.txt b/libvisual-plugins/plugins/input/alsa/CMakeLists.txt index 446e9200a..b796ed52b 100644 --- a/libvisual-plugins/plugins/input/alsa/CMakeLists.txt +++ b/libvisual-plugins/plugins/input/alsa/CMakeLists.txt @@ -1,4 +1,4 @@ LV_BUILD_INPUT_PLUGIN(alsa SOURCES input_alsa.c - LINK_LIBS ALSA::ALSA + LINK_LIBS ALSA::ALSA m ) diff --git a/libvisual-plugins/plugins/input/alsa/input_alsa.c b/libvisual-plugins/plugins/input/alsa/input_alsa.c index e524792ee..ab1be6698 100644 --- a/libvisual-plugins/plugins/input/alsa/input_alsa.c +++ b/libvisual-plugins/plugins/input/alsa/input_alsa.c @@ -25,6 +25,8 @@ #include "config.h" #include "gettext.h" +#include + #include #include @@ -52,6 +54,7 @@ static int inp_alsa_upload (VisPluginData *plugin, VisAudio *audio); static const char *inp_alsa_var_cdevice = "default"; static const int inp_alsa_var_samplerate = 44100; +static const int inp_alsa_var_frames_target = 256; static const int inp_alsa_var_channels = 2; const VisPluginInfo *get_plugin_info (void) @@ -154,16 +157,14 @@ int inp_alsa_init (VisPluginData *plugin) return FALSE; } - /* Setup a large buffer */ - - tmp = 1000000; + tmp = (int)ceil((1000.0 * 1000.0 * inp_alsa_var_frames_target) / inp_alsa_var_samplerate); // in micro seconds if (snd_pcm_hw_params_set_period_time_near(priv->chandle, hwparams, &tmp, &dir) < 0){ visual_log(VISUAL_LOG_ERROR, "Error setting period time"); snd_pcm_hw_params_free(hwparams); return FALSE; } - tmp = 1000000*4; + tmp = (int)ceil((1000.0 * 1000.0 * inp_alsa_var_frames_target) / inp_alsa_var_samplerate); // in micro seconds if (snd_pcm_hw_params_set_buffer_time_near(priv->chandle, hwparams, &tmp, &dir) < 0){ visual_log(VISUAL_LOG_ERROR, "Error setting buffer time"); snd_pcm_hw_params_free(hwparams);