| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/media/audio_output_authorization_handler
.h" | 5 #include "content/browser/renderer_host/media/audio_output_authorization_handler
.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/task_runner_util.h" | 8 #include "base/task_runner_util.h" |
| 9 #include "content/browser/bad_message.h" | 9 #include "content/browser/bad_message.h" |
| 10 #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 10 #include "content/browser/renderer_host/media/audio_input_device_manager.h" |
| 11 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
| 12 #include "content/public/browser/media_device_id.h" | 12 #include "content/public/browser/media_device_id.h" |
| 13 #include "media/audio/audio_system.h" |
| 13 #include "media/base/limits.h" | 14 #include "media/base/limits.h" |
| 14 | 15 |
| 15 namespace { | 16 namespace { |
| 16 | 17 |
| 17 media::AudioParameters TryToFixAudioParameters( | 18 media::AudioParameters TryToFixAudioParameters( |
| 18 const media::AudioParameters& params) { | 19 const media::AudioParameters& params) { |
| 19 DCHECK(!params.IsValid()); | 20 DCHECK(!params.IsValid()); |
| 20 media::AudioParameters params_copy(params); | 21 media::AudioParameters params_copy(params); |
| 21 | 22 |
| 22 // If the number of output channels is greater than the maximum, use the | 23 // If the number of output channels is greater than the maximum, use the |
| 23 // maximum allowed value. Hardware channels are ignored upstream, so it is | 24 // maximum allowed value. Hardware channels are ignored upstream, so it is |
| 24 // better to report a valid value if this is the only problem. | 25 // better to report a valid value if this is the only problem. |
| 25 if (params.channels() > media::limits::kMaxChannels) { | 26 if (params.channels() > media::limits::kMaxChannels) { |
| 26 DCHECK(params.channel_layout() == media::CHANNEL_LAYOUT_DISCRETE); | 27 DCHECK(params.channel_layout() == media::CHANNEL_LAYOUT_DISCRETE); |
| 27 params_copy.set_channels_for_discrete(media::limits::kMaxChannels); | 28 params_copy.set_channels_for_discrete(media::limits::kMaxChannels); |
| 28 } | 29 } |
| 29 | 30 |
| 30 // If hardware parameters are still invalid, use dummy parameters with | 31 // If hardware parameters are still invalid, use dummy parameters with |
| 31 // fake audio path and let the client handle the error. | 32 // fake audio path and let the client handle the error. |
| 32 return params_copy.IsValid() | 33 return params_copy.IsValid() |
| 33 ? params_copy | 34 ? params_copy |
| 34 : media::AudioParameters::UnavailableDeviceParams(); | 35 : media::AudioParameters::UnavailableDeviceParams(); |
| 35 } | 36 } |
| 36 | 37 |
| 37 media::AudioParameters GetDeviceParametersOnDeviceThread( | |
| 38 media::AudioManager* audio_manager, | |
| 39 const std::string& unique_id) { | |
| 40 DCHECK(audio_manager->GetTaskRunner()->BelongsToCurrentThread()); | |
| 41 | |
| 42 return media::AudioDeviceDescription::IsDefaultDevice(unique_id) | |
| 43 ? audio_manager->GetDefaultOutputStreamParameters() | |
| 44 : audio_manager->GetOutputStreamParameters(unique_id); | |
| 45 } | |
| 46 | |
| 47 } // namespace | 38 } // namespace |
| 48 | 39 |
| 49 namespace content { | 40 namespace content { |
| 50 | 41 |
| 51 AudioOutputAuthorizationHandler::AudioOutputAuthorizationHandler( | 42 AudioOutputAuthorizationHandler::AudioOutputAuthorizationHandler( |
| 52 media::AudioManager* audio_manager, | 43 media::AudioSystem* audio_system, |
| 53 MediaStreamManager* media_stream_manager, | 44 MediaStreamManager* media_stream_manager, |
| 54 int render_process_id, | 45 int render_process_id, |
| 55 const std::string& salt) | 46 const std::string& salt) |
| 56 : audio_manager_(audio_manager), | 47 : audio_system_(audio_system), |
| 57 media_stream_manager_(media_stream_manager), | 48 media_stream_manager_(media_stream_manager), |
| 58 permission_checker_(base::MakeUnique<MediaDevicesPermissionChecker>()), | 49 permission_checker_(base::MakeUnique<MediaDevicesPermissionChecker>()), |
| 59 render_process_id_(render_process_id), | 50 render_process_id_(render_process_id), |
| 60 salt_(salt), | 51 salt_(salt), |
| 61 weak_factory_(this) { | 52 weak_factory_(this) { |
| 62 DCHECK(media_stream_manager_); | 53 DCHECK(media_stream_manager_); |
| 63 } | 54 } |
| 64 | 55 |
| 65 void AudioOutputAuthorizationHandler::OverridePermissionsForTesting( | 56 void AudioOutputAuthorizationHandler::OverridePermissionsForTesting( |
| 66 bool override_value) { | 57 bool override_value) { |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 } | 175 } |
| 185 cb.Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, false, | 176 cb.Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, false, |
| 186 media::AudioParameters::UnavailableDeviceParams(), std::string()); | 177 media::AudioParameters::UnavailableDeviceParams(), std::string()); |
| 187 } | 178 } |
| 188 | 179 |
| 189 void AudioOutputAuthorizationHandler::GetDeviceParameters( | 180 void AudioOutputAuthorizationHandler::GetDeviceParameters( |
| 190 AuthorizationCompletedCallback cb, | 181 AuthorizationCompletedCallback cb, |
| 191 const std::string& raw_device_id) const { | 182 const std::string& raw_device_id) const { |
| 192 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 183 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 193 DCHECK(!raw_device_id.empty()); | 184 DCHECK(!raw_device_id.empty()); |
| 194 base::PostTaskAndReplyWithResult( | 185 audio_system_->GetOutputStreamParameters( |
| 195 // Note: In the case of a shutdown, the task to delete |audio_manager_| is | 186 raw_device_id, |
| 196 // posted to the audio thread after the IO thread is stopped, so the task | |
| 197 // to delete the audio manager hasn't been posted yet. This means that | |
| 198 // unretained is safe here. | |
| 199 // Mac is a special case. Since the audio manager lives on the UI thread | |
| 200 // on Mac, this task is posted to the UI thread, but tasks posted to the | |
| 201 // UI task runner will be ignored when the shutdown has progressed to | |
| 202 // deleting the audio manager, so this is still safe. | |
| 203 audio_manager_->GetTaskRunner(), FROM_HERE, | |
| 204 base::Bind(&GetDeviceParametersOnDeviceThread, | |
| 205 base::Unretained(audio_manager_), raw_device_id), | |
| 206 base::Bind(&AudioOutputAuthorizationHandler::DeviceParametersReceived, | 187 base::Bind(&AudioOutputAuthorizationHandler::DeviceParametersReceived, |
| 207 weak_factory_.GetWeakPtr(), std::move(cb), false, | 188 weak_factory_.GetWeakPtr(), std::move(cb), false, |
| 208 raw_device_id)); | 189 raw_device_id)); |
| 209 } | 190 } |
| 210 | 191 |
| 211 void AudioOutputAuthorizationHandler::DeviceParametersReceived( | 192 void AudioOutputAuthorizationHandler::DeviceParametersReceived( |
| 212 AuthorizationCompletedCallback cb, | 193 AuthorizationCompletedCallback cb, |
| 213 bool should_send_id, | 194 bool should_send_id, |
| 214 const std::string& raw_device_id, | 195 const std::string& raw_device_id, |
| 215 const media::AudioParameters& output_params) const { | 196 const media::AudioParameters& output_params) const { |
| 216 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 197 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 217 DCHECK(!raw_device_id.empty()); | 198 DCHECK(!raw_device_id.empty()); |
| 218 | 199 |
| 219 cb.Run(media::OUTPUT_DEVICE_STATUS_OK, should_send_id, | 200 cb.Run(media::OUTPUT_DEVICE_STATUS_OK, should_send_id, |
| 220 output_params.IsValid() ? output_params | 201 output_params.IsValid() ? output_params |
| 221 : TryToFixAudioParameters(output_params), | 202 : TryToFixAudioParameters(output_params), |
| 222 raw_device_id); | 203 raw_device_id); |
| 223 } | 204 } |
| 224 | 205 |
| 225 } // namespace content | 206 } // namespace content |
| OLD | NEW |