Changeset 82963 in webkit
- Timestamp:
- Apr 5, 2011 11:59:53 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r82962 r82963 1 2011-04-05 Chris Rogers <crogers@google.com> 2 3 Reviewed by Kenneth Russell. 4 5 Add support for offline audio rendering to AudioContext API 6 https://bugs.webkit.org/show_bug.cgi?id=57676 7 8 No new tests since audio API is not yet implemented. 9 10 * DerivedSources.make: 11 * WebCore.gypi: 12 * WebCore.xcodeproj/project.pbxproj: 13 * bindings/js/JSAudioContextCustom.cpp: 14 (WebCore::JSAudioContextConstructor::constructJSAudioContext): 15 * bindings/js/JSEventCustom.cpp: 16 (WebCore::toJS): 17 * bindings/js/JSEventTarget.cpp: 18 (WebCore::toJS): 19 * bindings/v8/V8DOMWrapper.cpp: 20 (WebCore::V8DOMWrapper::convertEventTargetToV8Object): 21 * bindings/v8/custom/V8AudioContextCustom.cpp: 22 (WebCore::V8AudioContext::constructorCallback): 23 * bindings/v8/custom/V8EventCustom.cpp: 24 (WebCore::toV8): 25 * dom/Event.cpp: 26 (WebCore::Event::isOfflineAudioCompletionEvent): 27 * dom/Event.h: 28 * dom/EventTarget.cpp: 29 (WebCore::EventTarget::toAudioContext): 30 * dom/EventTarget.h: 31 * platform/audio/HRTFDatabaseLoader.cpp: 32 (WebCore::HRTFDatabaseLoader::waitForLoaderThreadCompletion): 33 * platform/audio/HRTFDatabaseLoader.h: 34 (WebCore::HRTFDatabaseLoader::loader): 35 * webaudio/AudioContext.cpp: 36 (WebCore::AudioContext::createOfflineContext): 37 (WebCore::AudioContext::AudioContext): 38 (WebCore::AudioContext::constructCommon): 39 (WebCore::AudioContext::document): 40 (WebCore::AudioContext::scriptExecutionContext): 41 (WebCore::AudioContext::toAudioContext): 42 (WebCore::AudioContext::startRendering): 43 (WebCore::AudioContext::fireCompletionEvent): 44 * webaudio/AudioContext.h: 45 (WebCore::AudioContext::isOfflineContext): 46 (WebCore::AudioContext::eventTargetData): 47 (WebCore::AudioContext::ensureEventTargetData): 48 (WebCore::AudioContext::refEventTarget): 49 (WebCore::AudioContext::derefEventTarget): 50 * webaudio/AudioContext.idl: 51 * webaudio/AudioDestinationNode.cpp: 52 (WebCore::AudioDestinationNode::AudioDestinationNode): 53 * webaudio/AudioDestinationNode.h: 54 (WebCore::AudioDestinationNode::reset): 55 (WebCore::AudioDestinationNode::numberOfChannels): 56 * webaudio/ConvolverNode.cpp: 57 (WebCore::ConvolverNode::setBuffer): 58 * webaudio/DefaultAudioDestinationNode.cpp: Added. 59 (WebCore::DefaultAudioDestinationNode::DefaultAudioDestinationNode): 60 (WebCore::DefaultAudioDestinationNode::~DefaultAudioDestinationNode): 61 (WebCore::DefaultAudioDestinationNode::initialize): 62 (WebCore::DefaultAudioDestinationNode::uninitialize): 63 (WebCore::DefaultAudioDestinationNode::startRendering): 64 * webaudio/DefaultAudioDestinationNode.h: Added. 65 (WebCore::DefaultAudioDestinationNode::create): 66 (WebCore::DefaultAudioDestinationNode::sampleRate): 67 * webaudio/OfflineAudioCompletionEvent.cpp: Added. 68 (WebCore::OfflineAudioCompletionEvent::create): 69 (WebCore::OfflineAudioCompletionEvent::OfflineAudioCompletionEvent): 70 (WebCore::OfflineAudioCompletionEvent::~OfflineAudioCompletionEvent): 71 (WebCore::OfflineAudioCompletionEvent::isOfflineAudioCompletionEvent): 72 * webaudio/OfflineAudioCompletionEvent.h: Added. 73 (WebCore::OfflineAudioCompletionEvent::renderedBuffer): 74 * webaudio/OfflineAudioCompletionEvent.idl: Added. 75 * webaudio/OfflineAudioDestinationNode.cpp: Added. 76 (WebCore::OfflineAudioDestinationNode::OfflineAudioDestinationNode): 77 (WebCore::OfflineAudioDestinationNode::~OfflineAudioDestinationNode): 78 (WebCore::OfflineAudioDestinationNode::initialize): 79 (WebCore::OfflineAudioDestinationNode::uninitialize): 80 (WebCore::OfflineAudioDestinationNode::startRendering): 81 (WebCore::OfflineAudioDestinationNode::renderEntry): 82 (WebCore::OfflineAudioDestinationNode::render): 83 (WebCore::OfflineAudioDestinationNode::notifyCompleteDispatch): 84 (WebCore::OfflineAudioDestinationNode::notifyComplete): 85 * webaudio/OfflineAudioDestinationNode.h: Added. 86 (WebCore::OfflineAudioDestinationNode::create): 87 (WebCore::OfflineAudioDestinationNode::sampleRate): 88 1 89 2011-04-05 Martin Robinson <mrobinson@igalia.com> 2 90 -
trunk/Source/WebCore/DerivedSources.make
r82562 r82963 74 74 JavaScriptAudioNode \ 75 75 LowPass2FilterNode \ 76 OfflineAudioCompletionEvent \ 76 77 RealtimeAnalyserNode \ 77 78 BarInfo \ -
trunk/Source/WebCore/WebCore.gypi
r82950 r82963 1389 1389 'webaudio/JavaScriptAudioNode.idl', 1390 1390 'webaudio/LowPass2FilterNode.idl', 1391 'webaudio/OfflineAudioCompletionEvent.idl', 1391 1392 'webaudio/RealtimeAnalyserNode.idl', 1392 1393 'websockets/WebSocket.idl', … … 5889 5890 'webaudio/ConvolverNode.cpp', 5890 5891 'webaudio/ConvolverNode.h', 5892 'webaudio/DefaultAudioDestinationNode.cpp', 5893 'webaudio/DefaultAudioDestinationNode.h', 5891 5894 'webaudio/DelayDSPKernel.cpp', 5892 5895 'webaudio/DelayDSPKernel.h', … … 5901 5904 'webaudio/LowPass2FilterNode.cpp', 5902 5905 'webaudio/LowPass2FilterNode.h', 5906 'webaudio/OfflineAudioCompletionEvent.cpp', 5907 'webaudio/OfflineAudioCompletionEvent.h', 5908 'webaudio/OfflineAudioDestinationNode.cpp', 5909 'webaudio/OfflineAudioDestinationNode.h', 5903 5910 'webaudio/RealtimeAnalyser.cpp', 5904 5911 'webaudio/RealtimeAnalyser.h', -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r82899 r82963 5763 5763 FABE72FE1059C21100D999DD /* MathMLNames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABE72FC1059C21100D999DD /* MathMLNames.cpp */; }; 5764 5764 FBC220DF1237FBEB00BCF788 /* GraphicsContext3DOpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FBC220DE1237FBEB00BCF788 /* GraphicsContext3DOpenGL.cpp */; }; 5765 FD06DFA5134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD06DFA3134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp */; }; 5766 FD06DFA6134A4DEF006F5D7D /* DefaultAudioDestinationNode.h in Headers */ = {isa = PBXBuildFile; fileRef = FD06DFA4134A4DEF006F5D7D /* DefaultAudioDestinationNode.h */; }; 5765 5767 FD2DBF1212B048A300ED98C6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2DBF0E12B048A300ED98C6 /* Accelerate.framework */; }; 5766 5768 FD2DBF1312B048A300ED98C6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2DBF0F12B048A300ED98C6 /* AudioToolbox.framework */; }; … … 5921 5923 FDA15ED112B03F94003A583A /* JSDelayNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA15ECF12B03F94003A583A /* JSDelayNode.cpp */; }; 5922 5924 FDA15ED212B03F94003A583A /* JSDelayNode.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA15ED012B03F94003A583A /* JSDelayNode.h */; }; 5925 FDA3E959134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA3E955134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp */; }; 5926 FDA3E95A134A49EF008D4B5A /* OfflineAudioCompletionEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA3E956134A49EF008D4B5A /* OfflineAudioCompletionEvent.h */; }; 5927 FDA3E95B134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA3E957134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp */; }; 5928 FDA3E95C134A49EF008D4B5A /* OfflineAudioDestinationNode.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA3E958134A49EF008D4B5A /* OfflineAudioDestinationNode.h */; }; 5923 5929 FDEAAAF312B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAEF12B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp */; }; 5924 5930 FDEAAAF412B02EE400DCF33B /* JSAudioContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAF012B02EE400DCF33B /* JSAudioContextCustom.cpp */; }; … … 5926 5932 FDEAAAF612B02EE400DCF33B /* JSConvolverNodeCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAF212B02EE400DCF33B /* JSConvolverNodeCustom.cpp */; }; 5927 5933 FDEAAAFE12B02F4900DCF33B /* JSJavaScriptAudioNodeCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAFD12B02F4900DCF33B /* JSJavaScriptAudioNodeCustom.cpp */; }; 5934 FDF6BAF8134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDF6BAF6134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp */; }; 5935 FDF6BAF9134A4C9800822920 /* JSOfflineAudioCompletionEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */; }; 5928 5936 FE6FD4880F676E5700092873 /* Coordinates.h in Headers */ = {isa = PBXBuildFile; fileRef = FE6FD4850F676E5700092873 /* Coordinates.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5929 5937 FE6FD48D0F676E9300092873 /* JSCoordinates.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE6FD48B0F676E9300092873 /* JSCoordinates.cpp */; }; … … 12280 12288 FABE72FC1059C21100D999DD /* MathMLNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLNames.cpp; sourceTree = "<group>"; }; 12281 12289 FBC220DE1237FBEB00BCF788 /* GraphicsContext3DOpenGL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContext3DOpenGL.cpp; sourceTree = "<group>"; }; 12290 FD06DFA3134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DefaultAudioDestinationNode.cpp; sourceTree = "<group>"; }; 12291 FD06DFA4134A4DEF006F5D7D /* DefaultAudioDestinationNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefaultAudioDestinationNode.h; sourceTree = "<group>"; }; 12282 12292 FD2DBF0E12B048A300ED98C6 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = "<absolute>"; }; 12283 12293 FD2DBF0F12B048A300ED98C6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; }; … … 12458 12468 FDA15ECF12B03F94003A583A /* JSDelayNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDelayNode.cpp; sourceTree = "<group>"; }; 12459 12469 FDA15ED012B03F94003A583A /* JSDelayNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDelayNode.h; sourceTree = "<group>"; }; 12470 FDA3E955134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OfflineAudioCompletionEvent.cpp; sourceTree = "<group>"; }; 12471 FDA3E956134A49EF008D4B5A /* OfflineAudioCompletionEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfflineAudioCompletionEvent.h; sourceTree = "<group>"; }; 12472 FDA3E957134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OfflineAudioDestinationNode.cpp; sourceTree = "<group>"; }; 12473 FDA3E958134A49EF008D4B5A /* OfflineAudioDestinationNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OfflineAudioDestinationNode.h; sourceTree = "<group>"; }; 12474 FDA3E95D134A49FF008D4B5A /* OfflineAudioCompletionEvent.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = OfflineAudioCompletionEvent.idl; sourceTree = "<group>"; }; 12460 12475 FDEAAAEF12B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioBufferSourceNodeCustom.cpp; sourceTree = "<group>"; }; 12461 12476 FDEAAAF012B02EE400DCF33B /* JSAudioContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioContextCustom.cpp; sourceTree = "<group>"; }; … … 12463 12478 FDEAAAF212B02EE400DCF33B /* JSConvolverNodeCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSConvolverNodeCustom.cpp; sourceTree = "<group>"; }; 12464 12479 FDEAAAFD12B02F4900DCF33B /* JSJavaScriptAudioNodeCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSJavaScriptAudioNodeCustom.cpp; sourceTree = "<group>"; }; 12480 FDF6BAF6134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSOfflineAudioCompletionEvent.cpp; sourceTree = "<group>"; }; 12481 FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOfflineAudioCompletionEvent.h; sourceTree = "<group>"; }; 12465 12482 FE49EF970DC51462004266E1 /* DashboardSupportCSSPropertyNames.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DashboardSupportCSSPropertyNames.in; sourceTree = "<group>"; }; 12466 12483 FE6FD4850F676E5700092873 /* Coordinates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Coordinates.h; sourceTree = "<group>"; }; … … 19563 19580 FD315FDF12B0267600C1A359 /* ConvolverNode.h */, 19564 19581 FD315FE012B0267600C1A359 /* ConvolverNode.idl */, 19582 FD06DFA3134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp */, 19583 FD06DFA4134A4DEF006F5D7D /* DefaultAudioDestinationNode.h */, 19565 19584 FD315FE112B0267600C1A359 /* DelayDSPKernel.cpp */, 19566 19585 FD315FE212B0267600C1A359 /* DelayDSPKernel.h */, … … 19579 19598 FD315FEF12B0267600C1A359 /* LowPass2FilterNode.h */, 19580 19599 FD315FF012B0267600C1A359 /* LowPass2FilterNode.idl */, 19600 FDA3E955134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp */, 19601 FDA3E956134A49EF008D4B5A /* OfflineAudioCompletionEvent.h */, 19602 FDA3E95D134A49FF008D4B5A /* OfflineAudioCompletionEvent.idl */, 19603 FDA3E957134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp */, 19604 FDA3E958134A49EF008D4B5A /* OfflineAudioDestinationNode.h */, 19581 19605 FD315FF112B0267600C1A359 /* RealtimeAnalyser.cpp */, 19582 19606 FD315FF212B0267600C1A359 /* RealtimeAnalyser.h */, … … 19704 19728 FDA15EC312B03F3B003A583A /* JSLowPass2FilterNode.cpp */, 19705 19729 FDA15EC412B03F3B003A583A /* JSLowPass2FilterNode.h */, 19730 FDF6BAF6134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp */, 19731 FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */, 19706 19732 FDA15EC712B03F50003A583A /* JSRealtimeAnalyserNode.cpp */, 19707 19733 FDA15EC812B03F50003A583A /* JSRealtimeAnalyserNode.h */, … … 22789 22815 E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */, 22790 22816 977E2E0F12F0FC9C00C13379 /* XSSFilter.h in Headers */, 22817 FDA3E95A134A49EF008D4B5A /* OfflineAudioCompletionEvent.h in Headers */, 22818 FDA3E95C134A49EF008D4B5A /* OfflineAudioDestinationNode.h in Headers */, 22819 FDF6BAF9134A4C9800822920 /* JSOfflineAudioCompletionEvent.h in Headers */, 22820 FD06DFA6134A4DEF006F5D7D /* DefaultAudioDestinationNode.h in Headers */, 22791 22821 ); 22792 22822 runOnlyForDeploymentPostprocessing = 0; … … 25469 25499 E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */, 25470 25500 977E2E0E12F0FC9C00C13379 /* XSSFilter.cpp in Sources */, 25501 FDA3E959134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp in Sources */, 25502 FDA3E95B134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp in Sources */, 25503 FDF6BAF8134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp in Sources */, 25504 FD06DFA5134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp in Sources */, 25471 25505 ); 25472 25506 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
r78360 r82963 55 55 Document* document = static_cast<Document*>(scriptExecutionContext); 56 56 57 RefPtr<AudioContext> context = AudioContext::create(document); 58 return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), context.get()))); 57 RefPtr<AudioContext> audioContext; 58 59 if (!exec->argumentCount()) { 60 // Constructor for default AudioContext which talks to audio hardware. 61 audioContext = AudioContext::create(document); 62 } else { 63 // Constructor for offline (render-target) AudioContext which renders into an AudioBuffer. 64 // new AudioContext(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); 65 if (exec->argumentCount() < 3) 66 return throwError(exec, createSyntaxError(exec, "Not enough arguments")); 67 68 unsigned numberOfChannels = exec->argument(0).toInt32(exec); 69 unsigned numberOfFrames = exec->argument(1).toInt32(exec); 70 float sampleRate = exec->argument(2).toFloat(exec); 71 72 audioContext = AudioContext::createOfflineContext(document, numberOfChannels, numberOfFrames, sampleRate); 73 } 74 75 if (!audioContext.get()) 76 return throwError(exec, createReferenceError(exec, "Error creating AudioContext")); 77 78 return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), audioContext.get()))); 59 79 } 60 80 -
trunk/Source/WebCore/bindings/js/JSEventCustom.cpp
r78752 r82963 102 102 #include "AudioProcessingEvent.h" 103 103 #include "JSAudioProcessingEvent.h" 104 #include "JSOfflineAudioCompletionEvent.h" 105 #include "OfflineAudioCompletionEvent.h" 104 106 #endif 105 107 … … 191 193 else if (event->isAudioProcessingEvent()) 192 194 wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, AudioProcessingEvent, event); 195 else if (event->isOfflineAudioCompletionEvent()) 196 wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, OfflineAudioCompletionEvent, event); 193 197 #endif 194 198 #if ENABLE(INPUT_SPEECH) -
trunk/Source/WebCore/bindings/js/JSEventTarget.cpp
r78908 r82963 85 85 86 86 #if ENABLE(WEB_AUDIO) 87 #include "AudioContext.h" 88 #include "JSAudioContext.h" 87 89 #include "JSJavaScriptAudioNode.h" 88 90 #include "JavaScriptAudioNode.h" … … 174 176 if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode()) 175 177 return toJS(exec, globalObject, jsAudioNode); 178 if (AudioContext* audioContext = target->toAudioContext()) 179 return toJS(exec, globalObject, audioContext); 176 180 #endif 177 181 -
trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp
r78005 r82963 85 85 86 86 #if ENABLE(WEB_AUDIO) 87 #include "V8AudioContext.h" 87 88 #include "V8JavaScriptAudioNode.h" 88 89 #endif … … 445 446 if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode()) 446 447 return toV8(jsAudioNode); 448 if (AudioContext* audioContext = target->toAudioContext()) 449 return toV8(audioContext); 447 450 #endif 448 451 -
trunk/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp
r78360 r82963 52 52 return throwError("AudioContext constructor associated document is unavailable", V8Proxy::ReferenceError); 53 53 54 RefPtr<AudioContext> audioContext = AudioContext::create(document); 54 RefPtr<AudioContext> audioContext; 55 56 if (!args.Length()) { 57 // Constructor for default AudioContext which talks to audio hardware. 58 audioContext = AudioContext::create(document); 59 } else { 60 // Constructor for offline (render-target) AudioContext which renders into an AudioBuffer. 61 // new AudioContext(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); 62 if (args.Length() < 3) 63 return throwError("Not enough arguments", V8Proxy::SyntaxError); 64 65 bool ok = false; 66 67 unsigned numberOfChannels = toInt32(args[0], ok); 68 if (!ok) 69 return throwError("Invalid number of channels", V8Proxy::SyntaxError); 70 71 unsigned numberOfFrames = toInt32(args[1], ok); 72 if (!ok) 73 return throwError("Invalid number of frames", V8Proxy::SyntaxError); 74 75 float sampleRate = toFloat(args[2]); 76 77 audioContext = AudioContext::createOfflineContext(document, numberOfChannels, numberOfFrames, sampleRate); 78 } 79 80 if (!audioContext.get()) 81 return throwError("Error creating AudioContext", V8Proxy::SyntaxError); 55 82 56 83 // Transform the holder into a wrapper object for the audio context. -
trunk/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp
r78752 r82963 71 71 #if ENABLE(WEB_AUDIO) 72 72 #include "V8AudioProcessingEvent.h" 73 #include "V8OfflineAudioCompletionEvent.h" 73 74 #endif 74 75 … … 170 171 if (impl->isAudioProcessingEvent()) 171 172 return toV8(static_cast<AudioProcessingEvent*>(impl)); 173 if (impl->isOfflineAudioCompletionEvent()) 174 return toV8(static_cast<OfflineAudioCompletionEvent*>(impl)); 172 175 #endif 173 176 #if ENABLE(INPUT_SPEECH) -
trunk/Source/WebCore/dom/Event.cpp
r82925 r82963 230 230 return false; 231 231 } 232 233 bool Event::isOfflineAudioCompletionEvent() const 234 { 235 return false; 236 } 232 237 #endif 233 238 -
trunk/Source/WebCore/dom/Event.h
r82891 r82963 132 132 #if ENABLE(WEB_AUDIO) 133 133 virtual bool isAudioProcessingEvent() const; 134 virtual bool isOfflineAudioCompletionEvent() const; 134 135 #endif 135 136 virtual bool isErrorEvent() const; -
trunk/Source/WebCore/dom/EventTarget.cpp
r78908 r82963 120 120 121 121 #if ENABLE(WEB_AUDIO) 122 AudioContext* EventTarget::toAudioContext() 123 { 124 return 0; 125 } 126 122 127 JavaScriptAudioNode* EventTarget::toJavaScriptAudioNode() 123 128 { -
trunk/Source/WebCore/dom/EventTarget.h
r78908 r82963 41 41 namespace WebCore { 42 42 43 class AudioContext; 43 44 class AbstractWorker; 44 45 class DedicatedWorkerContext; … … 123 124 124 125 #if ENABLE(WEB_AUDIO) 126 virtual AudioContext* toAudioContext(); 125 127 virtual JavaScriptAudioNode* toJavaScriptAudioNode(); 126 128 #endif -
trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.cpp
r68470 r82963 121 121 } 122 122 123 124 void HRTFDatabaseLoader::waitForLoaderThreadCompletion() 125 { 126 ASSERT(!isMainThread()); 127 ASSERT(m_databaseLoaderThread); 128 waitForThreadCompletion(m_databaseLoaderThread, 0); 129 } 130 123 131 HRTFDatabase* HRTFDatabaseLoader::defaultHRTFDatabase() 124 132 { -
trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.h
r68470 r82963 47 47 static PassRefPtr<HRTFDatabaseLoader> createAndLoadAsynchronouslyIfNecessary(double sampleRate); 48 48 49 // Returns the singleton HRTFDatabaseLoader. 50 static HRTFDatabaseLoader* loader() { return s_loader; } 51 49 52 // Both constructor and destructor must be called from the main thread. 50 53 ~HRTFDatabaseLoader(); … … 52 55 // Returns true once the default database has been completely loaded. 53 56 bool isLoaded() const; 57 58 // May not be called on the main thread. 59 // This is so a different background thread may synchronize with the loader thread. 60 void waitForLoaderThreadCompletion(); 54 61 55 62 HRTFDatabase* database() { return m_hrtfDatabase.get(); } -
trunk/Source/WebCore/webaudio/AudioContext.cpp
r78102 r82963 40 40 #include "AudioPannerNode.h" 41 41 #include "ConvolverNode.h" 42 #include "DefaultAudioDestinationNode.h" 42 43 #include "DelayNode.h" 43 44 #include "Document.h" … … 48 49 #include "JavaScriptAudioNode.h" 49 50 #include "LowPass2FilterNode.h" 51 #include "OfflineAudioCompletionEvent.h" 52 #include "OfflineAudioDestinationNode.h" 50 53 #include "PlatformString.h" 51 54 #include "RealtimeAnalyserNode.h" … … 67 70 } 68 71 72 PassRefPtr<AudioContext> AudioContext::createOfflineContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate) 73 { 74 return adoptRef(new AudioContext(document, numberOfChannels, numberOfFrames, sampleRate)); 75 } 76 77 // Constructor for rendering to the audio hardware. 69 78 AudioContext::AudioContext(Document* document) 70 79 : ActiveDOMObject(document, this) … … 76 85 , m_audioThread(0) 77 86 , m_graphOwnerThread(UndefinedThreadIdentifier) 78 { 79 // Note: because adoptRef() won't be called until we leave this constructor, but code in this constructor needs to reference this context, 80 // relax the check. 81 relaxAdoptionRequirement(); 82 83 FFTFrame::initialize(); 84 85 m_destinationNode = AudioDestinationNode::create(this); 86 m_listener = AudioListener::create(); 87 m_temporaryMonoBus = adoptPtr(new AudioBus(1, AudioNode::ProcessingSizeInFrames)); 88 m_temporaryStereoBus = adoptPtr(new AudioBus(2, AudioNode::ProcessingSizeInFrames)); 87 , m_isOfflineContext(false) 88 { 89 constructCommon(); 90 91 m_destinationNode = DefaultAudioDestinationNode::create(this); 89 92 90 93 // This sets in motion an asynchronous loading mechanism on another thread. … … 93 96 // when this has finished (see AudioDestinationNode). 94 97 m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(sampleRate()); 98 99 // FIXME: for now default AudioContext does not need an explicit startRendering() call. 100 // We may want to consider requiring it for symmetry with OfflineAudioContext 101 m_destinationNode->startRendering(); 102 } 103 104 // Constructor for offline (non-realtime) rendering. 105 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate) 106 : ActiveDOMObject(document, this) 107 , m_isInitialized(false) 108 , m_isAudioThreadFinished(false) 109 , m_document(document) 110 , m_destinationNode(0) 111 , m_connectionCount(0) 112 , m_audioThread(0) 113 , m_graphOwnerThread(UndefinedThreadIdentifier) 114 , m_isOfflineContext(true) 115 { 116 constructCommon(); 117 118 // FIXME: the passed in sampleRate MUST match the hardware sample-rate since HRTFDatabaseLoader is a singleton. 119 m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(sampleRate); 120 121 // Create a new destination for offline rendering. 122 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate); 123 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTarget.get()); 124 } 125 126 void AudioContext::constructCommon() 127 { 128 // Note: because adoptRef() won't be called until we leave this constructor, but code in this constructor needs to reference this context, 129 // relax the check. 130 relaxAdoptionRequirement(); 131 132 FFTFrame::initialize(); 133 134 m_listener = AudioListener::create(); 135 m_temporaryMonoBus = adoptPtr(new AudioBus(1, AudioNode::ProcessingSizeInFrames)); 136 m_temporaryStereoBus = adoptPtr(new AudioBus(2, AudioNode::ProcessingSizeInFrames)); 95 137 } 96 138 … … 168 210 } 169 211 170 Document* AudioContext::document() 212 Document* AudioContext::document() const 171 213 { 172 214 ASSERT(m_document); … … 527 569 } 528 570 571 ScriptExecutionContext* AudioContext::scriptExecutionContext() const 572 { 573 return document(); 574 } 575 576 AudioContext* AudioContext::toAudioContext() 577 { 578 return this; 579 } 580 581 void AudioContext::startRendering() 582 { 583 destination()->startRendering(); 584 } 585 586 void AudioContext::fireCompletionEvent() 587 { 588 ASSERT(isMainThread()); 589 if (!isMainThread()) 590 return; 591 592 AudioBuffer* renderedBuffer = m_renderTarget.get(); 593 594 ASSERT(renderedBuffer); 595 if (!renderedBuffer) 596 return; 597 598 // Avoid firing the event if the document has already gone away. 599 if (hasDocument()) { 600 // Call the offline rendering completion event listener. 601 dispatchEvent(OfflineAudioCompletionEvent::create(renderedBuffer)); 602 } 603 } 529 604 530 605 } // namespace WebCore -
trunk/Source/WebCore/webaudio/AudioContext.h
r73174 r82963 29 29 #include "AudioBus.h" 30 30 #include "AudioDestinationNode.h" 31 #include "EventListener.h" 32 #include "EventTarget.h" 31 33 #include "HRTFDatabaseLoader.h" 32 34 #include <wtf/HashSet.h> … … 60 62 // For thread safety between the audio thread and the main thread, it has a rendering graph locking mechanism. 61 63 62 class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext> {64 class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext>, public EventTarget { 63 65 public: 66 // Create an AudioContext for rendering to the audio hardware. 64 67 static PassRefPtr<AudioContext> create(Document*); 65 68 69 // Create an AudioContext for offline (non-realtime) rendering. 70 static PassRefPtr<AudioContext> createOfflineContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate); 71 66 72 virtual ~AudioContext(); 67 73 68 74 bool isInitialized() const; 75 76 bool isOfflineContext() { return m_isOfflineContext; } 69 77 70 78 // Returns true when initialize() was called AND all asynchronous initialization has completed. … … 74 82 virtual void stop(); 75 83 76 Document* document() ; // ASSERTs if document no longer exists.84 Document* document() const; // ASSERTs if document no longer exists. 77 85 bool hasDocument(); 78 86 … … 181 189 void markAudioNodeInputDirty(AudioNodeInput*); 182 190 void markAudioNodeOutputDirty(AudioNodeOutput*); 191 192 // EventTarget 193 virtual ScriptExecutionContext* scriptExecutionContext() const; 194 virtual AudioContext* toAudioContext(); 195 virtual EventTargetData* eventTargetData() { return &m_eventTargetData; } 196 virtual EventTargetData* ensureEventTargetData() { return &m_eventTargetData; } 197 198 DEFINE_ATTRIBUTE_EVENT_LISTENER(complete); 199 200 // Reconcile ref/deref which are defined both in AudioNode and EventTarget. 201 using RefCounted<AudioContext>::ref; 202 using RefCounted<AudioContext>::deref; 203 204 void startRendering(); 205 void fireCompletionEvent(); 183 206 184 207 private: 185 208 AudioContext(Document*); 209 AudioContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate); 210 void constructCommon(); 211 186 212 void lazyInitialize(); 187 213 void uninitialize(); … … 253 279 // HRTF Database loader 254 280 RefPtr<HRTFDatabaseLoader> m_hrtfDatabaseLoader; 281 282 // EventTarget 283 virtual void refEventTarget() { ref(); } 284 virtual void derefEventTarget() { deref(); } 285 EventTargetData m_eventTargetData; 286 287 RefPtr<AudioBuffer> m_renderTarget; 288 289 bool m_isOfflineContext; 255 290 }; 256 291 -
trunk/Source/WebCore/webaudio/AudioContext.idl
r78360 r82963 28 28 CanBeConstructed, 29 29 CustomConstructFunction, 30 V8CustomConstructor 30 V8CustomConstructor, 31 #if defined(V8_BINDING) && V8_BINDING 32 EventTarget 33 #endif 31 34 ] AudioContext { 32 35 // All rendered audio ultimately connects to destination, which represents the audio hardware. … … 63 66 AudioChannelSplitter createChannelSplitter(); 64 67 AudioChannelMerger createChannelMerger(); 68 69 // Offline rendering 70 // void prepareOfflineBufferRendering(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); 71 attribute EventListener oncomplete; 72 void startRendering(); 73 65 74 }; 66 75 } -
trunk/Source/WebCore/webaudio/AudioDestinationNode.cpp
r71200 r82963 33 33 #include "AudioNodeInput.h" 34 34 #include "AudioNodeOutput.h" 35 #include <wtf/Threading.h>36 35 37 36 namespace WebCore { 38 39 AudioDestinationNode::AudioDestinationNode(AudioContext* context )40 : AudioNode(context, AudioDestination::hardwareSampleRate())37 38 AudioDestinationNode::AudioDestinationNode(AudioContext* context, double sampleRate) 39 : AudioNode(context, sampleRate) 41 40 , m_currentTime(0.0) 42 41 { … … 44 43 45 44 setType(NodeTypeDestination); 46 47 initialize();48 45 } 49 46 … … 51 48 { 52 49 uninitialize(); 53 }54 55 void AudioDestinationNode::initialize()56 {57 if (isInitialized())58 return;59 60 double hardwareSampleRate = AudioDestination::hardwareSampleRate();61 #ifndef NDEBUG62 fprintf(stderr, ">>>> hardwareSampleRate = %f\n", hardwareSampleRate);63 #endif64 65 m_destination = AudioDestination::create(*this, hardwareSampleRate);66 m_destination->start();67 68 AudioNode::initialize();69 }70 71 void AudioDestinationNode::uninitialize()72 {73 if (!isInitialized())74 return;75 76 m_destination->stop();77 78 AudioNode::uninitialize();79 50 } 80 51 -
trunk/Source/WebCore/webaudio/AudioDestinationNode.h
r71149 r82963 26 26 #define AudioDestinationNode_h 27 27 28 #include "Audio Destination.h"28 #include "AudioBuffer.h" 29 29 #include "AudioNode.h" 30 30 #include "AudioSourceProvider.h" 31 #include <wtf/OwnPtr.h>32 #include <wtf/PassRefPtr.h>33 31 34 32 namespace WebCore { … … 39 37 class AudioDestinationNode : public AudioNode, public AudioSourceProvider { 40 38 public: 41 static PassRefPtr<AudioDestinationNode> create(AudioContext* context) 42 { 43 return adoptRef(new AudioDestinationNode(context)); 44 } 45 39 AudioDestinationNode(AudioContext*, double sampleRate); 46 40 virtual ~AudioDestinationNode(); 47 41 … … 49 43 virtual void process(size_t) { }; // we're pulled by hardware so this is never called 50 44 virtual void reset() { m_currentTime = 0.0; }; 51 virtual void initialize();52 virtual void uninitialize();53 45 54 46 // The audio hardware calls here periodically to gets its input stream. … … 57 49 double currentTime() { return m_currentTime; } 58 50 59 double sampleRate() const { return m_destination->sampleRate(); }51 virtual double sampleRate() const = 0; 60 52 61 unsigned numberOfChannels() const { return 2; } // FIXME: update when multi-channel (more than stereo) is supported 53 virtual unsigned numberOfChannels() const { return 2; } // FIXME: update when multi-channel (more than stereo) is supported 54 55 virtual void startRendering() = 0; 62 56 63 private: 64 AudioDestinationNode(AudioContext*); 65 66 OwnPtr<AudioDestination> m_destination; 57 protected: 67 58 double m_currentTime; 68 59 }; -
trunk/Source/WebCore/webaudio/ConvolverNode.cpp
r71195 r82963 30 30 31 31 #include "AudioBuffer.h" 32 #include "AudioContext.h" 32 33 #include "AudioNodeInput.h" 33 34 #include "AudioNodeOutput.h" … … 132 133 133 134 // Create the reverb with the given impulse response. 134 OwnPtr<Reverb> reverb = adoptPtr(new Reverb(&bufferBus, AudioNode::ProcessingSizeInFrames, MaxFFTSize, 2, true)); 135 bool useBackgroundThreads = !context()->isOfflineContext(); 136 OwnPtr<Reverb> reverb = adoptPtr(new Reverb(&bufferBus, AudioNode::ProcessingSizeInFrames, MaxFFTSize, 2, useBackgroundThreads)); 135 137 136 138 {
Note: See TracChangeset
for help on using the changeset viewer.