summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/cava/astal-cava.h15
-rw-r--r--lib/cava/cava.c77
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);
}