diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-24 22:22:46 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-24 22:22:46 +0000 |
commit | e667807890b931d41a4529165bedef5203382bbd (patch) | |
tree | 1ac7430f2e9cd9d6000fdc8fbff28d17c42ad3c6 /media/audio/audio_output_proxy.cc | |
parent | c78a2fa648c28bd7874df7b65962975bea027ea0 (diff) | |
download | chromium_src-e667807890b931d41a4529165bedef5203382bbd.zip chromium_src-e667807890b931d41a4529165bedef5203382bbd.tar.gz chromium_src-e667807890b931d41a4529165bedef5203382bbd.tar.bz2 |
Implemented AudioOutputProxy.
AudioOutputProxy implements AudioOutputStream interface, but opens
audio device only when audio is playing.
BUG=39825
TEST=Unittests.
Review URL: http://codereview.chromium.org/5158003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67327 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_output_proxy.cc')
-rw-r--r-- | media/audio/audio_output_proxy.cc | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc new file mode 100644 index 0000000..c162867 --- /dev/null +++ b/media/audio/audio_output_proxy.cc @@ -0,0 +1,92 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/audio_output_proxy.h" + +#include "base/logging.h" +#include "base/message_loop.h" +#include "base/task.h" +#include "media/audio/audio_manager.h" +#include "media/audio/audio_output_dispatcher.h" + +AudioOutputProxy::AudioOutputProxy(AudioOutputDispatcher* dispatcher) + : dispatcher_(dispatcher), + state_(kCreated), + physical_stream_(NULL), + volume_(1.0) { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); +} + +AudioOutputProxy::~AudioOutputProxy() { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(state_ == kCreated || state_ == kClosed); + DCHECK(!physical_stream_); +} + +bool AudioOutputProxy::Open() { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK_EQ(state_, kCreated); + + if (!dispatcher_->StreamOpened()) { + state_ = kError; + return false; + } + + state_ = kOpened; + return true; +} + +void AudioOutputProxy::Start(AudioSourceCallback* callback) { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(physical_stream_ == NULL); + DCHECK_EQ(state_, kOpened); + + physical_stream_= dispatcher_->StreamStarted(); + if (!physical_stream_) { + state_ = kError; + callback->OnError(this, 0); + return; + } + + physical_stream_->SetVolume(volume_); + physical_stream_->Start(callback); + state_ = kPlaying; +} + +void AudioOutputProxy::Stop() { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + if (state_ != kPlaying) + return; + + DCHECK(physical_stream_); + physical_stream_->Stop(); + dispatcher_->StreamStopped(physical_stream_); + physical_stream_ = NULL; + state_ = kOpened; +} + +void AudioOutputProxy::SetVolume(double volume) { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + volume_ = volume; + if (physical_stream_) { + physical_stream_->SetVolume(volume); + } +} + +void AudioOutputProxy::GetVolume(double* volume) { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + *volume = volume_; +} + +void AudioOutputProxy::Close() { + DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(state_ == kCreated || state_ == kError || state_ == kOpened); + DCHECK(!physical_stream_); + + if (state_ != kCreated) { + dispatcher_->StreamClosed(); + } + dispatcher_->message_loop()->DeleteSoon(FROM_HERE, this); + state_ = kClosed; +} |