std::move(task_runner), std::move(callback)));
}
+bool is_forwarding_device(const std::string string) {
+ return string.find("forwarding") != std::string::npos;
+}
+
} // namespace content
scoped_refptr<base::SequencedTaskRunner> task_runner,
OptionalDeviceIdCallback callback);
+bool is_forwarding_device(const std::string string);
+
} // namespace content
#endif // CONTENT_BROWSER_MEDIA_MEDIA_DEVICES_UTIL_H_
return audio_devices_;
}
+const blink::MediaStreamDevices&
+MediaCaptureDevicesImpl::GetAudioForwardDevices() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (!devices_enumerated_) {
+ EnsureMonitorCaptureDevices();
+ devices_enumerated_ = true;
+ }
+ return audio_forward_devices_;
+}
+
const blink::MediaStreamDevices&
MediaCaptureDevicesImpl::GetVideoCaptureDevices() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
MediaCaptureDevicesImpl::~MediaCaptureDevicesImpl() {
}
+blink::MediaStreamDevices MediaCaptureDevicesImpl::ExtractAudioForwardDevices(
+ blink::MediaStreamDevices& devices) {
+ // Find out tizen forwarding device, and classify it as
+ // |DISPLAY_AUDIO_CAPTURE| device.
+ blink::MediaStreamDevices forward_devices;
+ for (auto device = devices.begin(); device != devices.end(); device++) {
+ if (is_forwarding_device(device->name)) {
+ device->type = blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE;
+ forward_devices.push_back(*device);
+ devices.erase(device);
+ }
+ }
+ return forward_devices;
+}
+
void MediaCaptureDevicesImpl::UpdateAudioDevicesOnUIThread(
const blink::MediaStreamDevices& devices) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
devices_enumerated_ = true;
+#if BUILDFLAG(IS_TIZEN_TV)
+ blink::MediaStreamDevices all_devices = devices;
+ audio_forward_devices_ = ExtractAudioForwardDevices(all_devices);
+ audio_devices_ = all_devices;
+#else
audio_devices_ = devices;
+#endif
}
void MediaCaptureDevicesImpl::UpdateVideoDevicesOnUIThread(
// Overriden from MediaCaptureDevices
const blink::MediaStreamDevices& GetAudioCaptureDevices() override;
+ const blink::MediaStreamDevices& GetAudioForwardDevices() override;
const blink::MediaStreamDevices& GetVideoCaptureDevices() override;
void AddVideoCaptureObserver(media::VideoCaptureObserver* observer) override;
void RemoveAllVideoCaptureObservers() override;
MediaCaptureDevicesImpl();
~MediaCaptureDevicesImpl() override;
+ blink::MediaStreamDevices ExtractAudioForwardDevices(
+ blink::MediaStreamDevices& devices);
void UpdateAudioDevicesOnUIThread(const blink::MediaStreamDevices& devices);
void UpdateVideoDevicesOnUIThread(const blink::MediaStreamDevices& devices);
// A list of cached audio capture devices.
blink::MediaStreamDevices audio_devices_;
+ blink::MediaStreamDevices audio_forward_devices_;
// A list of cached video capture devices.
blink::MediaStreamDevices video_devices_;
parameters.GetBufferDuration());
LOG(INFO) << "audio device id:" << device_info.device_id
<< ",default id:" << default_device_id;
+
+#if BUILDFLAG(IS_TIZEN_TV)
+ // Tizen forwarding device is used to capture all tizen output audio,
+ // only available for getDisplayMedia. make it's capibility be invisible
+ // for other case.
+ if (is_forwarding_device(device_info.label)) {
+ LOG(INFO) << "ignore tizen forwarding device capability.";
+ continue;
+ }
+#endif
+
if (device_info.device_id == default_device_id)
current_audio_input_capabilities_.insert(
current_audio_input_capabilities_.begin(), std::move(capabilities));
// Return all Audio/Video devices.
virtual const blink::MediaStreamDevices& GetAudioCaptureDevices() = 0;
+ virtual const blink::MediaStreamDevices& GetAudioForwardDevices() = 0;
virtual const blink::MediaStreamDevices& GetVideoCaptureDevices() = 0;
virtual void AddVideoCaptureObserver(
continue;
}
- if (input && device_type == SOUND_DEVICE_FORWARDING) {
- LOG(ERROR) << "Device with type SOUND_DEVICE_FORWARDING is audio input "
- "device but it doesn't provide microphone data. ignore it:"
- << "Device - ID:" << id << ". Name:" << name
- << ". type:" << device_type;
- continue;
+ std::string modified_name{name};
+ if (device_type == SOUND_DEVICE_FORWARDING) {
+ // Used to distinguish whether it is a forwarding device by name, or we
+ // need to deliver the device type.
+ modified_name += "(forwarding)";
}
LOG(INFO) << "Device - ID:" << id << ". Name:" << name
+ << ". modified name:" << modified_name
<< ". type:" << device_type;
#if TIZEN_VERSION_AT_LEAST(9, 0, 0)
- device_names->push_front(AudioDeviceName(name, std::to_string(id)));
+ device_names->push_front(
+ AudioDeviceName(modified_name, std::to_string(id)));
}
#else
if (device_type == SOUND_DEVICE_BUILTIN_MIC) {
device_names_built_in.push_back(
AudioDeviceName(name, std::to_string(id)));
} else {
- device_names->push_back(AudioDeviceName(name, std::to_string(id)));
+ device_names->push_back(
+ AudioDeviceName(modified_name, std::to_string(id)));
}
}
return false;
}
- if (device_type != SOUND_DEVICE_BUILTIN_MIC) {
+ if (device_type != SOUND_DEVICE_BUILTIN_MIC &&
+ device_type != SOUND_DEVICE_FORWARDING) {
ret = sound_manager_add_device_for_stream_routing(stream_info_,
sound_device_);
if (ret != SOUND_MANAGER_ERROR_NONE) {
return nullptr;
}
+static const blink::MediaStreamDevice* GetForwardingAudioDevice() {
+ const blink::MediaStreamDevices& audio_devices =
+ MediaCaptureDevices::GetInstance()->GetAudioForwardDevices();
+ for (const auto& device : audio_devices) {
+ if (device.type == blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE) {
+ return &device;
+ }
+ }
+
+ return nullptr;
+}
+
static const blink::MediaStreamDevice* GetRequestedVideoDevice(
const std::string& device_id) {
const blink::MediaStreamDevices& video_devices =
blink::mojom::StreamDevices& stream_devices =
*stream_devices_set.stream_devices[0];
+ const blink::MediaStreamDevice* audio_device = nullptr;
+ bool has_audio = true;
if (request.audio_type ==
blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE) {
- const blink::MediaStreamDevice* audio_device =
- GetRequestedAudioDevice(request.requested_audio_device_id);
- if (audio_device) {
- stream_devices.audio_device = *audio_device;
- } else {
+ audio_device = GetRequestedAudioDevice(request.requested_audio_device_id);
+ } else if (request.audio_type ==
+ blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE) {
+ audio_device = GetForwardingAudioDevice();
+ } else {
+ has_audio = false;
+ }
+ if (has_audio) {
+ if (!audio_device) {
std::move(callback).Run(
blink::mojom::StreamDevicesSet(),
blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED,
std::unique_ptr<MediaStreamUI>());
return;
}
+ stream_devices.audio_device = *audio_device;
}
if (request.video_type ==