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 6557b97ae..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 @@ -50,8 +52,9 @@ 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_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); @@ -206,15 +207,16 @@ 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; - 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);