@@ -17,7 +17,6 @@ namespace PokemonAutomation{
1717void VideoOverlaySession::add_listener (ContentListener& listener){
1818 WriteSpinLock lg (m_lock);
1919 m_content_listeners.insert (&listener);
20- listener.on_overlay_update_stats (&m_stats_order);
2120}
2221void VideoOverlaySession::remove_listener (ContentListener& listener){
2322 WriteSpinLock lg (m_lock);
@@ -27,13 +26,17 @@ void VideoOverlaySession::remove_listener(ContentListener& listener){
2726
2827
2928VideoOverlaySession::~VideoOverlaySession (){
30- ReadSpinLock lg (m_lock);
31- for (ContentListener* listener : m_content_listeners){
32- listener-> on_overlay_update_stats ( nullptr ) ;
29+ {
30+ std::lock_guard<std::mutex> lg (m_stats_lock);
31+ m_stopping = true ;
3332 }
33+ m_stats_cv.notify_all ();
34+ m_stats_updater.join ();
3435}
35- VideoOverlaySession::VideoOverlaySession (VideoOverlayOption& option)
36- : m_option(option)
36+ VideoOverlaySession::VideoOverlaySession (Logger& logger, VideoOverlayOption& option)
37+ : m_logger(logger)
38+ , m_option(option)
39+ , m_stats_updater(&VideoOverlaySession::stats_thread, this )
3740{}
3841
3942
@@ -71,6 +74,25 @@ void VideoOverlaySession::set(const VideoOverlayOption& option){
7174}
7275
7376
77+ void VideoOverlaySession::stats_thread (){
78+ std::unique_lock<std::mutex> lg (m_stats_lock);
79+ while (!m_stopping){
80+ {
81+ std::vector<OverlayStatSnapshot> lines;
82+ ReadSpinLock lg0 (m_lock);
83+ for (const auto & stat : m_stats){
84+ OverlayStatSnapshot snapshot = stat.first ->get_current ();
85+ if (!snapshot.text .empty ()){
86+ lines.emplace_back (std::move (snapshot));
87+ }
88+ }
89+ m_stat_lines = std::move (lines);
90+ }
91+ m_stats_cv.wait_for (lg, std::chrono::milliseconds (100 ));
92+ }
93+ }
94+
95+
7496void VideoOverlaySession::set_enabled_boxes (bool enabled){
7597 m_option.boxes .store (enabled, std::memory_order_relaxed);
7698 ReadSpinLock lg (m_lock, " VideoOverlaySession::set_enabled_boxes()" );
@@ -108,6 +130,9 @@ void VideoOverlaySession::set_enabled_stats(bool enabled){
108130}
109131
110132
133+ //
134+ // Boxes
135+ //
111136
112137void VideoOverlaySession::add_box (const OverlayBox& box){
113138 WriteSpinLock lg (m_lock, " VideoOverlaySession::add_box()" );
@@ -135,7 +160,6 @@ void VideoOverlaySession::push_box_update(){
135160 listener->on_overlay_update_boxes (ptr);
136161 }
137162}
138-
139163std::vector<OverlayBox> VideoOverlaySession::boxes () const {
140164 ReadSpinLock lg (m_lock);
141165 std::vector<OverlayBox> ret;
@@ -145,6 +169,11 @@ std::vector<OverlayBox> VideoOverlaySession::boxes() const{
145169 return ret;
146170}
147171
172+
173+ //
174+ // Texts
175+ //
176+
148177void VideoOverlaySession::add_text (const OverlayText& text){
149178 WriteSpinLock lg (m_lock, " VideoOverlaySession::add_text()" );
150179 m_texts.insert (&text);
@@ -171,7 +200,6 @@ void VideoOverlaySession::push_text_update(){
171200 listener->on_overlay_update_text (ptr);
172201 }
173202}
174-
175203std::vector<OverlayText> VideoOverlaySession::texts () const {
176204 ReadSpinLock lg (m_lock);
177205 std::vector<OverlayText> ret;
@@ -182,6 +210,10 @@ std::vector<OverlayText> VideoOverlaySession::texts() const{
182210}
183211
184212
213+ //
214+ // Images
215+ //
216+
185217void VideoOverlaySession::add_image (const OverlayImage& image){
186218 WriteSpinLock lg (m_lock, " VideoOverlaySession::add_image()" );
187219 m_images.insert (&image);
@@ -208,7 +240,6 @@ void VideoOverlaySession::push_image_update(){
208240 listener->on_overlay_update_images (ptr);
209241 }
210242}
211-
212243std::vector<OverlayImage> VideoOverlaySession::images () const {
213244 ReadSpinLock lg (m_lock);
214245 std::vector<OverlayImage> ret;
@@ -219,6 +250,10 @@ std::vector<OverlayImage> VideoOverlaySession::images() const{
219250}
220251
221252
253+ //
254+ // Log
255+ //
256+
222257void VideoOverlaySession::add_log (std::string message, Color color){
223258 WriteSpinLock lg (m_lock, " VideoOverlaySession::add_log_text()" );
224259 m_log_texts.emplace_front (color, std::move (message));
@@ -229,7 +264,6 @@ void VideoOverlaySession::add_log(std::string message, Color color){
229264
230265 push_log_text_update ();
231266}
232-
233267void VideoOverlaySession::clear_log (){
234268 WriteSpinLock lg (m_lock, " VideoOverlaySession::clear_log_texts()" );
235269 m_log_texts.clear ();
@@ -251,7 +285,6 @@ void VideoOverlaySession::push_log_text_update(){
251285 listener->on_overlay_update_log (ptr);
252286 }
253287}
254-
255288std::vector<OverlayLogLine> VideoOverlaySession::log_texts () const {
256289 ReadSpinLock lg (m_lock);
257290 std::vector<OverlayLogLine> ret;
@@ -262,7 +295,9 @@ std::vector<OverlayLogLine> VideoOverlaySession::log_texts() const{
262295}
263296
264297
265-
298+ //
299+ // Stats
300+ //
266301
267302void VideoOverlaySession::add_stat (OverlayStat& stat){
268303 WriteSpinLock lg (m_lock);
@@ -271,11 +306,6 @@ void VideoOverlaySession::add_stat(OverlayStat& stat){
271306 return ;
272307 }
273308
274- // Remove all stats so they aren't being referenced.
275- for (ContentListener* listener : m_content_listeners){
276- listener->on_overlay_update_stats (nullptr );
277- }
278-
279309 m_stats_order.emplace_back (&stat);
280310 auto list_iter = m_stats_order.end ();
281311 --list_iter;
@@ -285,11 +315,6 @@ void VideoOverlaySession::add_stat(OverlayStat& stat){
285315 m_stats_order.pop_back ();
286316 throw ;
287317 }
288-
289- // Add all the stats back.
290- for (ContentListener* listener : m_content_listeners){
291- listener->on_overlay_update_stats (&m_stats_order);
292- }
293318}
294319void VideoOverlaySession::remove_stat (OverlayStat& stat){
295320 WriteSpinLock lg (m_lock);
@@ -298,20 +323,14 @@ void VideoOverlaySession::remove_stat(OverlayStat& stat){
298323 return ;
299324 }
300325
301- // Remove all stats so they aren't being referenced.
302- for (ContentListener* listener : m_content_listeners){
303- listener->on_overlay_update_stats (nullptr );
304- }
305-
306326 m_stats_order.erase (iter->second );
307327 m_stats.erase (iter);
308-
309- // Add all the stats back.
310- for (ContentListener* listener : m_content_listeners){
311- listener->on_overlay_update_stats (&m_stats_order);
312- }
313328}
314329
330+ std::vector<OverlayStatSnapshot> VideoOverlaySession::stats () const {
331+ ReadSpinLock lg (m_lock);
332+ return m_stat_lines;
333+ }
315334
316335
317336
0 commit comments