// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "message.h" #include #include #include #include #include #include "key_string.h" #include "utils.h" namespace easymedia { void EventHandler::RegisterEventHook(std::shared_ptr flow, EventHook proc) { process_ = proc; event_thread_loop_ = true; event_thread_.reset(new std::thread(process_, flow, std::ref(event_thread_loop_))); } void EventHandler::UnRegisterEventHook() { if (event_thread_) { event_thread_loop_ = false; event_cond_mtx_.lock(); event_cond_mtx_.notify(); event_cond_mtx_.unlock(); event_thread_->join(); event_thread_.reset(nullptr); } } void EventHandler::EventHookWait() { AutoLockMutex _signal_mtx(event_cond_mtx_); event_cond_mtx_.wait(); } void EventHandler::SignalEventHook() { AutoLockMutex _signal_mtx(event_cond_mtx_); event_cond_mtx_.notify(); } MessagePtr EventHandler::GetEventMessage() { AutoLockMutex _rw_mtx(event_queue_mtx_); if (process_) { if (event_msgs_.empty()) { return nullptr; } auto msg = event_msgs_.front(); event_msgs_.erase(event_msgs_.begin()); return msg; } return nullptr; } void EventHandler::CleanRepeatMessage(MessagePtr msg) { for (auto iter = event_msgs_.cbegin(); iter != event_msgs_.cend();) { auto tmp = *iter; auto param = tmp->GetEventParam(); if (param->GetId() == msg->GetEventParam()->GetId()) { iter = event_msgs_.erase(iter); } else { iter++; } } } void EventHandler::InsertMessage(MessagePtr msg, bool front) { if (front) { auto iter = event_msgs_.begin(); iter = event_msgs_.insert(iter, msg); } else { event_msgs_.push_back(msg); } } void EventHandler::NotifyToEventHandler(MessagePtr msg) { bool inser_front = false; AutoLockMutex _rw_mtx(event_queue_mtx_); if (process_) { if (msg->GetType() == MESSAGE_TYPE_UNIQUE) { CleanRepeatMessage(msg); } else if (msg->GetType() == MESSAGE_TYPE_LIFO) { inser_front = true; ; } InsertMessage(msg, inser_front); } } } // namespace easymedia