Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(927)

Unified Diff: media/audio/sounds/audio_stream_handler.cc

Issue 115693004: Added volume adjust sound behind the flag. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/sounds/audio_stream_handler.cc
diff --git a/media/audio/sounds/audio_stream_handler.cc b/media/audio/sounds/audio_stream_handler.cc
index 49709769f7c54fde19caabc05c1afc303cf1886d..f905484ceefdcd507a88953fa57ec03219c0f8f9 100644
--- a/media/audio/sounds/audio_stream_handler.cc
+++ b/media/audio/sounds/audio_stream_handler.cc
@@ -8,6 +8,7 @@
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
+#include "base/synchronization/lock.h"
#include "media/audio/audio_manager.h"
#include "media/audio/audio_manager_base.h"
#include "media/base/channel_layout.h"
@@ -30,12 +31,11 @@ AudioOutputStream::AudioSourceCallback* g_audio_source_for_testing = NULL;
class AudioStreamHandler::AudioStreamContainer
: public AudioOutputStream::AudioSourceCallback {
public:
- AudioStreamContainer(const WavAudioHandler& wav_audio,
- const AudioParameters& params)
+ AudioStreamContainer(const WavAudioHandler& wav_audio)
: stream_(NULL),
wav_audio_(wav_audio),
- params_(params),
- cursor_(0) {
+ cursor_(0),
+ can_start_(true) {
}
virtual ~AudioStreamContainer() {
@@ -46,20 +46,25 @@ class AudioStreamHandler::AudioStreamContainer
DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
if (!stream_) {
- stream_ = AudioManager::Get()->MakeAudioOutputStreamProxy(params_,
- std::string(),
- std::string());
+ const AudioParameters& p = wav_audio_.params();
+ const AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+ p.channel_layout(),
+ p.sample_rate(),
+ p.bits_per_sample(),
+ kDefaultFrameCount);
+ stream_ = AudioManager::Get()->MakeAudioOutputStreamProxy(
+ params, std::string(), std::string());
if (!stream_ || !stream_->Open()) {
LOG(ERROR) << "Failed to open an output stream.";
return;
}
stream_->SetVolume(kOutputVolumePercent);
- } else {
- // TODO (ygorshenin@): implement smart stream rewind.
- stream_->Stop();
+ } else if (!CanStart()) {
DaleCurtis 2014/01/09 19:58:26 You can simplify this by tracking "started_" inste
ygorshenin1 2014/01/13 10:00:55 Done.
ygorshenin1 2014/01/13 10:00:55 Done.
+ return;
}
- cursor_ = 0;
+ SetCursor(0);
+ SetCanStart(false);
if (g_audio_source_for_testing)
stream_->Start(g_audio_source_for_testing);
else
@@ -71,14 +76,10 @@ class AudioStreamHandler::AudioStreamContainer
void Stop() {
DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
- if (!stream_)
- return;
- stream_->Stop();
- stream_->Close();
+ StopStream();
+ if (stream_)
+ stream_->Close();
stream_ = NULL;
-
- if (g_observer_for_testing)
- g_observer_for_testing->OnStop(cursor_);
}
private:
@@ -87,14 +88,16 @@ class AudioStreamHandler::AudioStreamContainer
virtual int OnMoreData(AudioBus* dest,
AudioBuffersState /* state */) OVERRIDE {
size_t bytes_written = 0;
- if (wav_audio_.AtEnd(cursor_) ||
- !wav_audio_.CopyTo(dest, cursor_, &bytes_written)) {
+ size_t cursor = GetCursor();
+ if (wav_audio_.AtEnd(cursor) ||
+ !wav_audio_.CopyTo(dest, cursor, &bytes_written)) {
AudioManager::Get()->GetTaskRunner()->PostTask(
FROM_HERE,
- base::Bind(&AudioStreamContainer::Stop, base::Unretained(this)));
+ base::Bind(&AudioStreamContainer::StopStream,
+ base::Unretained(this)));
return 0;
}
- cursor_ += bytes_written;
+ SetCursor(cursor + bytes_written);
return dest->frames();
}
@@ -109,13 +112,44 @@ class AudioStreamHandler::AudioStreamContainer
LOG(ERROR) << "Error during system sound reproduction.";
}
+ void StopStream() {
+ if (stream_)
+ stream_->Stop();
+ if (g_observer_for_testing)
+ g_observer_for_testing->OnStop(GetCursor());
+ SetCanStart(true);
+ }
+
+ size_t GetCursor() {
+ base::AutoLock al(cursor_lock_);
+ return cursor_;
+ }
+
+ void SetCursor(size_t cursor) {
+ base::AutoLock al(cursor_lock_);
+ cursor_ = cursor;
+ }
+
+ bool CanStart() {
+ base::AutoLock al(can_start_lock_);
+ return can_start_;
+ }
+
+ void SetCanStart(bool can_start) {
+ base::AutoLock al(can_start_lock_);
+ can_start_ = can_start;
+ }
+
AudioOutputStream* stream_;
const WavAudioHandler wav_audio_;
- const AudioParameters params_;
+ base::Lock cursor_lock_;
size_t cursor_;
+ base::Lock can_start_lock_;
+ bool can_start_;
+
DISALLOW_COPY_AND_ASSIGN(AudioStreamContainer);
};
@@ -127,16 +161,11 @@ AudioStreamHandler::AudioStreamHandler(const base::StringPiece& wav_data)
LOG(ERROR) << "Can't get access to audio manager.";
return;
}
- AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
- GuessChannelLayout(wav_audio_.num_channels()),
- wav_audio_.sample_rate(),
- wav_audio_.bits_per_sample(),
- kDefaultFrameCount);
- if (!params.IsValid()) {
+ if (!wav_audio_.params().IsValid()) {
LOG(ERROR) << "Audio params are invalid.";
return;
}
- stream_.reset(new AudioStreamContainer(wav_audio_, params));
+ stream_.reset(new AudioStreamContainer(wav_audio_));
initialized_ = true;
}

Powered by Google App Engine
This is Rietveld 408576698