summaryrefslogtreecommitdiffstats
path: root/ahl-binding/interrupt.cpp
diff options
context:
space:
mode:
authorLoïc Collignon <loic.collignon@iot.bzh>2018-11-15 15:45:30 +0100
committerLoïc Collignon <loic.collignon@iot.bzh>2018-12-13 12:03:13 +0100
commit22c3fc2ae2ba2125bc3af55ab8e6de4bc4102ac6 (patch)
treef64b581582c900e3bb5f7ec05285e712dae21292 /ahl-binding/interrupt.cpp
parent204b92c360102c767f43e1a758e985adb6704512 (diff)
Fix issues with session and policies
When a policy does a 'ramp-down' on an audio role, it never does the 'ramp-up' when closing the role that triggered the policy. Also, session handling was very buggy and had to be reworked to allow the policy to do its job. Bug: SPEC-1949 Bug: SPEC-1950 Change-Id: I668044201c9addbc185ea953c6e3239abfda91c5 Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
Diffstat (limited to 'ahl-binding/interrupt.cpp')
-rw-r--r--ahl-binding/interrupt.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/ahl-binding/interrupt.cpp b/ahl-binding/interrupt.cpp
index 9c247b3..5bf0b79 100644
--- a/ahl-binding/interrupt.cpp
+++ b/ahl-binding/interrupt.cpp
@@ -1,4 +1,7 @@
+#include <json-c/json.h>
+#include "ahl-binding.hpp"
#include "interrupt.hpp"
+#include "role.hpp"
interrupt_t::interrupt_t(json_object* o)
{
@@ -36,3 +39,113 @@ void interrupt_t::args(json_object* v)
{
args_ = v;
}
+
+int interrupt_t::apply(afb_req_t req, const role_t& role)
+{
+ /*if (type_ == "mute")
+ {
+ }
+ else if (type_ == "continue")
+ {
+ }
+ else if (type_ == "cancel")
+ {
+ }
+ else */if (type_ == "ramp")
+ {
+ for(const auto& r: ahl_binding_t::instance().roles())
+ {
+ if (r.opened() && role.priority() > r.priority())
+ {
+ // { "ramp" : { "uid" : "ramp-slow", "volume" : 30 } }
+ json_object* arg = json_object_new_object();
+ json_object_object_add(arg, "ramp", args_);
+ json_object_get(args_);
+ json_object* result = nullptr;
+
+ AFB_API_DEBUG(ahl_binding_t::instance().handle(),
+ "Call '%s'/'%s' '%s'",
+ r.hal().c_str(), r.stream().c_str(), json_object_to_json_string(arg));
+
+ if(afb_api_call_sync(ahl_binding_t::instance().handle(), r.hal().c_str(), r.stream().c_str(), arg, &result, nullptr, nullptr))
+ {
+ afb_req_fail(req, "Failed to call 'ramp' action on stream", nullptr);
+ return -1;
+ }
+ json_object* jvolold = nullptr;
+ if (json_object_object_get_ex(result, "volold", &jvolold))
+ {
+ applied_on_.push_back(std::make_tuple<std::string, int>(r.uid(), json_object_get_int(jvolold)));
+ AFB_API_DEBUG(ahl_binding_t::instance().handle(),
+ "POLICY: Applying a ramp to '%s' stream because '%s' is opened and have higher priority!",
+ r.stream().c_str(), role.stream().c_str());
+ }
+ }
+ }
+ return 0;
+ }
+ else
+ {
+ afb_req_fail(req, "Unkown interrupt uid!", nullptr);
+ return -1;
+ }
+}
+
+void interrupt_t::clear()
+{
+ for (const std::tuple<std::string, int>& state : applied_on_)
+ {
+ std::string role;
+ int vol;
+ std::tie(role, vol) = state;
+ /*if (type_ == "mute")
+ {
+ }
+ else if (type_ == "continue")
+ {
+ }
+ else if (type_ == "cancel")
+ {
+ }
+ else */if (type_ == "ramp")
+ {
+ for(const auto& r: ahl_binding_t::instance().roles())
+ {
+ if (r.uid() == role)
+ {
+ // { "ramp" : { "uid" : "ramp-slow", "volume" : 30 } }
+ // Create an fake-interrupt, with the old volume
+ json_object* interrupt = json_tokener_parse(json_object_to_json_string(args_));
+ json_object_object_add(interrupt, "volume", json_object_new_int(vol)); // Replace the volume
+ /*
+ json_object* volume = nullptr;
+ if (json_object_object_get_ex(interrupt, "volume", &volume))
+ {
+ json_object_set_int(volume, vol);
+ }
+ */
+
+ json_object* arg = json_object_new_object();
+ json_object_object_add(arg, "ramp", interrupt);
+ json_object* result = nullptr;
+
+ AFB_API_DEBUG(ahl_binding_t::instance().handle(),
+ "Call '%s'/'%s' '%s",
+ r.hal().c_str(), r.stream().c_str(), json_object_to_json_string(arg));
+
+ if(afb_api_call_sync(ahl_binding_t::instance().handle(), r.hal().c_str(), r.stream().c_str(), arg, &result, nullptr, nullptr))
+ {
+ AFB_API_ERROR(ahl_binding_t::instance().handle(),
+ "Failed to call 'ramp' action on '%s'", role.c_str());
+ }
+ else
+ {
+ AFB_API_DEBUG(ahl_binding_t::instance().handle(),
+ "Called 'ramp' action on '%s'", role.c_str());
+ }
+ }
+ }
+ }
+ }
+ applied_on_.clear();
+}