diff options
Diffstat (limited to 'chromium/media/audio/sounds/sounds_manager.cc')
-rw-r--r-- | chromium/media/audio/sounds/sounds_manager.cc | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/chromium/media/audio/sounds/sounds_manager.cc b/chromium/media/audio/sounds/sounds_manager.cc index 72a7a3b15c1..17f0dd87436 100644 --- a/chromium/media/audio/sounds/sounds_manager.cc +++ b/chromium/media/audio/sounds/sounds_manager.cc @@ -29,9 +29,12 @@ class SoundsManagerImpl : public SoundsManager { // SoundsManager implementation: bool Initialize(SoundKey key, const base::StringPiece& data) override; bool Play(SoundKey key) override; + bool Stop(SoundKey key) override; base::TimeDelta GetDuration(SoundKey key) override; private: + linked_ptr<AudioStreamHandler> GetHandler(SoundKey key); + base::hash_map<SoundKey, linked_ptr<AudioStreamHandler> > handlers_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; @@ -46,36 +49,56 @@ SoundsManagerImpl::~SoundsManagerImpl() { DCHECK(CalledOnValidThread()); } bool SoundsManagerImpl::Initialize(SoundKey key, const base::StringPiece& data) { - if (handlers_.find(key) != handlers_.end() && handlers_[key]->IsInitialized()) + linked_ptr<AudioStreamHandler> current_handler = GetHandler(key); + if (current_handler.get() && current_handler->IsInitialized()) return true; - linked_ptr<AudioStreamHandler> handler(new AudioStreamHandler(data)); - if (!handler->IsInitialized()) { + linked_ptr<AudioStreamHandler> new_handler(new AudioStreamHandler(data)); + if (!new_handler->IsInitialized()) { LOG(WARNING) << "Can't initialize AudioStreamHandler for key=" << key; return false; } - handlers_[key] = handler; + handlers_[key] = new_handler; return true; } bool SoundsManagerImpl::Play(SoundKey key) { DCHECK(CalledOnValidThread()); - if (handlers_.find(key) == handlers_.end() || - !handlers_[key]->IsInitialized()) { + linked_ptr<AudioStreamHandler> handler = GetHandler(key); + if (!handler.get()) return false; - } - return handlers_[key]->Play(); + if (!handler->IsInitialized()) + return false; + return handler->Play(); +} + +bool SoundsManagerImpl::Stop(SoundKey key) { + DCHECK(CalledOnValidThread()); + linked_ptr<AudioStreamHandler> handler = GetHandler(key); + if (!handler.get()) + return false; + if (!handler->IsInitialized()) + return false; + handler->Stop(); + return true; } base::TimeDelta SoundsManagerImpl::GetDuration(SoundKey key) { DCHECK(CalledOnValidThread()); - if (handlers_.find(key) == handlers_.end() || - !handlers_[key]->IsInitialized()) { + linked_ptr<AudioStreamHandler> handler = GetHandler(key); + if (!handler.get()) + return base::TimeDelta(); + if (!handler->IsInitialized()) return base::TimeDelta(); - } - const WavAudioHandler& wav_audio = handlers_[key]->wav_audio_handler(); + const WavAudioHandler& wav_audio = handler->wav_audio_handler(); return wav_audio.GetDuration(); } +linked_ptr<AudioStreamHandler> SoundsManagerImpl::GetHandler(SoundKey key) { + auto key_handler_pair_iter = handlers_.find(key); + return key_handler_pair_iter == handlers_.end() ? + linked_ptr<AudioStreamHandler>() : key_handler_pair_iter->second; +} + } // namespace SoundsManager::SoundsManager() {} |