audio_directive_list.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// Copyright 2014 The Chromium Authors. All rights reserved.
2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// Use of this source code is governed by a BSD-style license that can be
3cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// found in the LICENSE file.
4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "components/copresence/handlers/audio/audio_directive_list.h"
6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
7cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "base/bind.h"
8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "base/logging.h"
9cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "base/memory/scoped_ptr.h"
103aac1f9f308192f3787265830fe86ce8874e7382edisonn@google.com#include "base/time/time.h"
112af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
122af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comnamespace copresence {
13bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
142af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com// Public methods.
15571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
16571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comAudioDirective::AudioDirective() {
172af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com}
182af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
19571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comAudioDirective::AudioDirective(const std::string& op_id, base::Time end_time)
20571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    : op_id(op_id), end_time(end_time) {
2178b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com}
222af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
232af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comAudioDirectiveList::AudioDirectiveList() {
242af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com}
25571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
26571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comAudioDirectiveList::~AudioDirectiveList() {
27571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com}
28571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
29571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comvoid AudioDirectiveList::AddDirective(const std::string& op_id,
30571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                      base::TimeDelta ttl) {
31571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  base::Time end_time = base::Time::Now() + ttl;
32571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
33571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  // In case this op is already in the list, update it instead of adding
34571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  // it again.
35571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  std::vector<AudioDirective>::iterator it = FindDirectiveByOpId(op_id);
36571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  if (it != active_directives_.end()) {
37571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    it->end_time = end_time;
38571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    std::make_heap(active_directives_.begin(),
39571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                   active_directives_.end(),
40571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                   LatestFirstComparator());
41571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    return;
42571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  }
43571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
44571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  active_directives_.push_back(AudioDirective(op_id, end_time));
45571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  std::push_heap(active_directives_.begin(),
46571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                 active_directives_.end(),
47571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                 LatestFirstComparator());
48571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com}
49571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
50571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comvoid AudioDirectiveList::RemoveDirective(const std::string& op_id) {
51571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  std::vector<AudioDirective>::iterator it = FindDirectiveByOpId(op_id);
52571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  if (it != active_directives_.end())
53571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    active_directives_.erase(it);
54571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
55571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  std::make_heap(active_directives_.begin(),
56571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                 active_directives_.end(),
572af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com                 LatestFirstComparator());
582af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com}
592af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com
602af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.comscoped_ptr<AudioDirective> AudioDirectiveList::GetActiveDirective() {
612af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com  // The top is always the instruction that is ending the latest. If that time
622af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com  // has passed, means all our previous instructions have expired too, hence
63571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  // clear the list.
64571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  if (!active_directives_.empty() &&
65571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com      active_directives_.front().end_time < base::Time::Now()) {
66571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    active_directives_.clear();
67571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  }
68571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
69571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  if (active_directives_.empty())
70571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    return make_scoped_ptr<AudioDirective>(NULL);
71571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
72571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  return make_scoped_ptr(new AudioDirective(active_directives_.front()));
73571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com}
74571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
75571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comstd::vector<AudioDirective>::iterator AudioDirectiveList::FindDirectiveByOpId(
76571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const std::string& op_id) {
77571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  for (std::vector<AudioDirective>::iterator it = active_directives_.begin();
78571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com       it != active_directives_.end();
79571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com       ++it) {
80571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    if (it->op_id == op_id)
814ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com      return it;
82571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com  }
83598cf5d3cfc428108cf21ab45d73a995d7e5c2a8edisonn@google.com  return active_directives_.end();
84598cf5d3cfc428108cf21ab45d73a995d7e5c2a8edisonn@google.com}
85571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
86571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com}  // namespace copresence
87571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com