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

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

Issue 11298006: Browser-wide audio mirroring for TabCapture API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "media/audio/virtual_audio_input_stream.h"
6
7 #include "base/bind.h"
8 #include "media/audio/audio_manager_base.h"
9 #include "media/audio/audio_output_resampler.h"
10 #include "media/audio/virtual_audio_output_stream.h"
11 #include "media/audio/audio_util.h"
12
13 namespace media {
14
15 AudioInputStream* VirtualAudioInputStream::MakeStream(
16 AudioManagerBase* manager, const AudioParameters& params) {
17 return new VirtualAudioInputStream(manager, params);
18 }
19
20 VirtualAudioInputStream::VirtualAudioInputStream(AudioManagerBase* manager,
21 const AudioParameters& params)
22 : audio_manager_(manager),
23 callback_(NULL),
24 buffer_size_((params.channels() * params.bits_per_sample() *
DaleCurtis 2012/11/07 23:34:17 params.GetBytesPerBuffer() ?
justinlin 2012/11/20 08:56:10 Done.
25 params.frames_per_buffer()) / 8),
26 params_(params),
27 audio_bus_(AudioBus::Create(params)) {
28 }
29
30 VirtualAudioInputStream::~VirtualAudioInputStream() {
31 }
32
33 bool VirtualAudioInputStream::Open() {
34 buffer_.reset(new uint8[buffer_size_]);
DaleCurtis 2012/11/07 23:34:17 Do during constructor.
justinlin 2012/11/20 08:56:10 Done.
35 memset(buffer_.get(), 0, buffer_size_);
36 return true;
37 }
38
39 void VirtualAudioInputStream::Start(AudioInputCallback* callback) {
40 callback_ = callback;
41 on_more_data_cb_.Reset(base::Bind(
42 &VirtualAudioInputStream::DoCallback, base::Unretained(this)));
43 audio_manager_->GetMessageLoop()->PostTask(
44 FROM_HERE, on_more_data_cb_.callback());
45 // TODO(justinlin): Tell manager to convert all physical streams to
46 // virtual streams.
47 }
48
49 void VirtualAudioInputStream::DoCallback() {
50 DCHECK(callback_);
51 DCHECK(audio_manager_->GetMessageLoop()->BelongsToCurrentThread());
52
53 int frames_received = 0;
54 float frames_per_millisecond = params_.sample_rate() / static_cast<float>(
55 base::Time::kMillisecondsPerSecond);
56
57 AudioManagerBase::AudioOutputStreamList streams_ =
58 audio_manager_->GetVirtualAudioOutputStreams();
59 for (AudioManagerBase::AudioOutputStreamList::iterator it = streams_.begin();
60 it != streams_.end(); ++it) {
61 const VirtualAudioOutputStream* virtual_output_stream =
62 static_cast<const VirtualAudioOutputStream*>(*it);
63 if (!virtual_output_stream->callback())
64 continue;
65
66 const AudioParameters& virtual_output_stream_params =
67 virtual_output_stream->params();
68
69 // TODO(justinlin): Use array of resamplers?
70 double io_sample_rate_ratio =
71 virtual_output_stream_params.sample_rate() /
72 static_cast<double>(params_.sample_rate());
73 resampler_.reset(new OnMoreDataResampler(
DaleCurtis 2012/11/07 23:34:17 1. You can't just reconstruct this every time due
justinlin 2012/11/20 08:56:10 Done. Thanks!
74 io_sample_rate_ratio, virtual_output_stream_params, params_));
75 resampler_->Start(virtual_output_stream->callback());
76 frames_received =
77 resampler_->OnMoreData(audio_bus_.get(), AudioBuffersState());
78
79 audio_bus_->ToInterleaved(params_.frames_per_buffer(),
80 params_.bits_per_sample() / 8,
81 buffer_.get());
82 // TODO(justinlin): Mix streams.
83 }
84
85 callback_->OnData(this, buffer_.get(), buffer_size_, buffer_size_, 1.0);
86
87 MessageLoop::current()->PostDelayedTask(
88 FROM_HERE, on_more_data_cb_.callback(),
89 base::TimeDelta::FromMilliseconds(
90 std::max(1.0f, frames_received / frames_per_millisecond)));
91 }
92
93 void VirtualAudioInputStream::Stop() {
94 callback_ = NULL; // ?
95 on_more_data_cb_.Cancel();
96 // TODO(justinlin): Notify manager to revert all output streams back
97 // to physical streams.
98 }
99
100 void VirtualAudioInputStream::Close() {
101 if (callback_) {
102 callback_->OnClose(this);
103 callback_ = NULL;
104 }
105 audio_manager_->ReleaseInputStream(this);
106 }
107
108 double VirtualAudioInputStream::GetMaxVolume() {
109 return 1.0;
110 }
111
112 void VirtualAudioInputStream::SetVolume(double volume) {}
113
114 double VirtualAudioInputStream::GetVolume() {
115 return 1.0;
116 }
117
118 void VirtualAudioInputStream::SetAutomaticGainControl(bool enabled) {}
119
120 bool VirtualAudioInputStream::GetAutomaticGainControl() {
121 return false;
122 }
123
124 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698