diff options
author | Loïc Collignon <loic.collignon@iot.bzh> | 2018-11-15 15:45:30 +0100 |
---|---|---|
committer | Loïc Collignon <loic.collignon@iot.bzh> | 2018-12-13 12:03:13 +0100 |
commit | 22c3fc2ae2ba2125bc3af55ab8e6de4bc4102ac6 (patch) | |
tree | f64b581582c900e3bb5f7ec05285e712dae21292 /ahl-binding/interrupt.cpp | |
parent | 204b92c360102c767f43e1a758e985adb6704512 (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.cpp | 113 |
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(); +} |