|  | /* | 
|  | *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "modules/audio_processing/typing_detection.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | TypingDetection::TypingDetection() | 
|  | : time_active_(0), | 
|  | time_since_last_typing_(0), | 
|  | penalty_counter_(0), | 
|  | counter_since_last_detection_update_(0), | 
|  | detection_to_report_(false), | 
|  | new_detection_to_report_(false), | 
|  | time_window_(10), | 
|  | cost_per_typing_(100), | 
|  | reporting_threshold_(300), | 
|  | penalty_decay_(1), | 
|  | type_event_delay_(2), | 
|  | report_detection_update_period_(1) {} | 
|  |  | 
|  | TypingDetection::~TypingDetection() {} | 
|  |  | 
|  | bool TypingDetection::Process(bool key_pressed, bool vad_activity) { | 
|  | if (vad_activity) | 
|  | time_active_++; | 
|  | else | 
|  | time_active_ = 0; | 
|  |  | 
|  | // Keep track if time since last typing event | 
|  | if (key_pressed) | 
|  | time_since_last_typing_ = 0; | 
|  | else | 
|  | ++time_since_last_typing_; | 
|  |  | 
|  | if (time_since_last_typing_ < type_event_delay_ && vad_activity && | 
|  | time_active_ < time_window_) { | 
|  | penalty_counter_ += cost_per_typing_; | 
|  | if (penalty_counter_ > reporting_threshold_) | 
|  | new_detection_to_report_ = true; | 
|  | } | 
|  |  | 
|  | if (penalty_counter_ > 0) | 
|  | penalty_counter_ -= penalty_decay_; | 
|  |  | 
|  | if (++counter_since_last_detection_update_ == | 
|  | report_detection_update_period_) { | 
|  | detection_to_report_ = new_detection_to_report_; | 
|  | new_detection_to_report_ = false; | 
|  | counter_since_last_detection_update_ = 0; | 
|  | } | 
|  |  | 
|  | return detection_to_report_; | 
|  | } | 
|  |  | 
|  | int TypingDetection::TimeSinceLastDetectionInSeconds() { | 
|  | // Round to whole seconds. | 
|  | return (time_since_last_typing_ + 50) / 100; | 
|  | } | 
|  |  | 
|  | void TypingDetection::SetParameters(int time_window, | 
|  | int cost_per_typing, | 
|  | int reporting_threshold, | 
|  | int penalty_decay, | 
|  | int type_event_delay, | 
|  | int report_detection_update_period) { | 
|  | if (time_window) | 
|  | time_window_ = time_window; | 
|  |  | 
|  | if (cost_per_typing) | 
|  | cost_per_typing_ = cost_per_typing; | 
|  |  | 
|  | if (reporting_threshold) | 
|  | reporting_threshold_ = reporting_threshold; | 
|  |  | 
|  | if (penalty_decay) | 
|  | penalty_decay_ = penalty_decay; | 
|  |  | 
|  | if (type_event_delay) | 
|  | type_event_delay_ = type_event_delay; | 
|  |  | 
|  | if (report_detection_update_period) | 
|  | report_detection_update_period_ = report_detection_update_period; | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |