diff options
author | kotontrion <[email protected]> | 2024-10-09 19:13:29 +0200 |
---|---|---|
committer | kotontrion <[email protected]> | 2024-10-09 19:13:29 +0200 |
commit | f36feb00bcde39e9edded0f1df410eee0d3a85cb (patch) | |
tree | 290d5cccf9e28cfe26346d33883a3fbfae2cb845 | |
parent | 7f7d05362dae3f2262560b9e7303ae8eb9a2ad78 (diff) |
cava: add audio selection
-rw-r--r-- | lib/cava/astal-cava.h | 15 | ||||
-rw-r--r-- | lib/cava/cava.c | 77 |
2 files changed, 87 insertions, 5 deletions
diff --git a/lib/cava/astal-cava.h b/lib/cava/astal-cava.h index f2bc464..2cb3b3f 100644 --- a/lib/cava/astal-cava.h +++ b/lib/cava/astal-cava.h @@ -5,6 +5,21 @@ G_BEGIN_DECLS +#define ASTAL_CAVA_TYPE_INPUT (astal_cava_input_get_type()) + +typedef enum { + ASTAL_CAVA_INPUT_FIFO, + ASTAL_CAVA_INPUT_PORTAUDIO, + ASTAL_CAVA_INPUT_PIPEWIRE, + ASTAL_CAVA_INPUT_ALSA, + ASTAL_CAVA_INPUT_PULSE, + ASTAL_CAVA_INPUT_SNDIO, + ASTAL_CAVA_INPUT_OSS, + ASTAL_CAVA_INPUT_JACK, + ASTAL_CAVA_INPUT_SHMEM, + ASTAL_CAVA_INPUT_WINSCAP, +} AstalCavaInput; + #define ASTAL_CAVA_TYPE_CAVA (astal_cava_cava_get_type()) G_DECLARE_FINAL_TYPE(AstalCavaCava, astal_cava_cava, ASTAL_CAVA, CAVA, GObject) diff --git a/lib/cava/cava.c b/lib/cava/cava.c index 2298229..30d7bc7 100644 --- a/lib/cava/cava.c +++ b/lib/cava/cava.c @@ -20,6 +20,8 @@ struct _AstalCavaCava { gboolean monstercat; gdouble noise_reduction; gint framerate; + AstalCavaInput input; + gchar* audio_source; GArray* values; }; @@ -36,6 +38,16 @@ typedef struct { } AstalCavaCavaPrivate; +G_DEFINE_ENUM_TYPE(AstalCavaInput, astal_cava_input, + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_FIFO, "fifo"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_PORTAUDIO, "portaudio"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_PIPEWIRE, "pipewire"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_ALSA, "alsa"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_PULSE, "pulse"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_SNDIO, "sndio"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_SHMEM, "shmem"), + G_DEFINE_ENUM_VALUE(ASTAL_CAVA_INPUT_WINSCAP, "winscap")); + G_DEFINE_TYPE_WITH_PRIVATE(AstalCavaCava, astal_cava_cava, G_TYPE_OBJECT) typedef enum { @@ -47,6 +59,8 @@ typedef enum { ASTAL_CAVA_CAVA_PROP_MONSTERCAT, ASTAL_CAVA_CAVA_PROP_NOISE, ASTAL_CAVA_CAVA_PROP_FRAMERATE, + ASTAL_CAVA_CAVA_PROP_INPUT, + ASTAL_CAVA_CAVA_PROP_SOURCE, ASTAL_CAVA_CAVA_N_PROPERTIES } AstalCavaProperties; @@ -99,6 +113,13 @@ static void astal_cava_cava_set_property(GObject* object, guint property_id, con case ASTAL_CAVA_CAVA_PROP_FRAMERATE: self->framerate = g_value_get_int(value); break; + case ASTAL_CAVA_CAVA_PROP_INPUT: + self->input = g_value_get_enum(value); + break; + case ASTAL_CAVA_CAVA_PROP_SOURCE: + g_free(self->audio_source); + self->audio_source = g_value_dup_string(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -134,6 +155,12 @@ static void astal_cava_cava_get_property(GObject* object, guint property_id, GVa case ASTAL_CAVA_CAVA_PROP_FRAMERATE: g_value_set_int(value, self->framerate); break; + case ASTAL_CAVA_CAVA_PROP_INPUT: + g_value_set_enum(value, self->input); + break; + case ASTAL_CAVA_CAVA_PROP_SOURCE: + g_value_set_string(value, self->audio_source); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -171,16 +198,13 @@ static void astal_cava_cava_constructed(GObject* object) { .autosens = self->autosens, .sens = self->sens, .stereo = self->stereo, - .channels = self->stereo + 1, .monstercat = self->monstercat, .noise_reduction = self->noise_reduction, .framerate = self->framerate, - - //TODO: make these configurable - .audio_source = strdup("auto"), - .input = INPUT_PIPEWIRE, + .input = (enum input_method) self->input, //maybe make some of them configurable + .channels = 2, .lower_cut_off = 50, .upper_cut_off = 10000, .mono_opt = AVERAGE, @@ -230,6 +254,43 @@ static void astal_cava_cava_constructed(GObject* object) { .frame_delim = '\n', }; + if(strcmp(self->audio_source, "auto") == 0) { + switch (priv->cfg.input) { + case INPUT_ALSA: + priv->cfg.audio_source = strdup("hw:Loopback,1"); + break; + case INPUT_FIFO: + priv->cfg.audio_source = strdup("/tmp/mpd.fifo"); + break; + case INPUT_PULSE: + priv->cfg.audio_source = strdup("auto"); + break; + case INPUT_PIPEWIRE: + priv->cfg.audio_source = strdup("auto"); + break; + case INPUT_SNDIO: + priv->cfg.audio_source = strdup("default"); + break; + case INPUT_OSS: + priv->cfg.audio_source = strdup("/dev/dsp"); + break; + case INPUT_JACK: + priv->cfg.audio_source = strdup("default"); + break; + case INPUT_SHMEM: + priv->cfg.audio_source = strdup("/squeezelite-00:00:00:00:00:00"); + break; + case INPUT_PORTAUDIO: + priv->cfg.audio_source = strdup("auto"); + break; + default: + g_critical("unsupported audio source"); + } + } + else { + priv->cfg.audio_source = strdup(self->audio_source); + } + priv->audio_data = (struct audio_data) { .cava_in = calloc(BUFFER_SIZE * priv->cfg.channels * 8, sizeof(gdouble)), .input_buffer_size = BUFFER_SIZE * priv->cfg.channels, @@ -327,6 +388,12 @@ static void astal_cava_cava_class_init(AstalCavaCavaClass* class) { astal_cava_cava_properties[ASTAL_CAVA_CAVA_PROP_FRAMERATE] = g_param_spec_int("framerate", "framerate", "framerate", 1, G_MAXINT, 60, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + astal_cava_cava_properties[ASTAL_CAVA_CAVA_PROP_INPUT] = + g_param_spec_enum("input", "input", "input", ASTAL_CAVA_TYPE_INPUT, ASTAL_CAVA_INPUT_PIPEWIRE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + astal_cava_cava_properties[ASTAL_CAVA_CAVA_PROP_SOURCE] = + g_param_spec_string("source", "source", "source", "auto", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties(object_class, ASTAL_CAVA_CAVA_N_PROPERTIES, astal_cava_cava_properties); } |