summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ahl-binding/ahl-api.cpp9
-rw-r--r--ahl-binding/ahl-api.hpp1
-rw-r--r--ahl-binding/ahl-binding.cpp44
-rw-r--r--ahl-binding/ahl-binding.hpp4
4 files changed, 56 insertions, 2 deletions
diff --git a/ahl-binding/ahl-api.cpp b/ahl-binding/ahl-api.cpp
index c5ade37..7ab3add 100644
--- a/ahl-binding/ahl-api.cpp
+++ b/ahl-binding/ahl-api.cpp
@@ -88,6 +88,15 @@ void ahl_api_get_roles(afb_req_t req)
}
/**
+ * @brief Callback invoked when clients call the verb 'activerole'.
+ * @param[in] req Request to handle.
+ */
+void ahl_api_activerole(afb_req_t req)
+{
+ ahl_binding_t::instance().activerole(req);
+}
+
+/**
* @brief Callback invoked when clients call the verb 'subscribe'.
* @param[in] req Request to handle.
*/
diff --git a/ahl-binding/ahl-api.hpp b/ahl-binding/ahl-api.hpp
index fed48ba..7561ab4 100644
--- a/ahl-binding/ahl-api.hpp
+++ b/ahl-binding/ahl-api.hpp
@@ -25,6 +25,7 @@ int ahl_api_init(afb_api_t);
void ahl_api_on_event(afb_api_t, const char* e, struct json_object* o);
int ahl_api_config_roles(afb_api_t, CtlSectionT*, json_object* o);
void ahl_api_get_roles(afb_req_t req);
+void ahl_api_activerole(afb_req_t req);
void ahl_api_subscribe(afb_req_t req);
void ahl_api_unsubscribe(afb_req_t req);
void ahl_api_role(afb_req_t req); \ No newline at end of file
diff --git a/ahl-binding/ahl-binding.cpp b/ahl-binding/ahl-binding.cpp
index af1ae79..84ba60a 100644
--- a/ahl-binding/ahl-binding.cpp
+++ b/ahl-binding/ahl-binding.cpp
@@ -46,6 +46,18 @@ void ahl_binding_t::load_static_verbs()
if (afb_api_add_verb(
handle_,
+ "activerole",
+ "Controls the currently active role",
+ ahl_api_activerole,
+ nullptr,
+ nullptr,
+ AFB_SESSION_NONE_X2, 0))
+ {
+ throw std::runtime_error("Failed to add 'activerole' verb to the API.");
+ }
+
+ if (afb_api_add_verb(
+ handle_,
"subscribe",
"Subscribe to \"volume_changed\" event",
ahl_api_subscribe,
@@ -250,6 +262,18 @@ int ahl_binding_t::create_api_verb(role_t* r)
return 0;
}
+role_t* ahl_binding_t::get_active_role()
+{
+ role_t* active = nullptr;
+ for(auto& r : roles_)
+ {
+ if (r.opened() && (active == nullptr || r.priority() > active->priority()))
+ active = &r;
+ }
+
+ return active;
+}
+
/**
* @brief Get the singleton instance.
* @return The unique instance.
@@ -352,12 +376,19 @@ void ahl_binding_t::event(std::string name, json_object* arg)
* @param[in] volume New volume.
* @return Zero on success, non-zero otherwise.
*/
-int ahl_binding_t::emit_volume_changed(const std::string& role, int volume) const
+int ahl_binding_t::emit_volume_changed(const std::string& role, int volume)
{
json_object* data = json_object_new_object();
json_object_object_add(data, "role", json_object_new_string(role.c_str()));
json_object_object_add(data, "volume", json_object_new_int(volume));
+ bool active = false;
+ role_t* activerole = get_active_role();
+ if (activerole && activerole->uid() == role)
+ active = true;
+
+ json_object_object_add(data, "active", json_object_new_boolean(active));
+
return afb_event_push(volume_changed_, data);
}
@@ -416,6 +447,17 @@ void ahl_binding_t::get_roles(afb_req_t req) const
}
/**
+ * @brief Controls the currently active role.
+ * @param[in] req Request to answer.
+ */
+void ahl_binding_t::activerole(afb_req_t req)
+{
+ role_t* role = get_active_role();
+ if (!role) afb_req_fail(req, "No active role!", nullptr);
+ else role->invoke(req);
+}
+
+/**
* @brief Subscribe to events.
* @param[in] req Request to answer.
*/
diff --git a/ahl-binding/ahl-binding.hpp b/ahl-binding/ahl-binding.hpp
index 881d906..47c343a 100644
--- a/ahl-binding/ahl-binding.hpp
+++ b/ahl-binding/ahl-binding.hpp
@@ -51,6 +51,7 @@ private:
int update_streams();
void update_stream(std::string hal, std::string stream, std::string deviceuri);
int create_api_verb(role_t* r);
+ role_t* get_active_role();
public:
static ahl_binding_t& instance();
@@ -60,10 +61,11 @@ public:
int preinit(afb_api_t handle);
int init();
void event(std::string name, json_object* arg);
- int emit_volume_changed(const std::string& role, int volume) const;
+ int emit_volume_changed(const std::string& role, int volume);
int parse_roles_config(json_object* o);
void get_roles(afb_req_t req) const;
+ void activerole(afb_req_t req);
void subscribe(afb_req_t req) const;
void unsubscribe(afb_req_t req) const;
};