Support arbitrary video resolution in getUserMedia API
[WebKit-https.git] / Source / WebCore / platform / mediastream / mac / CoreAudioCaptureSource.h
1 /*
2  * Copyright (C) 2017-2018 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 #pragma once
27
28 #if ENABLE(MEDIA_STREAM)
29
30 #include "CAAudioStreamDescription.h"
31 #include "CaptureDevice.h"
32 #include "RealtimeMediaSource.h"
33 #include <AudioToolbox/AudioToolbox.h>
34 #include <CoreAudio/CoreAudioTypes.h>
35 #include <wtf/HashMap.h>
36 #include <wtf/Lock.h>
37 #include <wtf/RefCounted.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/text/WTFString.h>
40
41 typedef struct OpaqueCMClock* CMClockRef;
42
43 namespace WTF {
44 class MediaTime;
45 }
46
47 namespace WebCore {
48
49 class AudioSampleBufferList;
50 class AudioSampleDataSource;
51 class CaptureDeviceInfo;
52 class WebAudioSourceProviderAVFObjC;
53
54 class CoreAudioCaptureSource : public RealtimeMediaSource {
55 public:
56
57     static CaptureSourceOrError create(const String& deviceID, const MediaConstraints*);
58
59     WEBCORE_EXPORT static AudioCaptureFactory& factory();
60
61     void addEchoCancellationSource(AudioSampleDataSource&);
62     void removeEchoCancellationSource(AudioSampleDataSource&);
63
64     using MicrophoneDataCallback = WTF::Function<void(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)>;
65
66     uint64_t addMicrophoneDataConsumer(MicrophoneDataCallback&&);
67     void removeMicrophoneDataConsumer(uint64_t);
68
69     CMClockRef timebaseClock();
70
71     void beginInterruption();
72     void endInterruption();
73     void scheduleReconfiguration();
74
75 protected:
76     CoreAudioCaptureSource(const String& deviceID, const String& label, uint32_t persistentID);
77     virtual ~CoreAudioCaptureSource();
78
79 private:
80     friend class CoreAudioSharedUnit;
81     friend class CoreAudioCaptureSourceFactory;
82
83     bool isCaptureSource() const final { return true; }
84     void startProducingData() final;
85     void stopProducingData() final;
86
87     std::optional<Vector<int>> discreteSampleRates() const final { return { { 8000, 16000, 32000, 44100, 48000, 96000 } }; }
88
89     const RealtimeMediaSourceCapabilities& capabilities() final;
90     const RealtimeMediaSourceSettings& settings() final;
91     void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final;
92
93     bool interrupted() const final;
94
95     uint32_t m_captureDeviceID { 0 };
96
97     std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
98     std::optional<RealtimeMediaSourceSettings> m_currentSettings;
99
100     enum class SuspensionType { None, WhilePaused, WhilePlaying };
101     SuspensionType m_suspendType { SuspensionType::None };
102
103     enum class ReconfigurationState { None, Required, Ongoing };
104     ReconfigurationState m_reconfigurationState { ReconfigurationState::None };
105
106     bool m_reconfigurationRequired { false };
107     bool m_suspendPending { false };
108     bool m_resumePending { false };
109 };
110
111 class CoreAudioCaptureSourceFactory : public RealtimeMediaSource::AudioCaptureFactory {
112 public:
113     static CoreAudioCaptureSourceFactory& singleton();
114
115     void beginInterruption();
116     void endInterruption();
117     void scheduleReconfiguration();
118
119 #if PLATFORM(IOS)
120     void setCoreAudioActiveSource(CoreAudioCaptureSource& source) { setActiveSource(source); }
121     void unsetCoreAudioActiveSource(CoreAudioCaptureSource& source) { unsetActiveSource(source); }
122     CoreAudioCaptureSource* coreAudioActiveSource() { return static_cast<CoreAudioCaptureSource*>(activeSource()); }
123 #else
124     CoreAudioCaptureSource* coreAudioActiveSource() { return nullptr; }
125 #endif
126
127 private:
128     CaptureSourceOrError createAudioCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final
129     {
130         return CoreAudioCaptureSource::create(device.persistentId(), constraints);
131     }
132 };
133
134 } // namespace WebCore
135
136 #endif // ENABLE(MEDIA_STREAM)