diff options
Diffstat (limited to '')
-rw-r--r-- | src/output/roar_output_plugin.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/output/roar_output_plugin.c b/src/output/roar_output_plugin.c index f9d44a3d8..059f83b71 100644 --- a/src/output/roar_output_plugin.c +++ b/src/output/roar_output_plugin.c @@ -30,16 +30,65 @@ #include <string.h> #include <stdint.h> +#include <roaraudio.h> #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "roaraudio" +typedef struct roar +{ + roar_vs_t * vss; + int err; + char *host; + char *name; + int role; + struct roar_connection con; + struct roar_audio_info info; + GMutex *lock; + volatile bool alive; +} roar_t; + static inline GQuark roar_output_quark(void) { return g_quark_from_static_string("roar_output"); } +int +roar_output_get_volume(struct roar *roar) +{ + g_mutex_lock(roar->lock); + if (roar->vss && roar->alive) { + float l, r; + int error; + roar_vs_volume_get(roar->vss, &l, &r, &error); + g_mutex_unlock(roar->lock); + return (l + r) * 50; + } else { + g_mutex_unlock(roar->lock); + return 0; + } +} + +bool +roar_output_set_volume(struct roar *roar, unsigned volume) +{ + g_mutex_lock(roar->lock); + if (roar->vss && roar->alive) { + assert(volume <= 100); + + int error; + float level = volume / 100.0; + + roar_vs_volume_mono(roar->vss, level, &error); + g_mutex_unlock(roar->lock); + return true; + } else { + g_mutex_unlock(roar->lock); + return false; + } +} + static void roar_configure(struct roar * self, const struct config_param *param) { |