| 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
|
|
|