[MediaSource] Push capabilities across process boundary during UIProcess capture.
[WebKit-https.git] / Source / WebCore / platform / mediastream / mac / CoreAudioCaptureSource.h
1 /*
2  * Copyright (C) 2017 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
53 class CoreAudioCaptureSource : public RealtimeMediaSource {
54 public:
55
56     static RefPtr<CoreAudioCaptureSource> create(const CaptureDevice&, const MediaConstraints*, String&);
57
58     WEBCORE_EXPORT static CaptureFactory& factory();
59
60     void addEchoCancellationSource(AudioSampleDataSource&);
61     void removeEchoCancellationSource(AudioSampleDataSource&);
62
63     using MicrophoneDataCallback = std::function<void(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)>;
64
65     uint64_t addMicrophoneDataConsumer(MicrophoneDataCallback&&);
66     void removeMicrophoneDataConsumer(uint64_t);
67
68     CMClockRef timebaseClock();
69
70 private:
71     CoreAudioCaptureSource(const CaptureDevice&);
72     virtual ~CoreAudioCaptureSource();
73
74     void startProducingData() final;
75     void stopProducingData() final;
76     bool isProducingData() const final { return m_ioUnitStarted; }
77
78     OSStatus suspend();
79     OSStatus resume();
80
81     const RealtimeMediaSourceCapabilities& capabilities() const final;
82     const RealtimeMediaSourceSettings& settings() const final;
83
84     OSStatus setupAudioUnits();
85     OSStatus configureSpeakerProc();
86     OSStatus configureMicrophoneProc();
87     OSStatus defaultOutputDevice(uint32_t*);
88     OSStatus defaultInputDevice(uint32_t*);
89
90     void checkTimestamps(const AudioTimeStamp&, uint64_t, double);
91
92     static OSStatus microphoneCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32, UInt32, AudioBufferList*);
93     OSStatus processMicrophoneSamples(AudioUnitRenderActionFlags&, const AudioTimeStamp&, UInt32, UInt32, AudioBufferList*);
94
95     static OSStatus speakerCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32, UInt32, AudioBufferList*);
96     OSStatus provideSpeakerData(AudioUnitRenderActionFlags&, const AudioTimeStamp&, UInt32, UInt32, AudioBufferList*);
97
98     static double preferredSampleRate();
99     static double preferredIOBufferDuration();
100
101     AudioUnit m_ioUnit { nullptr };
102     String m_ioUnitName;
103
104     // Only read/modified from the IO thread.
105     Vector<Ref<AudioSampleDataSource>> m_activeSources;
106
107     enum QueueAction { Add, Remove };
108     Vector<std::pair<QueueAction, Ref<AudioSampleDataSource>>> m_pendingSources;
109
110     uint32_t m_captureDeviceID { 0 };
111
112     CAAudioStreamDescription m_microphoneProcFormat;
113     RefPtr<AudioSampleBufferList> m_microphoneSampleBuffer;
114     uint64_t m_microphoneProcsCalled { 0 };
115     uint64_t m_latestMicTimeStamp { 0 };
116
117     HashMap<uint64_t, MicrophoneDataCallback> m_microphoneDataCallbacks;
118     uint64_t m_nextMicrophoneDataCallbackID { 0 };
119
120     CAAudioStreamDescription m_speakerProcFormat;
121     RefPtr<AudioSampleBufferList> m_speakerSampleBuffer;
122     uint64_t m_speakerProcsCalled { 0 };
123
124     double m_DTSConversionRatio { 0 };
125
126     bool m_ioUnitInitialized { false };
127     bool m_ioUnitStarted { false };
128
129     Lock m_pendingSourceQueueLock;
130     Lock m_internalStateLock;
131
132     mutable std::unique_ptr<RealtimeMediaSourceCapabilities> m_capabilities;
133     mutable RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
134     RealtimeMediaSourceSettings m_currentSettings;
135 };
136
137 } // namespace WebCore
138
139 #endif // ENABLE(MEDIA_STREAM)