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

Side by Side Diff: media/audio/fake_audio_input_stream.cc

Issue 9692038: stopping the audio thread before destroying the AudioManager<Platform> (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased and fixed the speech recognition unittest Created 8 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/fake_audio_input_stream.h" 5 #include "media/audio/fake_audio_input_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "media/audio/audio_manager_base.h"
8 9
9 using base::Time; 10 using base::Time;
10 using base::TimeDelta; 11 using base::TimeDelta;
11 12
12 AudioInputStream* FakeAudioInputStream::MakeFakeStream( 13 AudioInputStream* FakeAudioInputStream::MakeFakeStream(
14 AudioManagerBase* manager,
13 const AudioParameters& params) { 15 const AudioParameters& params) {
14 return new FakeAudioInputStream(params); 16 return new FakeAudioInputStream(manager, params);
15 } 17 }
16 18
17 FakeAudioInputStream::FakeAudioInputStream(const AudioParameters& params) 19 FakeAudioInputStream::FakeAudioInputStream(AudioManagerBase* manager,
18 : callback_(NULL), 20 const AudioParameters& params)
21 : audio_manager_(manager),
22 callback_(NULL),
19 buffer_size_((params.channels * params.bits_per_sample * 23 buffer_size_((params.channels * params.bits_per_sample *
20 params.samples_per_packet) / 8), 24 params.samples_per_packet) / 8),
21 thread_("FakeAudioRecordingThread"), 25 thread_("FakeAudioRecordingThread"),
22 callback_interval_(base::TimeDelta::FromMilliseconds( 26 callback_interval_(base::TimeDelta::FromMilliseconds(
23 (params.samples_per_packet * 1000) / params.sample_rate)) { 27 (params.samples_per_packet * 1000) / params.sample_rate)) {
24 // This object is ref counted (so that it can be used with Thread, PostTask)
25 // but the caller expects a plain pointer. So we take a reference here and
26 // will Release() ourselves in Close().
27 AddRef();
28 } 28 }
29 29
30 FakeAudioInputStream::~FakeAudioInputStream() {} 30 FakeAudioInputStream::~FakeAudioInputStream() {}
31 31
32 bool FakeAudioInputStream::Open() { 32 bool FakeAudioInputStream::Open() {
33 buffer_.reset(new uint8[buffer_size_]); 33 buffer_.reset(new uint8[buffer_size_]);
34 memset(buffer_.get(), 0, buffer_size_); 34 memset(buffer_.get(), 0, buffer_size_);
35 return true; 35 return true;
36 } 36 }
37 37
38 void FakeAudioInputStream::Start(AudioInputCallback* callback) { 38 void FakeAudioInputStream::Start(AudioInputCallback* callback) {
39 DCHECK(!thread_.IsRunning()); 39 DCHECK(!thread_.IsRunning());
40 callback_ = callback; 40 callback_ = callback;
41 last_callback_time_ = Time::Now(); 41 last_callback_time_ = Time::Now();
42 thread_.Start(); 42 thread_.Start();
43 thread_.message_loop()->PostDelayedTask( 43 thread_.message_loop()->PostDelayedTask(
44 FROM_HERE, 44 FROM_HERE,
45 base::Bind(&FakeAudioInputStream::DoCallback, this), 45 base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)),
46 callback_interval_); 46 callback_interval_);
47 } 47 }
48 48
49 void FakeAudioInputStream::DoCallback() { 49 void FakeAudioInputStream::DoCallback() {
50 DCHECK(callback_); 50 DCHECK(callback_);
51 callback_->OnData(this, buffer_.get(), buffer_size_, buffer_size_); 51 callback_->OnData(this, buffer_.get(), buffer_size_, buffer_size_);
52 52
53 Time now = Time::Now(); 53 Time now = Time::Now();
54 base::TimeDelta next_callback_time = 54 base::TimeDelta next_callback_time =
55 last_callback_time_ + callback_interval_ * 2 - now; 55 last_callback_time_ + callback_interval_ * 2 - now;
56 56
57 // If we are falling behind, try to catch up as much as we can in the next 57 // If we are falling behind, try to catch up as much as we can in the next
58 // callback. 58 // callback.
59 if (next_callback_time < base::TimeDelta()) 59 if (next_callback_time < base::TimeDelta())
60 next_callback_time = base::TimeDelta(); 60 next_callback_time = base::TimeDelta();
61 61
62 last_callback_time_ = now; 62 last_callback_time_ = now;
63 thread_.message_loop()->PostDelayedTask( 63 thread_.message_loop()->PostDelayedTask(
64 FROM_HERE, 64 FROM_HERE,
65 base::Bind(&FakeAudioInputStream::DoCallback, this), 65 base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)),
66 next_callback_time); 66 next_callback_time);
67 } 67 }
68 68
69 void FakeAudioInputStream::Stop() { 69 void FakeAudioInputStream::Stop() {
70 thread_.Stop(); 70 thread_.Stop();
71 } 71 }
72 72
73 void FakeAudioInputStream::Close() { 73 void FakeAudioInputStream::Close() {
74 if (callback_) { 74 if (callback_) {
75 callback_->OnClose(this); 75 callback_->OnClose(this);
76 callback_ = NULL; 76 callback_ = NULL;
77 } 77 }
78 Release(); // Destoys this object. 78 audio_manager_->ReleaseInputStream(this);
79 } 79 }
80 80
81 double FakeAudioInputStream::GetMaxVolume() { 81 double FakeAudioInputStream::GetMaxVolume() {
82 return 0.0; 82 return 0.0;
83 } 83 }
84 84
85 void FakeAudioInputStream::SetVolume(double volume) {} 85 void FakeAudioInputStream::SetVolume(double volume) {}
86 86
87 double FakeAudioInputStream::GetVolume() { 87 double FakeAudioInputStream::GetVolume() {
88 return 0.0; 88 return 0.0;
89 } 89 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698