1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "media/base/keyboard_event_counter.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/atomicops.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/logging.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace media {
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)KeyboardEventCounter::KeyboardEventCounter() : total_key_presses_(0) {}
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)KeyboardEventCounter::~KeyboardEventCounter() {}
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void KeyboardEventCounter::Reset() {
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pressed_keys_.clear();
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::subtle::NoBarrier_Store(
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<base::subtle::AtomicWord*>(&total_key_presses_), 0);
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void KeyboardEventCounter::OnKeyboardEvent(ui::EventType event,
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                           ui::KeyboardCode key_code) {
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Updates the pressed keys and the total count of key presses.
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (event == ui::ET_KEY_PRESSED) {
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (pressed_keys_.find(key_code) != pressed_keys_.end())
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    pressed_keys_.insert(key_code);
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::subtle::NoBarrier_AtomicIncrement(
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        reinterpret_cast<base::subtle::AtomicWord*>(&total_key_presses_), 1);
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  } else {
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK_EQ(ui::ET_KEY_RELEASED, event);
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    pressed_keys_.erase(key_code);
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)size_t KeyboardEventCounter::GetKeyPressCount() const {
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return base::subtle::NoBarrier_Load(
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      reinterpret_cast<const base::subtle::AtomicWord*>(&total_key_presses_));
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace media
43