Improve use of NeverDestroyed
[WebKit-https.git] / Source / WebCore / platform / mediastream / CaptureDeviceManager.cpp
1 /*
2  * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "CaptureDeviceManager.h"
28
29 #if ENABLE(MEDIA_STREAM)
30
31 #include "Logging.h"
32 #include "MediaConstraints.h"
33 #include "RealtimeMediaSource.h"
34 #include "RealtimeMediaSourceCenter.h"
35 #include "RealtimeMediaSourceSettings.h"
36 #include <wtf/MainThread.h>
37 #include <wtf/text/StringHash.h>
38
39 using namespace WebCore;
40
41 CaptureDeviceManager::~CaptureDeviceManager()
42 {
43 }
44
45 Vector<CaptureDevice> CaptureDeviceManager::getAudioSourcesInfo()
46 {
47     Vector<CaptureDevice> sourcesInfo;
48     for (auto& captureDevice : captureDevices()) {
49         if (!captureDevice.enabled() || captureDevice.type() != CaptureDevice::DeviceType::Audio)
50             continue;
51
52         sourcesInfo.append(captureDevice);
53     }
54     LOG(Media, "CaptureDeviceManager::getSourcesInfo(%p), found %zu active devices", this, sourcesInfo.size());
55     return sourcesInfo;
56 }
57
58 Vector<CaptureDevice> CaptureDeviceManager::getVideoSourcesInfo()
59 {
60     Vector<CaptureDevice> sourcesInfo;
61     for (auto& captureDevice : captureDevices()) {
62         if (!captureDevice.enabled() || captureDevice.type() != CaptureDevice::DeviceType::Video)
63             continue;
64
65         sourcesInfo.append(captureDevice);
66     }
67     LOG(Media, "CaptureDeviceManager::getSourcesInfo(%p), found %zu active devices", this, sourcesInfo.size());
68     return sourcesInfo;
69 }
70
71 std::optional<CaptureDevice> CaptureDeviceManager::captureDeviceFromPersistentID(const String& captureDeviceID)
72 {
73     for (auto& device : captureDevices()) {
74         if (device.persistentId() == captureDeviceID)
75             return device;
76     }
77
78     return std::nullopt;
79 }
80
81 std::optional<CaptureDevice> CaptureDeviceManager::deviceWithUID(const String& deviceUID, RealtimeMediaSource::Type type)
82 {
83     for (auto& captureDevice : captureDevices()) {
84         CaptureDevice::DeviceType deviceType;
85
86         switch (type) {
87         case RealtimeMediaSource::Type::None:
88             continue;
89         case RealtimeMediaSource::Type::Audio:
90             deviceType = CaptureDevice::DeviceType::Audio;
91             break;
92         case RealtimeMediaSource::Type::Video:
93             deviceType = CaptureDevice::DeviceType::Video;
94             break;
95         }
96
97         if (captureDevice.persistentId() != deviceUID || captureDevice.type() != deviceType)
98             continue;
99
100         if (!captureDevice.enabled())
101             continue;
102
103         return captureDevice;
104     }
105
106     return std::nullopt;
107 }
108
109 static CaptureDeviceManager::ObserverToken nextObserverToken()
110 {
111     static CaptureDeviceManager::ObserverToken nextToken = 0;
112     return ++nextToken;
113 }
114
115 CaptureDeviceManager::ObserverToken CaptureDeviceManager::addCaptureDeviceChangedObserver(CaptureDeviceChangedCallback&& observer)
116 {
117     auto token = nextObserverToken();
118     m_observers.set(token, WTFMove(observer));
119     return token;
120 }
121
122 void CaptureDeviceManager::removeCaptureDeviceChangedObserver(ObserverToken token)
123 {
124     ASSERT(m_observers.contains(token));
125     m_observers.remove(token);
126 }
127
128
129 #endif // ENABLE(MEDIA_STREAM)