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

Unified Diff: content/browser/renderer_host/media/audio_input_device_manager.cc

Issue 8677012: Refactor the AudioInputDeviceManager by removing the device thread. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: update Created 9 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/audio_input_device_manager.cc
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc
index 96a4dbbf33c4f58c317c1821d35a82c668a0e5dc..08469bfad0d91ff8bab7a07ea196e65064d0f881 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
@@ -21,37 +21,12 @@ const char AudioInputDeviceManager::kInvalidDeviceId[] = "";
// Starting id for the first capture session.
const int kFirstSessionId = AudioInputDeviceManager::kFakeOpenSessionId + 1;
-// Helper function.
-static bool IsValidAudioInputDevice(const media::AudioDeviceName& device) {
- AudioManager* audio_manager = AudioManager::GetAudioManager();
- if (!audio_manager)
- return false;
-
- // Get the up-to-date list of devices and verify the device is in the list.
- media::AudioDeviceNames device_names;
- audio_manager->GetAudioInputDeviceNames(&device_names);
- if (!device_names.empty()) {
- for (media::AudioDeviceNames::iterator iter = device_names.begin();
- iter != device_names.end();
- ++iter) {
- if (iter->device_name == device.device_name &&
- iter->unique_id == device.unique_id)
- return true;
- }
- }
- // The device wasn't found.
- return false;
-}
-
AudioInputDeviceManager::AudioInputDeviceManager()
- : audio_input_device_thread_("AudioInputDeviceManagerThread"),
- listener_(NULL),
+ : listener_(NULL),
next_capture_session_id_(kFirstSessionId) {
- audio_input_device_thread_.Start();
}
AudioInputDeviceManager::~AudioInputDeviceManager() {
- audio_input_device_thread_.Stop();
}
void AudioInputDeviceManager::Register(MediaStreamProviderListener* listener) {
@@ -70,259 +45,132 @@ void AudioInputDeviceManager::EnumerateDevices() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(listener_);
- audio_input_device_thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&AudioInputDeviceManager::EnumerateOnDeviceThread,
- base::Unretained(this)));
-}
-
-int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- // Generate a new id for this device.
- int audio_input_session_id = next_capture_session_id_++;
-
- audio_input_device_thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&AudioInputDeviceManager::OpenOnDeviceThread,
- base::Unretained(this), audio_input_session_id, device));
-
- return audio_input_session_id;
-}
-
-void AudioInputDeviceManager::Close(int session_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(listener_);
-
- audio_input_device_thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&AudioInputDeviceManager::CloseOnDeviceThread,
- base::Unretained(this), session_id));
-}
-
-void AudioInputDeviceManager::Start(
- int session_id, AudioInputDeviceManagerEventHandler* event_handler) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(event_handler);
-
- // Solution for not using MediaStreamManager. This is needed when Start() is
- // called without using Open(), we post default device for test purpose.
- // And we do not store the info for the kFakeOpenSessionId but return
- // the callback immediately.
- if (session_id == kFakeOpenSessionId) {
- event_handler->OnDeviceStarted(session_id,
- AudioManagerBase::kDefaultDeviceId);
- return;
- }
-
- // If session has been started, post a callback with an error.
- if (event_handlers_.find(session_id) != event_handlers_.end()) {
- // Session has been started, post a callback with error.
- event_handler->OnDeviceStarted(session_id, kInvalidDeviceId);
- return;
- }
-
- // Add the event handler to the session.
- event_handlers_.insert(std::make_pair(session_id, event_handler));
-
- audio_input_device_thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&AudioInputDeviceManager::StartOnDeviceThread,
- base::Unretained(this), session_id));
-}
-
-void AudioInputDeviceManager::Stop(int session_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- audio_input_device_thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&AudioInputDeviceManager::StopOnDeviceThread,
- base::Unretained(this), session_id));
-}
-
-void AudioInputDeviceManager::EnumerateOnDeviceThread() {
- DCHECK(IsOnCaptureDeviceThread());
-
- // Get the device list from system.
media::AudioDeviceNames device_names;
AudioManager::GetAudioManager()->GetAudioInputDeviceNames(&device_names);
- StreamDeviceInfoArray devices;
+ StreamDeviceInfoArray* devices = new StreamDeviceInfoArray;
for (media::AudioDeviceNames::iterator it = device_names.begin();
it != device_names.end();
++it) {
- devices.push_back(StreamDeviceInfo(kAudioCapture, it->device_name,
- it->unique_id, false));
+ devices->push_back(StreamDeviceInfo(kAudioCapture, it->device_name,
+ it->unique_id, false));
}
+ // Returns the device list through the listener by posting a task on
+ // IO thread since MediaStreamManager handles the callback asynchronously.
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
base::Bind(&AudioInputDeviceManager::DevicesEnumeratedOnIOThread,
- base::Unretained(this), devices));
+ base::Unretained(this),
+ devices));
}
-void AudioInputDeviceManager::OpenOnDeviceThread(
- int session_id, const StreamDeviceInfo& device) {
- DCHECK(IsOnCaptureDeviceThread());
+int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ // Generates a new id for this device.
+ int session_id = next_capture_session_id_++;
DCHECK(devices_.find(session_id) == devices_.end());
media::AudioDeviceName audio_input_device_name;
audio_input_device_name.device_name = device.name;
audio_input_device_name.unique_id = device.device_id;
- // Check if the device is valid
- if (!IsValidAudioInputDevice(audio_input_device_name)) {
- SignalError(session_id, kDeviceNotAvailable);
- return;
- }
-
- // Add the session_id and device to the list.
+ // Adds the session_id and device to the list.
devices_[session_id] = audio_input_device_name;
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(
- &AudioInputDeviceManager::OpenedOnIOThread,
- base::Unretained(this),
- session_id));
-}
-
-void AudioInputDeviceManager::CloseOnDeviceThread(int session_id) {
- DCHECK(IsOnCaptureDeviceThread());
- DCHECK(devices_.find(session_id) != devices_.end());
- devices_.erase(session_id);
+ // Returns the |session_id| through the listener by posting a task on
+ // IO thread since MediaStreamManager handles the callback asynchronously.
BrowserThread::PostTask(BrowserThread::IO,
FROM_HERE,
- base::Bind(
- &AudioInputDeviceManager::ClosedOnIOThread,
- base::Unretained(this),
- session_id));
-}
-
-void AudioInputDeviceManager::StartOnDeviceThread(const int session_id) {
- DCHECK(IsOnCaptureDeviceThread());
-
- // Get the up-to-date device enumeration list from the OS and find out
- // the unique id of the device.
- std::string device_id = kInvalidDeviceId;
- AudioInputDeviceMap::const_iterator it = devices_.find(session_id);
- if (it != devices_.end()) {
- media::AudioDeviceNames device_names;
- AudioManager::GetAudioManager()->GetAudioInputDeviceNames(&device_names);
- if (!device_names.empty()) {
- int index = 0;
- for (media::AudioDeviceNames::iterator iter = device_names.begin();
- iter != device_names.end();
- ++iter, ++index) {
- if (iter->device_name == it->second.device_name &&
- iter->unique_id == it->second.unique_id) {
- // Found the device.
- device_id = iter->unique_id;
- break;
- }
- }
- }
- }
+ base::Bind(&AudioInputDeviceManager::OpenedOnIOThread,
+ base::Unretained(this),
+ session_id));
- // Posts the index to AudioInputRenderHost through the event handler.
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(
- &AudioInputDeviceManager::StartedOnIOThread,
- base::Unretained(this),
- session_id,
- device_id));
+ return session_id;
}
-void AudioInputDeviceManager::StopOnDeviceThread(int session_id) {
- DCHECK(IsOnCaptureDeviceThread());
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(
- &AudioInputDeviceManager::StoppedOnIOThread,
- base::Unretained(this),
- session_id));
-}
-
-void AudioInputDeviceManager::DevicesEnumeratedOnIOThread(
- const StreamDeviceInfoArray& devices) {
+void AudioInputDeviceManager::Close(int session_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (listener_)
- listener_->DevicesEnumerated(kAudioCapture, devices);
-}
+ DCHECK(listener_);
-void AudioInputDeviceManager::OpenedOnIOThread(int session_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (listener_)
- listener_->Opened(kAudioCapture, session_id);
-}
+ if (devices_.find(session_id) != devices_.end())
+ devices_.erase(session_id);
-void AudioInputDeviceManager::ClosedOnIOThread(int session_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ // Checks if the device has been stopped, if not, send stop signal.
EventHandlerMap::iterator it = event_handlers_.find(session_id);
if (it != event_handlers_.end()) {
- // The device hasn't been stopped, send stop signal.
it->second->OnDeviceStopped(session_id);
event_handlers_.erase(session_id);
}
- listener_->Closed(kAudioCapture, session_id);
-}
-
-void AudioInputDeviceManager::ErrorOnIOThread(int session_id,
- MediaStreamProviderError error) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (listener_)
- listener_->Error(kAudioCapture, session_id, error);
+ // Posts a callback through the listener on IO thread since
+ // MediaStreamManager handles the callback asynchronously.
+ BrowserThread::PostTask(BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&AudioInputDeviceManager::ClosedOnIOThread,
+ base::Unretained(this),
+ session_id));
}
-void AudioInputDeviceManager::StartedOnIOThread(
- int session_id, const std::string& device_id) {
+void AudioInputDeviceManager::Start(
+ int session_id, AudioInputDeviceManagerEventHandler* event_handler) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(event_handler);
- EventHandlerMap::iterator it = event_handlers_.find(session_id);
- if (it == event_handlers_.end())
+ // Solution for not using MediaStreamManager. This is needed when Start() is
+ // called without using Open(), we post default device for test purpose.
+ // And we do not store the info for the kFakeOpenSessionId but return
+ // the callback immediately.
+ if (session_id == kFakeOpenSessionId) {
+ event_handler->OnDeviceStarted(session_id,
+ AudioManagerBase::kDefaultDeviceId);
return;
+ }
- // Post a callback through the AudioInputRendererHost to notify the renderer
- // device has been started.
- it->second->OnDeviceStarted(session_id, device_id);
-}
+ // Checks if the device has been opened or not.
+ std::string device_id = (devices_.find(session_id) == devices_.end()) ?
+ kInvalidDeviceId : devices_[session_id].unique_id;
-void AudioInputDeviceManager::StoppedOnIOThread(int session_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- // Erase the event handler referenced by the session_id.
- event_handlers_.erase(session_id);
-}
+ // Adds the event handler to the session if the session has not been started,
+ // otherwise post a |kInvalidDeviceId| to indicate that Start() fails.
+ if (event_handlers_.find(session_id) == event_handlers_.end())
+ event_handlers_.insert(std::make_pair(session_id, event_handler));
+ else
+ device_id = kInvalidDeviceId;
-void AudioInputDeviceManager::SignalError(int session_id,
- MediaStreamProviderError error) {
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(
- &AudioInputDeviceManager::ErrorOnIOThread,
- base::Unretained(this),
- session_id,
- error));
+ // Posts a callback through the AudioInputRendererHost to notify the renderer
+ // that the device has started.
+ event_handler->OnDeviceStarted(session_id, device_id);
}
-bool AudioInputDeviceManager::IsOnCaptureDeviceThread() const {
- return MessageLoop::current() == audio_input_device_thread_.message_loop();
+void AudioInputDeviceManager::Stop(int session_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ // Erases the event handler referenced by the session_id.
+ event_handlers_.erase(session_id);
}
-void AudioInputDeviceManager::UnregisterEventHandler(int session_id) {
+void AudioInputDeviceManager::DevicesEnumeratedOnIOThread(
+ StreamDeviceInfoArray* devices) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- event_handlers_.erase(session_id);
+ // Ensures that |devices| gets deleted on exit.
+ scoped_ptr<StreamDeviceInfoArray> devices_array(devices);
+ if (listener_)
+ listener_->DevicesEnumerated(kAudioCapture, *devices_array);
}
-bool AudioInputDeviceManager::HasEventHandler(int session_id) {
+void AudioInputDeviceManager::OpenedOnIOThread(int session_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- return event_handlers_.find(session_id) != event_handlers_.end();
+ if (listener_)
+ listener_->Opened(kAudioCapture, session_id);
}
-MessageLoop* AudioInputDeviceManager::message_loop() {
- return audio_input_device_thread_.message_loop();
+void AudioInputDeviceManager::ClosedOnIOThread(int session_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (listener_)
+ listener_->Closed(kAudioCapture, session_id);
}
} // namespace media_stream

Powered by Google App Engine
This is Rietveld 408576698