Chromium Code Reviews| Index: content/browser/renderer_host/media/audio_input_device_manager.cc |
| =================================================================== |
| --- content/browser/renderer_host/media/audio_input_device_manager.cc (revision 111331) |
| +++ content/browser/renderer_host/media/audio_input_device_manager.cc (working copy) |
| @@ -21,37 +21,12 @@ |
| // 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,79 +45,6 @@ |
| 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); |
| @@ -155,43 +57,58 @@ |
| 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)); |
|
tommi (sloooow) - chröme
2011/11/23 20:16:31
won't |devices| go out of scope and thus be garbag
no longer working on chromium
2011/11/24 14:47:34
I did not dig into the details on how the bind wor
henrika (OOO until Aug 14)
2011/11/24 15:22:26
Can probably be done without a copy.
no longer working on chromium
2011/11/24 16:00:42
Use a pointer as Tommi suggests.
|
| } |
| -void AudioInputDeviceManager::OpenOnDeviceThread( |
| - int session_id, const StreamDeviceInfo& device) { |
| - DCHECK(IsOnCaptureDeviceThread()); |
| +int AudioInputDeviceManager::Open(const StreamDeviceInfo& device) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Generate 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. |
| devices_[session_id] = audio_input_device_name; |
| + |
| + // 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::OpenedOnIOThread, |
|
henrika (OOO until Aug 14)
2011/11/24 15:22:26
Odd indentation.
no longer working on chromium
2011/11/24 16:00:42
Done.
|
| base::Unretained(this), |
| session_id)); |
| + |
| + return session_id; |
| } |
| -void AudioInputDeviceManager::CloseOnDeviceThread(int session_id) { |
| - DCHECK(IsOnCaptureDeviceThread()); |
| +void AudioInputDeviceManager::Close(int session_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DCHECK(listener_); |
| DCHECK(devices_.find(session_id) != devices_.end()); |
| devices_.erase(session_id); |
| + |
| + // Checks if the device has been stopped, if not, sends stop signal. |
| + EventHandlerMap::iterator it = event_handlers_.find(session_id); |
| + if (it != event_handlers_.end()) { |
| + it->second->OnDeviceStopped(session_id); |
| + event_handlers_.erase(session_id); |
| + } |
| + |
| + // Posts a callback through the listener on IO thread since |
| + // MediaStreamManager handles the callback asynchronously. |
| BrowserThread::PostTask(BrowserThread::IO, |
| FROM_HERE, |
| base::Bind( |
| @@ -200,49 +117,42 @@ |
| session_id)); |
| } |
| -void AudioInputDeviceManager::StartOnDeviceThread(const int session_id) { |
| - DCHECK(IsOnCaptureDeviceThread()); |
| +void AudioInputDeviceManager::Start( |
| + int session_id, AudioInputDeviceManagerEventHandler* event_handler) { |
|
tommi (sloooow) - chröme
2011/11/23 20:16:31
move int session_id to the previous line
no longer working on chromium
2011/11/24 14:47:34
"AudioInputDeviceManagerEventHandler* event_handle
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DCHECK(event_handler); |
| - // 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; |
| - } |
| - } |
| - } |
| + // 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; |
| } |
| - // 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)); |
| + // 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; |
| + |
| + // 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; |
| + |
| + // Post a callback through the AudioInputRendererHost to notify the renderer |
| + // device has been started. |
| + event_handler->OnDeviceStarted(session_id, device_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::Stop(int session_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Erase the event handler referenced by the session_id. |
| + event_handlers_.erase(session_id); |
| } |
| void AudioInputDeviceManager::DevicesEnumeratedOnIOThread( |
| @@ -260,69 +170,8 @@ |
| void AudioInputDeviceManager::ClosedOnIOThread(int session_id) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - 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); |
| + listener_->Closed(kAudioCapture, session_id); |
| } |
| -void AudioInputDeviceManager::StartedOnIOThread( |
| - int session_id, const std::string& device_id) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - |
| - EventHandlerMap::iterator it = event_handlers_.find(session_id); |
| - if (it == event_handlers_.end()) |
| - return; |
| - |
| - // Post a callback through the AudioInputRendererHost to notify the renderer |
| - // device has been started. |
| - it->second->OnDeviceStarted(session_id, device_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); |
| -} |
| - |
| -void AudioInputDeviceManager::SignalError(int session_id, |
| - MediaStreamProviderError error) { |
| - BrowserThread::PostTask(BrowserThread::IO, |
| - FROM_HERE, |
| - base::Bind( |
| - &AudioInputDeviceManager::ErrorOnIOThread, |
| - base::Unretained(this), |
| - session_id, |
| - error)); |
| -} |
| - |
| -bool AudioInputDeviceManager::IsOnCaptureDeviceThread() const { |
| - return MessageLoop::current() == audio_input_device_thread_.message_loop(); |
| -} |
| - |
| -void AudioInputDeviceManager::UnregisterEventHandler(int session_id) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - event_handlers_.erase(session_id); |
| -} |
| - |
| -bool AudioInputDeviceManager::HasEventHandler(int session_id) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - return event_handlers_.find(session_id) != event_handlers_.end(); |
| -} |
| - |
| -MessageLoop* AudioInputDeviceManager::message_loop() { |
| - return audio_input_device_thread_.message_loop(); |
| -} |
| - |
| } // namespace media_stream |