Changeset 270158 in webkit
- Timestamp:
- Nov 21, 2020 9:51:10 PM (20 months ago)
- Location:
- trunk
- Files:
-
- 12 added
- 16 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/TestExpectations (modified) (1 diff)
-
LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html (modified) (2 diffs)
-
LayoutTests/fast/speechrecognition/start-recognition-then-stop-expected.txt (added)
-
LayoutTests/fast/speechrecognition/start-recognition-then-stop.html (added)
-
LayoutTests/fast/speechrecognition/start-second-recognition-expected.txt (added)
-
LayoutTests/fast/speechrecognition/start-second-recognition.html (added)
-
LayoutTests/platform/wk2/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (2 diffs)
-
Source/WebCore/Modules/speech/SpeechRecognitionCaptureSource.cpp (added)
-
Source/WebCore/Modules/speech/SpeechRecognitionCaptureSource.h (added)
-
Source/WebCore/Modules/speech/SpeechRecognitionCaptureSourceImpl.cpp (added)
-
Source/WebCore/Modules/speech/SpeechRecognitionCaptureSourceImpl.h (added)
-
Source/WebCore/Modules/speech/SpeechRecognizer.cpp (added)
-
Source/WebCore/Modules/speech/SpeechRecognizer.h (added)
-
Source/WebCore/Sources.txt (modified) (1 diff)
-
Source/WebCore/SourcesCocoa.txt (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (13 diffs)
-
Source/WebCore/platform/cocoa/MediaUtilities.cpp (added)
-
Source/WebCore/platform/cocoa/MediaUtilities.h (added)
-
Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm (modified) (2 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (modified) (7 diffs)
-
Source/WebKit/UIProcess/SpeechRecognitionServer.h (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r270157 r270158 1 2020-11-21 Sihui Liu <sihui_liu@apple.com> 2 3 Implement audio capture for SpeechRecognition on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=218855 5 <rdar://problem/71331001> 6 7 Reviewed by Youenn Fablet. 8 9 * TestExpectations: 10 * fast/speechrecognition/start-recognition-in-removed-iframe.html: mark test as async to avoid flakiness. 11 * fast/speechrecognition/start-recognition-then-stop-expected.txt: Added. 12 * fast/speechrecognition/start-recognition-then-stop.html: Added. 13 * fast/speechrecognition/start-second-recognition-expected.txt: Added. 14 * fast/speechrecognition/start-second-recognition.html: Added. 15 * platform/wk2/TestExpectations: 16 1 17 2020-11-21 Chris Dumez <cdumez@apple.com> 2 18 -
trunk/LayoutTests/TestExpectations
r270045 r270158 180 180 http/tests/in-app-browser-privacy/ [ Skip ] 181 181 fast/speechrecognition/permission-error.html [ Skip ] 182 fast/speechrecognition/start-recognition-then-stop.html [ Skip ] 183 fast/speechrecognition/start-second-recognition.html [ Skip ] 182 184 183 185 # Only partial support on Cocoa platforms. -
trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html
r269810 r270158 6 6 description("Verify that process does not crash when starting recognition in a removed iframe."); 7 7 8 if (window.testRunner) { 9 jsTestIsAsync = true; 10 } 11 8 12 function test() 9 13 { 10 14 iframe = document.getElementsByTagName('iframe')[0]; 11 shouldNotThrow("iframe.contentWindow.startRecognition()"); 15 shouldNotThrow("iframe.contentWindow.startRecognition()"); 12 16 } 13 17 … … 15 19 { 16 20 shouldNotThrow("iframe.parentNode.removeChild(iframe)"); 21 setTimeout(() => finishJSTest(), 0); 17 22 } 18 23 -
trunk/LayoutTests/platform/wk2/TestExpectations
r269810 r270158 805 805 js/throw-large-string-oom.html [ Pass ] 806 806 fast/speechrecognition/permission-error.html [ Pass ] 807 fast/speechrecognition/start-recognition-then-stop.html [ Pass ] 808 fast/speechrecognition/start-second-recognition.html [ Pass ] 807 809 fullscreen/full-screen-enter-while-exiting.html [ Pass ] -
trunk/Source/WebCore/ChangeLog
r270157 r270158 1 2020-11-21 Sihui Liu <sihui_liu@apple.com> 2 3 Implement audio capture for SpeechRecognition on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=218855 5 <rdar://problem/71331001> 6 7 Reviewed by Youenn Fablet. 8 9 Introduce SpeechRecognizer, which performs audio capture and speech recogntion operations. On start, 10 SpeechRecognizer creates a SpeechRecognitionCaptureSource and starts audio capturing. On stop, SpeechRecognizer 11 clears the source and stops recognizing. SpeechRecognizer can only handle one request at a time, so calling 12 start on already started SpeechRecognizer would cause ongoing request to be aborted. 13 14 Tests: fast/speechrecognition/start-recognition-then-stop.html 15 fast/speechrecognition/start-second-recognition.html 16 17 * Headers.cmake: 18 * Modules/speech/SpeechRecognitionCaptureSource.cpp: Added. 19 (WebCore::SpeechRecognitionCaptureSource::SpeechRecognitionCaptureSource): 20 * Modules/speech/SpeechRecognitionCaptureSource.h: Added. 21 * Modules/speech/SpeechRecognitionCaptureSourceImpl.cpp: Added. SpeechRecognitionCaptureSourceImpl provides 22 implementation of SpeechRecognitionCaptureSource on when ENABLE(MEDIA_STREAM) is true. 23 (WebCore::nextLogIdentifier): 24 (WebCore::nullLogger): 25 (WebCore::SpeechRecognitionCaptureSourceImpl::SpeechRecognitionCaptureSourceImpl): 26 (WebCore::SpeechRecognitionCaptureSourceImpl::~SpeechRecognitionCaptureSourceImpl): 27 (WebCore::SpeechRecognitionCaptureSourceImpl::audioSamplesAvailable): Push data to buffer, signal main thread to 28 pull from buffer and invoke data callback. 29 (WebCore::SpeechRecognitionCaptureSourceImpl::sourceStarted): 30 (WebCore::SpeechRecognitionCaptureSourceImpl::sourceStopped): 31 (WebCore::SpeechRecognitionCaptureSourceImpl::sourceMutedChanged): 32 * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: Added. 33 * Modules/speech/SpeechRecognizer.cpp: Added. 34 (WebCore::SpeechRecognizer::SpeechRecognizer): 35 (WebCore::SpeechRecognizer::reset): 36 (WebCore::SpeechRecognizer::start): 37 (WebCore::SpeechRecognizer::startInternal): 38 (WebCore::SpeechRecognizer::stop): 39 (WebCore::SpeechRecognizer::stopInternal): 40 * Modules/speech/SpeechRecognizer.h: Added. 41 (WebCore::SpeechRecognizer::currentClientIdentifier const): 42 * Sources.txt: 43 * SourcesCocoa.txt: 44 * WebCore.xcodeproj/project.pbxproj: 45 * platform/cocoa/MediaUtilities.cpp: Added. 46 (WebCore::createAudioFormatDescription): 47 (WebCore::createAudioSampleBuffer): 48 * platform/cocoa/MediaUtilities.h: Added. 49 * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm: Move code for creating CMSampleBufferRef to 50 MediaUtilities.h/cpp so it can shared between SpeechRecognition and UserMedia, as Speech recognition backend 51 will take CMSampleBufferRef as input. 52 (WebCore::createAudioFormatDescription): Deleted. 53 (WebCore::createAudioSampleBuffer): Deleted. 54 1 55 2020-11-21 Chris Dumez <cdumez@apple.com> 2 56 -
trunk/Source/WebCore/Headers.cmake
r269984 r270158 117 117 Modules/plugins/YouTubePluginReplacement.h 118 118 119 Modules/speech/SpeechRecognitionCaptureSource.h 120 Modules/speech/SpeechRecognitionCaptureSourceImpl.h 119 121 Modules/speech/SpeechRecognitionConnection.h 120 122 Modules/speech/SpeechRecognitionConnectionClient.h … … 125 127 Modules/speech/SpeechRecognitionResultData.h 126 128 Modules/speech/SpeechRecognitionUpdate.h 129 Modules/speech/SpeechRecognizer.h 127 130 128 131 Modules/streams/ReadableStreamChunk.h -
trunk/Source/WebCore/Sources.txt
r270121 r270158 206 206 Modules/speech/SpeechRecognitionResultList.cpp 207 207 Modules/speech/SpeechRecognitionUpdate.cpp 208 Modules/speech/SpeechRecognitionCaptureSource.cpp 209 Modules/speech/SpeechRecognitionCaptureSourceImpl.cpp 210 Modules/speech/SpeechRecognizer.cpp 208 211 Modules/speech/DOMWindowSpeechSynthesis.cpp 209 212 Modules/speech/SpeechSynthesis.cpp -
trunk/Source/WebCore/SourcesCocoa.txt
r270067 r270158 239 239 platform/cocoa/LocalizedStringsCocoa.mm 240 240 platform/cocoa/MIMETypeRegistryCocoa.mm 241 platform/cocoa/MediaUtilities.cpp 241 242 platform/cocoa/NetworkExtensionContentFilter.mm 242 243 platform/cocoa/ParentalControlsContentFilter.mm -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r270120 r270158 121 121 0738E5EC2499839000DA101C /* AVOutputDeviceMenuControllerTargetPicker.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0738E5EA249968AD00DA101C /* AVOutputDeviceMenuControllerTargetPicker.mm */; }; 122 122 073A15542177A42600EA08F2 /* RemoteVideoSample.h in Headers */ = {isa = PBXBuildFile; fileRef = 073A15532177A39A00EA08F2 /* RemoteVideoSample.h */; settings = {ATTRIBUTES = (Private, ); }; }; 123 073B87671E4385AC0071C0EC /* AudioSampleBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87631E43859D0071C0EC /* AudioSampleBufferList.h */; };124 073B87691E4385AC0071C0EC /* AudioSampleDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87651E43859D0071C0EC /* AudioSampleDataSource.h */; };123 073B87671E4385AC0071C0EC /* AudioSampleBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87631E43859D0071C0EC /* AudioSampleBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; }; 124 073B87691E4385AC0071C0EC /* AudioSampleDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87651E43859D0071C0EC /* AudioSampleDataSource.h */; settings = {ATTRIBUTES = (Private, ); }; }; 125 125 074E82BB18A69F0E007EF54C /* PlatformTimeRanges.h in Headers */ = {isa = PBXBuildFile; fileRef = 074E82B918A69F0E007EF54C /* PlatformTimeRanges.h */; settings = {ATTRIBUTES = (Private, ); }; }; 126 126 075033A8252BD36800F70CE3 /* VideoPlaybackQualityMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 075033A6252BD36800F70CE3 /* VideoPlaybackQualityMetrics.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2796 2796 939885C408B7E3D100E707C4 /* EventNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 939885C208B7E3D100E707C4 /* EventNames.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2797 2797 939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 939B02ED0EA2DBC400C54570 /* WidthIterator.h */; }; 2798 939C0D272564E47F00B3211B /* SpeechRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 939C0D2125648C3900B3211B /* SpeechRecognizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2799 939C0D2B2564E7F300B3211B /* MediaUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 939C0D292564E7F200B3211B /* MediaUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2798 2800 93A0482825495506000AC462 /* SpeechRecognitionProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A0482625495500000AC462 /* SpeechRecognitionProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2799 2801 93A0482925495511000AC462 /* SpeechRecognitionResultData.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A0481B254954E4000AC462 /* SpeechRecognitionResultData.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2857 2859 93F1D5C112D5335600832BEC /* JSWebGLLoseContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F1D5BF12D5335600832BEC /* JSWebGLLoseContext.h */; }; 2858 2860 93F2CC932427FB9C005851D8 /* CharacterRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F2CC912427FB9A005851D8 /* CharacterRange.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2861 93F6B81F2567A08C00A08488 /* SpeechRecognitionCaptureSourceImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F6B81C25679F7000A08488 /* SpeechRecognitionCaptureSourceImpl.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2862 93F6B8222567A65600A08488 /* SpeechRecognitionCaptureSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F6B81B25679F6F00A08488 /* SpeechRecognitionCaptureSource.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2859 2863 93F6F1EE127F70B10055CB06 /* WebGLContextEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F6F1EB127F70B10055CB06 /* WebGLContextEvent.h */; }; 2860 2864 93F925430F7EF5B8007E37C9 /* RadioButtonGroups.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F925410F7EF5B8007E37C9 /* RadioButtonGroups.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 11454 11458 939B02EC0EA2DBC400C54570 /* WidthIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WidthIterator.cpp; sourceTree = "<group>"; }; 11455 11459 939B02ED0EA2DBC400C54570 /* WidthIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidthIterator.h; sourceTree = "<group>"; }; 11460 939C0D2125648C3900B3211B /* SpeechRecognizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpeechRecognizer.h; sourceTree = "<group>"; }; 11461 939C0D2325648C4E00B3211B /* SpeechRecognizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SpeechRecognizer.cpp; sourceTree = "<group>"; }; 11462 939C0D282564E7F200B3211B /* MediaUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaUtilities.cpp; sourceTree = "<group>"; }; 11463 939C0D292564E7F200B3211B /* MediaUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaUtilities.h; sourceTree = "<group>"; }; 11456 11464 93A0481B254954E4000AC462 /* SpeechRecognitionResultData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionResultData.h; sourceTree = "<group>"; }; 11457 11465 93A0481D254954E5000AC462 /* SpeechRecognitionConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionConnection.h; sourceTree = "<group>"; }; … … 11540 11548 93F1D5BF12D5335600832BEC /* JSWebGLLoseContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLLoseContext.h; sourceTree = "<group>"; }; 11541 11549 93F2CC912427FB9A005851D8 /* CharacterRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharacterRange.h; sourceTree = "<group>"; }; 11550 93F6B81B25679F6F00A08488 /* SpeechRecognitionCaptureSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionCaptureSource.h; sourceTree = "<group>"; }; 11551 93F6B81C25679F7000A08488 /* SpeechRecognitionCaptureSourceImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionCaptureSourceImpl.h; sourceTree = "<group>"; }; 11552 93F6B81D25679F7000A08488 /* SpeechRecognitionCaptureSourceImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpeechRecognitionCaptureSourceImpl.cpp; sourceTree = "<group>"; }; 11553 93F6B81E25679F7100A08488 /* SpeechRecognitionCaptureSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpeechRecognitionCaptureSource.cpp; sourceTree = "<group>"; }; 11542 11554 93F6F1EA127F70B10055CB06 /* WebGLContextEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebGLContextEvent.cpp; sourceTree = "<group>"; }; 11543 11555 93F6F1EB127F70B10055CB06 /* WebGLContextEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebGLContextEvent.h; sourceTree = "<group>"; }; … … 23588 23600 sourceTree = "<group>"; 23589 23601 }; 23602 93F6B80E2566EDE100A08488 /* cocoa */ = { 23603 isa = PBXGroup; 23604 children = ( 23605 ); 23606 path = cocoa; 23607 sourceTree = "<group>"; 23608 }; 23590 23609 946D37271D6CB2250077084F /* parser */ = { 23591 23610 isa = PBXGroup; … … 24424 24443 06E81ED60AB5D5E900C87837 /* LocalCurrentGraphicsContext.h */, 24425 24444 1A4832B21A953BA6008B4DFE /* LocalizedStringsCocoa.mm */, 24445 939C0D282564E7F200B3211B /* MediaUtilities.cpp */, 24446 939C0D292564E7F200B3211B /* MediaUtilities.h */, 24426 24447 C53D39331C97892D007F3AE9 /* MIMETypeRegistryCocoa.mm */, 24427 24448 A19D93491AA11B1E00B46C24 /* NetworkExtensionContentFilter.h */, … … 25616 25637 isa = PBXGroup; 25617 25638 children = ( 25639 93F6B80E2566EDE100A08488 /* cocoa */, 25618 25640 AA2A5ABA16A485D500975A25 /* DOMWindow+SpeechSynthesis.idl */, 25619 25641 AA2A5AB816A485D500975A25 /* DOMWindowSpeechSynthesis.cpp */, … … 25625 25647 934950BC2539434E0099F171 /* SpeechRecognitionAlternative.h */, 25626 25648 934950BB2539434E0099F171 /* SpeechRecognitionAlternative.idl */, 25649 93F6B81E25679F7100A08488 /* SpeechRecognitionCaptureSource.cpp */, 25650 93F6B81B25679F6F00A08488 /* SpeechRecognitionCaptureSource.h */, 25651 93F6B81D25679F7000A08488 /* SpeechRecognitionCaptureSourceImpl.cpp */, 25652 93F6B81C25679F7000A08488 /* SpeechRecognitionCaptureSourceImpl.h */, 25627 25653 93A0481D254954E5000AC462 /* SpeechRecognitionConnection.h */, 25628 25654 93A04824254954E9000AC462 /* SpeechRecognitionConnectionClient.h */, … … 25649 25675 93D6B76E254B8E1B0058DD3A /* SpeechRecognitionUpdate.cpp */, 25650 25676 93D6B76D254B8E1B0058DD3A /* SpeechRecognitionUpdate.h */, 25677 939C0D2325648C4E00B3211B /* SpeechRecognizer.cpp */, 25678 939C0D2125648C3900B3211B /* SpeechRecognizer.h */, 25651 25679 AA2A5ABD16A485D500975A25 /* SpeechSynthesis.cpp */, 25652 25680 AA2A5ABE16A485D500975A25 /* SpeechSynthesis.h */, … … 33535 33563 07C1C0E21BFB600100BD2256 /* MediaTrackSupportedConstraints.h in Headers */, 33536 33564 07611DC12440E59B00D80704 /* MediaUsageInfo.h in Headers */, 33565 939C0D2B2564E7F300B3211B /* MediaUtilities.h in Headers */, 33537 33566 51E1BAC31BD8064E0055D81F /* MemoryBackingStoreTransaction.h in Headers */, 33538 33567 BCB16C180979C3BD00467741 /* MemoryCache.h in Headers */, … … 34427 34456 934950CD253943610099F171 /* SpeechRecognition.h in Headers */, 34428 34457 934950CE253943650099F171 /* SpeechRecognitionAlternative.h in Headers */, 34458 93F6B8222567A65600A08488 /* SpeechRecognitionCaptureSource.h in Headers */, 34459 93F6B81F2567A08C00A08488 /* SpeechRecognitionCaptureSourceImpl.h in Headers */, 34429 34460 93A0482C25495519000AC462 /* SpeechRecognitionConnection.h in Headers */, 34430 34461 93A0482E2549551E000AC462 /* SpeechRecognitionConnectionClient.h in Headers */, … … 34441 34472 934950D6253943810099F171 /* SpeechRecognitionResultList.h in Headers */, 34442 34473 93D6B771254BAB450058DD3A /* SpeechRecognitionUpdate.h in Headers */, 34474 939C0D272564E47F00B3211B /* SpeechRecognizer.h in Headers */, 34443 34475 AA2A5AD416A4861100975A25 /* SpeechSynthesis.h in Headers */, 34444 34476 C14938072234551A000CD707 /* SpeechSynthesisClient.h in Headers */, -
trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm
r268363 r270158 35 35 #include "MediaRecorderPrivateOptions.h" 36 36 #include "MediaStreamTrackPrivate.h" 37 #include "MediaUtilities.h" 37 38 #include "VideoSampleBufferCompressor.h" 38 39 #include "WebAudioBufferList.h" … … 444 445 } 445 446 446 static inline RetainPtr<CMFormatDescriptionRef> createAudioFormatDescription(const AudioStreamDescription& description)447 {448 auto basicDescription = WTF::get<const AudioStreamBasicDescription*>(description.platformDescription().description);449 CMFormatDescriptionRef format = nullptr;450 auto error = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, basicDescription, 0, NULL, 0, NULL, NULL, &format);451 if (error) {452 RELEASE_LOG_ERROR(MediaStream, "MediaRecorderPrivateWriter CMAudioFormatDescriptionCreate failed with %d", error);453 return nullptr;454 }455 return adoptCF(format);456 }457 458 static inline RetainPtr<CMSampleBufferRef> createAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, CMTime time, size_t sampleCount)459 {460 auto format = createAudioFormatDescription(description);461 if (!format)462 return nullptr;463 464 CMSampleBufferRef sampleBuffer = nullptr;465 auto error = CMAudioSampleBufferCreateWithPacketDescriptions(kCFAllocatorDefault, NULL, false, NULL, NULL, format.get(), sampleCount, time, NULL, &sampleBuffer);466 if (error) {467 RELEASE_LOG_ERROR(MediaStream, "MediaRecorderPrivateWriter createAudioSampleBufferWithPacketDescriptions failed with %d", error);468 return nullptr;469 }470 auto buffer = adoptCF(sampleBuffer);471 472 error = CMSampleBufferSetDataBufferFromAudioBufferList(buffer.get(), kCFAllocatorDefault, kCFAllocatorDefault, 0, downcast<WebAudioBufferList>(data).list());473 if (error) {474 RELEASE_LOG_ERROR(MediaStream, "MediaRecorderPrivateWriter CMSampleBufferSetDataBufferFromAudioBufferList failed with %d", error);475 return nullptr;476 }477 return buffer;478 }479 480 447 void MediaRecorderPrivateWriter::appendAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, const WTF::MediaTime&, size_t sampleCount) 481 448 { -
trunk/Source/WebKit/ChangeLog
r270156 r270158 1 2020-11-21 Sihui Liu <sihui_liu@apple.com> 2 3 Implement audio capture for SpeechRecognition on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=218855 5 <rdar://problem/71331001> 6 7 Reviewed by Youenn Fablet. 8 9 * UIProcess/SpeechRecognitionPermissionManager.cpp: 10 (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest): Check and enable mock devices based on 11 preference as SpeechRecognition needs it for testing. 12 * UIProcess/SpeechRecognitionServer.cpp: 13 (WebKit::SpeechRecognitionServer::start): 14 (WebKit::SpeechRecognitionServer::requestPermissionForRequest): 15 (WebKit::SpeechRecognitionServer::handleRequest): 16 (WebKit::SpeechRecognitionServer::stop): 17 (WebKit::SpeechRecognitionServer::abort): 18 (WebKit::SpeechRecognitionServer::invalidate): 19 (WebKit::SpeechRecognitionServer::sendUpdate): 20 (WebKit::SpeechRecognitionServer::stopRequest): Deleted. 21 (WebKit::SpeechRecognitionServer::abortRequest): Deleted. 22 * UIProcess/SpeechRecognitionServer.h: 23 * UIProcess/WebPageProxy.cpp: 24 (WebKit::WebPageProxy::syncIfMockDevicesEnabledChanged): 25 * UIProcess/WebPageProxy.h: 26 1 27 2020-11-21 Simon Fraser <simon.fraser@apple.com> 2 28 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp
r269918 r270158 105 105 106 106 if (m_page.preferences().mockCaptureDevicesEnabled()) { 107 m_page.syncIfMockDevicesEnabledChanged(); 107 108 m_microphoneCheck = CheckResult::Granted; 108 109 m_speechRecognitionServiceCheck = CheckResult::Granted; -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp
r269868 r270158 47 47 { 48 48 MESSAGE_CHECK(clientIdentifier); 49 ASSERT(!m_pendingRequests.contains(clientIdentifier)); 50 ASSERT(!m_ongoingRequests.contains(clientIdentifier)); 49 ASSERT(!m_requests.contains(clientIdentifier)); 51 50 auto requestInfo = WebCore::SpeechRecognitionRequestInfo { clientIdentifier, WTFMove(lang), continuous, interimResults, maxAlternatives, WTFMove(origin) }; 52 auto& pendingRequest = m_pendingRequests.add(clientIdentifier, makeUnique<WebCore::SpeechRecognitionRequest>(WTFMove(requestInfo))).iterator->value;51 auto& newRequest = m_requests.add(clientIdentifier, makeUnique<WebCore::SpeechRecognitionRequest>(WTFMove(requestInfo))).iterator->value; 53 52 54 requestPermissionForRequest(* pendingRequest);53 requestPermissionForRequest(*newRequest); 55 54 } 56 55 … … 65 64 66 65 auto identifier = weakRequest->clientIdentifier(); 67 auto takenRequest = m_pendingRequests.take(identifier);68 66 if (decision == SpeechRecognitionPermissionDecision::Deny) { 67 m_requests.remove(identifier); 69 68 auto error = WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "Permission check failed"_s }; 70 69 sendUpdate(identifier, WebCore::SpeechRecognitionUpdateType::Error, error); … … 72 71 } 73 72 74 m_ongoingRequests.add(identifier, WTFMove(takenRequest)); 75 handleRequest(*m_ongoingRequests.get(identifier)); 73 handleRequest(identifier); 76 74 }); 75 } 76 77 void SpeechRecognitionServer::handleRequest(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier) 78 { 79 if (!m_recognizer) { 80 m_recognizer = makeUnique<SpeechRecognizer>([this, weakThis = makeWeakPtr(this)](auto& update) { 81 if (!weakThis) 82 return; 83 84 auto clientIdentifier = update.clientIdentifier(); 85 if (!m_requests.contains(clientIdentifier)) 86 return; 87 88 auto type = update.type(); 89 if (type == SpeechRecognitionUpdateType::Error || type == SpeechRecognitionUpdateType::End) 90 m_requests.remove(clientIdentifier); 91 92 sendUpdate(update); 93 }); 94 } 95 96 m_recognizer->start(clientIdentifier); 77 97 } 78 98 … … 80 100 { 81 101 MESSAGE_CHECK(clientIdentifier); 82 if (m_ pendingRequests.remove(clientIdentifier)) {83 sendUpdate(clientIdentifier, WebCore::SpeechRecognitionUpdateType::End);102 if (m_recognizer && m_recognizer->currentClientIdentifier() == clientIdentifier) { 103 m_recognizer->stop(); 84 104 return; 85 105 } 86 106 87 ASSERT(m_ongoingRequests.contains(clientIdentifier));88 stopRequest(*m_ongoingRequests.get(clientIdentifier));107 if (m_requests.remove(clientIdentifier)) 108 sendUpdate(clientIdentifier, WebCore::SpeechRecognitionUpdateType::End); 89 109 } 90 110 … … 92 112 { 93 113 MESSAGE_CHECK(clientIdentifier); 94 if (m_ pendingRequests.remove(clientIdentifier)) {95 sendUpdate(clientIdentifier, WebCore::SpeechRecognitionUpdateType::End);114 if (m_recognizer && m_recognizer->currentClientIdentifier() == clientIdentifier) { 115 m_recognizer->stop(WebCore::SpeechRecognizer::ShouldGenerateFinalResult::No); 96 116 return; 97 117 } 98 118 99 ASSERT(m_ongoingRequests.contains(clientIdentifier)); 100 auto request = m_ongoingRequests.take(clientIdentifier); 101 abortRequest(*request); 102 auto update = WebCore::SpeechRecognitionUpdate::create(clientIdentifier, WebCore::SpeechRecognitionUpdateType::End); 103 send(Messages::WebSpeechRecognitionConnection::DidReceiveUpdate(update), m_identifier); 119 if (m_requests.remove(clientIdentifier)) 120 sendUpdate(clientIdentifier, WebCore::SpeechRecognitionUpdateType::End); 104 121 } 105 122 … … 107 124 { 108 125 MESSAGE_CHECK(clientIdentifier); 109 auto request = m_ongoingRequests.take(clientIdentifier); 110 if (request) 111 abortRequest(*request); 112 } 113 114 void SpeechRecognitionServer::handleRequest(WebCore::SpeechRecognitionRequest& request) 115 { 116 // TODO: start capturing audio and recognition. 117 } 118 119 void SpeechRecognitionServer::stopRequest(WebCore::SpeechRecognitionRequest& request) 120 { 121 // TODO: stop capturing audio and finalizing results by recognizing captured audio. 122 } 123 124 void SpeechRecognitionServer::abortRequest(WebCore::SpeechRecognitionRequest& request) 125 { 126 // TODO: stop capturing audio and recognition immediately without generating results. 126 if (m_requests.remove(clientIdentifier)) { 127 if (m_recognizer && m_recognizer->currentClientIdentifier() == clientIdentifier) 128 m_recognizer->stop(); 129 } 127 130 } 128 131 … … 134 137 if (type == WebCore::SpeechRecognitionUpdateType::Result) 135 138 update = WebCore::SpeechRecognitionUpdate::createResult(clientIdentifier, *result); 136 send(Messages::WebSpeechRecognitionConnection::DidReceiveUpdate(update), m_identifier); 139 sendUpdate(update); 140 } 141 142 void SpeechRecognitionServer::sendUpdate(const WebCore::SpeechRecognitionUpdate& update) 143 { 144 send(Messages::WebSpeechRecognitionConnection::DidReceiveUpdate(update)); 137 145 } 138 146 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h
r269810 r270158 32 32 #include <WebCore/SpeechRecognitionRequest.h> 33 33 #include <WebCore/SpeechRecognitionResultData.h> 34 #include <WebCore/SpeechRecognizer.h> 34 35 #include <wtf/Deque.h> 35 36 … … 59 60 private: 60 61 void requestPermissionForRequest(WebCore::SpeechRecognitionRequest&); 61 void handleRequest(WebCore::SpeechRecognitionRequest&); 62 void stopRequest(WebCore::SpeechRecognitionRequest&); 63 void abortRequest(WebCore::SpeechRecognitionRequest&); 62 void handleRequest(WebCore::SpeechRecognitionConnectionClientIdentifier); 64 63 void sendUpdate(WebCore::SpeechRecognitionConnectionClientIdentifier, WebCore::SpeechRecognitionUpdateType, Optional<WebCore::SpeechRecognitionError> = WTF::nullopt, Optional<Vector<WebCore::SpeechRecognitionResultData>> = WTF::nullopt); 64 void sendUpdate(const WebCore::SpeechRecognitionUpdate&); 65 65 66 66 // IPC::MessageReceiver. … … 73 73 Ref<IPC::Connection> m_connection; 74 74 SpeechRecognitionServerIdentifier m_identifier; 75 HashMap<WebCore::SpeechRecognitionConnectionClientIdentifier, std::unique_ptr<WebCore::SpeechRecognitionRequest>> m_pendingRequests; 76 HashMap<WebCore::SpeechRecognitionConnectionClientIdentifier, std::unique_ptr<WebCore::SpeechRecognitionRequest>> m_ongoingRequests; 75 HashMap<WebCore::SpeechRecognitionConnectionClientIdentifier, std::unique_ptr<WebCore::SpeechRecognitionRequest>> m_requests; 77 76 SpeechRecognitionPermissionChecker m_permissionChecker; 77 std::unique_ptr<WebCore::SpeechRecognizer> m_recognizer; 78 78 }; 79 79 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r270136 r270158 8175 8175 } 8176 8176 8177 void WebPageProxy::syncIfMockDevicesEnabledChanged() 8178 { 8179 #if ENABLE(MEDIA_STREAM) 8180 userMediaPermissionRequestManager().syncWithWebCorePrefs(); 8181 #endif 8182 } 8183 8177 8184 void WebPageProxy::beginMonitoringCaptureDevices() 8178 8185 { -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r270136 r270158 1826 1826 void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); 1827 1827 1828 void syncIfMockDevicesEnabledChanged(); 1829 1828 1830 private: 1829 1831 WebPageProxy(PageClient&, WebProcessProxy&, Ref<API::PageConfiguration>&&);
Note: See TracChangeset
for help on using the changeset viewer.