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

Unified Diff: content/renderer/media/audio_input_device.cc

Issue 10790121: First step towards moving AudioDevice from content/ to media/audio. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update comments after closing ppapi bug Created 8 years, 5 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
« no previous file with comments | « content/renderer/media/audio_input_device.h ('k') | content/renderer/media/audio_input_message_filter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/audio_input_device.cc
diff --git a/content/renderer/media/audio_input_device.cc b/content/renderer/media/audio_input_device.cc
index 6d8514375575339aa1be3108811e5e3fe52d1f27..23ed507cf16e638537b1bf8d7434cd92156b11b8 100644
--- a/content/renderer/media/audio_input_device.cc
+++ b/content/renderer/media/audio_input_device.cc
@@ -8,10 +8,6 @@
#include "base/message_loop.h"
#include "base/threading/thread_restrictions.h"
#include "base/time.h"
-#include "content/common/child_process.h"
-#include "content/common/media/audio_messages.h"
-#include "content/common/view_messages.h"
-#include "content/renderer/render_thread_impl.h"
#include "media/audio/audio_manager_base.h"
#include "media/audio/audio_util.h"
@@ -37,20 +33,28 @@ class AudioInputDevice::AudioThreadCallback
DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback);
};
-AudioInputDevice::AudioInputDevice(const media::AudioParameters& params,
- CaptureCallback* callback,
- CaptureEventHandler* event_handler)
- : ScopedLoopObserver(
- ChildProcess::current()->io_message_loop()->message_loop_proxy()),
- audio_parameters_(params),
- callback_(callback),
- event_handler_(event_handler),
- volume_(1.0),
+AudioInputDevice::AudioInputDevice(
+ media::AudioInputIPC* ipc,
+ const scoped_refptr<base::MessageLoopProxy>& io_loop)
+ : ScopedLoopObserver(io_loop),
+ callback_(NULL),
+ event_handler_(NULL),
+ ipc_(ipc),
stream_id_(0),
session_id_(0),
pending_device_ready_(false),
agc_is_enabled_(false) {
- filter_ = RenderThreadImpl::current()->audio_input_message_filter();
+ CHECK(ipc_);
+}
+
+void AudioInputDevice::Initialize(const media::AudioParameters& params,
+ CaptureCallback* callback,
+ CaptureEventHandler* event_handler) {
+ DCHECK(!callback_);
+ DCHECK(!event_handler_);
+ audio_parameters_ = params;
+ callback_ = callback;
+ event_handler_ = event_handler;
}
void AudioInputDevice::SetDevice(int session_id) {
@@ -97,7 +101,7 @@ void AudioInputDevice::SetAutomaticGainControl(bool enabled) {
void AudioInputDevice::OnStreamCreated(
base::SharedMemoryHandle handle,
base::SyncSocket::Handle socket_handle,
- uint32 length) {
+ int length) {
DCHECK(message_loop()->BelongsToCurrentThread());
#if defined(OS_WIN)
DCHECK(handle);
@@ -109,15 +113,14 @@ void AudioInputDevice::OnStreamCreated(
DCHECK(length);
DVLOG(1) << "OnStreamCreated (stream_id=" << stream_id_ << ")";
- base::AutoLock auto_lock(audio_thread_lock_);
+ // We should only get this callback if stream_id_ is valid. If it is not,
+ // the IPC layer should have closed the shared memory and socket handles
+ // for us and not invoked the callback. The basic assertion is that when
+ // stream_id_ is 0 the AudioInputDevice instance is not registered as a
+ // delegate and hence it should not receive callbacks.
+ DCHECK(stream_id_);
- // Takes care of the case when Stop() is called before OnStreamCreated().
- if (!stream_id_) {
- base::SharedMemory::CloseHandle(handle);
- // Close the socket handler.
- base::SyncSocket socket(socket_handle);
- return;
- }
+ base::AutoLock auto_lock(audio_thread_lock_);
DCHECK(audio_thread_.IsStopped());
audio_callback_.reset(
@@ -133,7 +136,8 @@ void AudioInputDevice::OnVolume(double volume) {
NOTIMPLEMENTED();
}
-void AudioInputDevice::OnStateChanged(AudioStreamState state) {
+void AudioInputDevice::OnStateChanged(
+ media::AudioInputIPCDelegate::State state) {
DCHECK(message_loop()->BelongsToCurrentThread());
// Do nothing if the stream has been closed.
@@ -141,11 +145,9 @@ void AudioInputDevice::OnStateChanged(AudioStreamState state) {
return;
switch (state) {
- // TODO(xians): This should really be kAudioStreamStopped since the stream
- // has been closed at this point.
- case kAudioStreamPaused:
+ case media::AudioInputIPCDelegate::kStopped:
// TODO(xians): Should we just call ShutDownOnIOThread here instead?
- filter_->RemoveDelegate(stream_id_);
+ ipc_->RemoveDelegate(stream_id_);
audio_thread_.Stop(MessageLoop::current());
audio_callback_.reset();
@@ -156,10 +158,10 @@ void AudioInputDevice::OnStateChanged(AudioStreamState state) {
stream_id_ = 0;
pending_device_ready_ = false;
break;
- case kAudioStreamPlaying:
+ case media::AudioInputIPCDelegate::kRecording:
NOTIMPLEMENTED();
break;
- case kAudioStreamError:
+ case media::AudioInputIPCDelegate::kError:
DLOG(WARNING) << "AudioInputDevice::OnStateChanged(kError)";
// Don't dereference the callback object if the audio thread
// is stopped or stopping. That could mean that the callback
@@ -187,11 +189,11 @@ void AudioInputDevice::OnDeviceReady(const std::string& device_id) {
// If AudioInputDeviceManager returns an empty string, it means no device
// is ready for start.
if (device_id.empty()) {
- filter_->RemoveDelegate(stream_id_);
+ ipc_->RemoveDelegate(stream_id_);
stream_id_ = 0;
} else {
- Send(new AudioInputHostMsg_CreateStream(stream_id_, audio_parameters_,
- device_id, agc_is_enabled_));
+ ipc_->CreateStream(stream_id_, audio_parameters_, device_id,
+ agc_is_enabled_);
}
pending_device_ready_ = false;
@@ -200,6 +202,10 @@ void AudioInputDevice::OnDeviceReady(const std::string& device_id) {
event_handler_->OnDeviceStarted(device_id);
}
+void AudioInputDevice::OnIPCClosed() {
+ ipc_ = NULL;
+}
+
AudioInputDevice::~AudioInputDevice() {
// TODO(henrika): The current design requires that the user calls
// Stop before deleting this class.
@@ -213,17 +219,15 @@ void AudioInputDevice::InitializeOnIOThread() {
if (stream_id_)
return;
- stream_id_ = filter_->AddDelegate(this);
+ stream_id_ = ipc_->AddDelegate(this);
// If |session_id_| is not specified, it will directly create the stream;
// otherwise it will send a AudioInputHostMsg_StartDevice msg to the browser
// and create the stream when getting a OnDeviceReady() callback.
if (!session_id_) {
- Send(new AudioInputHostMsg_CreateStream(
- stream_id_, audio_parameters_,
- media::AudioManagerBase::kDefaultDeviceId,
- agc_is_enabled_));
+ ipc_->CreateStream(stream_id_, audio_parameters_,
+ media::AudioManagerBase::kDefaultDeviceId, agc_is_enabled_);
} else {
- Send(new AudioInputHostMsg_StartDevice(stream_id_, session_id_));
+ ipc_->StartDevice(stream_id_, session_id_);
pending_device_ready_ = true;
}
}
@@ -236,7 +240,7 @@ void AudioInputDevice::SetSessionIdOnIOThread(int session_id) {
void AudioInputDevice::StartOnIOThread() {
DCHECK(message_loop()->BelongsToCurrentThread());
if (stream_id_)
- Send(new AudioInputHostMsg_RecordStream(stream_id_));
+ ipc_->RecordStream(stream_id_);
}
void AudioInputDevice::ShutDownOnIOThread() {
@@ -244,8 +248,8 @@ void AudioInputDevice::ShutDownOnIOThread() {
// NOTE: |completion| may be NULL.
// Make sure we don't call shutdown more than once.
if (stream_id_) {
- filter_->RemoveDelegate(stream_id_);
- Send(new AudioInputHostMsg_CloseStream(stream_id_));
+ ipc_->CloseStream(stream_id_);
+ ipc_->RemoveDelegate(stream_id_);
stream_id_ = 0;
session_id_ = 0;
@@ -268,7 +272,7 @@ void AudioInputDevice::ShutDownOnIOThread() {
void AudioInputDevice::SetVolumeOnIOThread(double volume) {
DCHECK(message_loop()->BelongsToCurrentThread());
if (stream_id_)
- Send(new AudioInputHostMsg_SetVolume(stream_id_, volume));
+ ipc_->SetVolume(stream_id_, volume);
}
void AudioInputDevice::SetAutomaticGainControlOnIOThread(bool enabled) {
@@ -283,10 +287,6 @@ void AudioInputDevice::SetAutomaticGainControlOnIOThread(bool enabled) {
agc_is_enabled_ = enabled;
}
-void AudioInputDevice::Send(IPC::Message* message) {
- filter_->Send(message);
-}
-
void AudioInputDevice::WillDestroyCurrentMessageLoop() {
LOG(ERROR) << "IO loop going away before the input device has been stopped";
ShutDownOnIOThread();
@@ -315,8 +315,8 @@ void AudioInputDevice::AudioThreadCallback::Process(int pending_data) {
// structure and parse out parameters and the data area.
media::AudioInputBuffer* buffer =
reinterpret_cast<media::AudioInputBuffer*>(shared_memory_.memory());
- uint32 size = buffer->params.size;
- DCHECK_EQ(size, memory_length_ - sizeof(media::AudioInputBufferParameters));
+ DCHECK_EQ(buffer->params.size,
+ memory_length_ - sizeof(media::AudioInputBufferParameters));
double volume = buffer->params.volume;
int audio_delay_milliseconds = pending_data / bytes_per_ms_;
« no previous file with comments | « content/renderer/media/audio_input_device.h ('k') | content/renderer/media/audio_input_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698