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