Changeset 82963 in webkit


Ignore:
Timestamp:
Apr 5, 2011 11:59:53 AM (13 years ago)
Author:
crogers@google.com
Message:

2011-04-05 Chris Rogers <crogers@google.com>

Reviewed by Kenneth Russell.

Add support for offline audio rendering to AudioContext API
https://bugs.webkit.org/show_bug.cgi?id=57676

No new tests since audio API is not yet implemented.

  • DerivedSources.make:
  • WebCore.gypi:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSAudioContextCustom.cpp: (WebCore::JSAudioContextConstructor::constructJSAudioContext):
  • bindings/js/JSEventCustom.cpp: (WebCore::toJS):
  • bindings/js/JSEventTarget.cpp: (WebCore::toJS):
  • bindings/v8/V8DOMWrapper.cpp: (WebCore::V8DOMWrapper::convertEventTargetToV8Object):
  • bindings/v8/custom/V8AudioContextCustom.cpp: (WebCore::V8AudioContext::constructorCallback):
  • bindings/v8/custom/V8EventCustom.cpp: (WebCore::toV8):
  • dom/Event.cpp: (WebCore::Event::isOfflineAudioCompletionEvent):
  • dom/Event.h:
  • dom/EventTarget.cpp: (WebCore::EventTarget::toAudioContext):
  • dom/EventTarget.h:
  • platform/audio/HRTFDatabaseLoader.cpp: (WebCore::HRTFDatabaseLoader::waitForLoaderThreadCompletion):
  • platform/audio/HRTFDatabaseLoader.h: (WebCore::HRTFDatabaseLoader::loader):
  • webaudio/AudioContext.cpp: (WebCore::AudioContext::createOfflineContext): (WebCore::AudioContext::AudioContext): (WebCore::AudioContext::constructCommon): (WebCore::AudioContext::document): (WebCore::AudioContext::scriptExecutionContext): (WebCore::AudioContext::toAudioContext): (WebCore::AudioContext::startRendering): (WebCore::AudioContext::fireCompletionEvent):
  • webaudio/AudioContext.h: (WebCore::AudioContext::isOfflineContext): (WebCore::AudioContext::eventTargetData): (WebCore::AudioContext::ensureEventTargetData): (WebCore::AudioContext::refEventTarget): (WebCore::AudioContext::derefEventTarget):
  • webaudio/AudioContext.idl:
  • webaudio/AudioDestinationNode.cpp: (WebCore::AudioDestinationNode::AudioDestinationNode):
  • webaudio/AudioDestinationNode.h: (WebCore::AudioDestinationNode::reset): (WebCore::AudioDestinationNode::numberOfChannels):
  • webaudio/ConvolverNode.cpp: (WebCore::ConvolverNode::setBuffer):
  • webaudio/DefaultAudioDestinationNode.cpp: Added. (WebCore::DefaultAudioDestinationNode::DefaultAudioDestinationNode): (WebCore::DefaultAudioDestinationNode::~DefaultAudioDestinationNode): (WebCore::DefaultAudioDestinationNode::initialize): (WebCore::DefaultAudioDestinationNode::uninitialize): (WebCore::DefaultAudioDestinationNode::startRendering):
  • webaudio/DefaultAudioDestinationNode.h: Added. (WebCore::DefaultAudioDestinationNode::create): (WebCore::DefaultAudioDestinationNode::sampleRate):
  • webaudio/OfflineAudioCompletionEvent.cpp: Added. (WebCore::OfflineAudioCompletionEvent::create): (WebCore::OfflineAudioCompletionEvent::OfflineAudioCompletionEvent): (WebCore::OfflineAudioCompletionEvent::~OfflineAudioCompletionEvent): (WebCore::OfflineAudioCompletionEvent::isOfflineAudioCompletionEvent):
  • webaudio/OfflineAudioCompletionEvent.h: Added. (WebCore::OfflineAudioCompletionEvent::renderedBuffer):
  • webaudio/OfflineAudioCompletionEvent.idl: Added.
  • webaudio/OfflineAudioDestinationNode.cpp: Added. (WebCore::OfflineAudioDestinationNode::OfflineAudioDestinationNode): (WebCore::OfflineAudioDestinationNode::~OfflineAudioDestinationNode): (WebCore::OfflineAudioDestinationNode::initialize): (WebCore::OfflineAudioDestinationNode::uninitialize): (WebCore::OfflineAudioDestinationNode::startRendering): (WebCore::OfflineAudioDestinationNode::renderEntry): (WebCore::OfflineAudioDestinationNode::render): (WebCore::OfflineAudioDestinationNode::notifyCompleteDispatch): (WebCore::OfflineAudioDestinationNode::notifyComplete):
  • webaudio/OfflineAudioDestinationNode.h: Added. (WebCore::OfflineAudioDestinationNode::create): (WebCore::OfflineAudioDestinationNode::sampleRate):
Location:
trunk/Source/WebCore
Files:
7 added
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r82962 r82963  
     12011-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
    1892011-04-05  Martin Robinson  <mrobinson@igalia.com>
    290
  • trunk/Source/WebCore/DerivedSources.make

    r82562 r82963  
    7474    JavaScriptAudioNode \
    7575    LowPass2FilterNode \
     76    OfflineAudioCompletionEvent \
    7677    RealtimeAnalyserNode \
    7778    BarInfo \
  • trunk/Source/WebCore/WebCore.gypi

    r82950 r82963  
    13891389            'webaudio/JavaScriptAudioNode.idl',
    13901390            'webaudio/LowPass2FilterNode.idl',
     1391            'webaudio/OfflineAudioCompletionEvent.idl',
    13911392            'webaudio/RealtimeAnalyserNode.idl',
    13921393            'websockets/WebSocket.idl',
     
    58895890            'webaudio/ConvolverNode.cpp',
    58905891            'webaudio/ConvolverNode.h',
     5892            'webaudio/DefaultAudioDestinationNode.cpp',
     5893            'webaudio/DefaultAudioDestinationNode.h',
    58915894            'webaudio/DelayDSPKernel.cpp',
    58925895            'webaudio/DelayDSPKernel.h',
     
    59015904            'webaudio/LowPass2FilterNode.cpp',
    59025905            'webaudio/LowPass2FilterNode.h',
     5906            'webaudio/OfflineAudioCompletionEvent.cpp',
     5907            'webaudio/OfflineAudioCompletionEvent.h',
     5908            'webaudio/OfflineAudioDestinationNode.cpp',
     5909            'webaudio/OfflineAudioDestinationNode.h',
    59035910            'webaudio/RealtimeAnalyser.cpp',
    59045911            'webaudio/RealtimeAnalyser.h',
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r82899 r82963  
    57635763                FABE72FE1059C21100D999DD /* MathMLNames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABE72FC1059C21100D999DD /* MathMLNames.cpp */; };
    57645764                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 */; };
    57655767                FD2DBF1212B048A300ED98C6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2DBF0E12B048A300ED98C6 /* Accelerate.framework */; };
    57665768                FD2DBF1312B048A300ED98C6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2DBF0F12B048A300ED98C6 /* AudioToolbox.framework */; };
     
    59215923                FDA15ED112B03F94003A583A /* JSDelayNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA15ECF12B03F94003A583A /* JSDelayNode.cpp */; };
    59225924                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 */; };
    59235929                FDEAAAF312B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAEF12B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp */; };
    59245930                FDEAAAF412B02EE400DCF33B /* JSAudioContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAF012B02EE400DCF33B /* JSAudioContextCustom.cpp */; };
     
    59265932                FDEAAAF612B02EE400DCF33B /* JSConvolverNodeCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEAAAF212B02EE400DCF33B /* JSConvolverNodeCustom.cpp */; };
    59275933                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 */; };
    59285936                FE6FD4880F676E5700092873 /* Coordinates.h in Headers */ = {isa = PBXBuildFile; fileRef = FE6FD4850F676E5700092873 /* Coordinates.h */; settings = {ATTRIBUTES = (Private, ); }; };
    59295937                FE6FD48D0F676E9300092873 /* JSCoordinates.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE6FD48B0F676E9300092873 /* JSCoordinates.cpp */; };
     
    1228012288                FABE72FC1059C21100D999DD /* MathMLNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLNames.cpp; sourceTree = "<group>"; };
    1228112289                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>"; };
    1228212292                FD2DBF0E12B048A300ED98C6 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = "<absolute>"; };
    1228312293                FD2DBF0F12B048A300ED98C6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
     
    1245812468                FDA15ECF12B03F94003A583A /* JSDelayNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDelayNode.cpp; sourceTree = "<group>"; };
    1245912469                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>"; };
    1246012475                FDEAAAEF12B02EE400DCF33B /* JSAudioBufferSourceNodeCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioBufferSourceNodeCustom.cpp; sourceTree = "<group>"; };
    1246112476                FDEAAAF012B02EE400DCF33B /* JSAudioContextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioContextCustom.cpp; sourceTree = "<group>"; };
     
    1246312478                FDEAAAF212B02EE400DCF33B /* JSConvolverNodeCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSConvolverNodeCustom.cpp; sourceTree = "<group>"; };
    1246412479                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>"; };
    1246512482                FE49EF970DC51462004266E1 /* DashboardSupportCSSPropertyNames.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DashboardSupportCSSPropertyNames.in; sourceTree = "<group>"; };
    1246612483                FE6FD4850F676E5700092873 /* Coordinates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Coordinates.h; sourceTree = "<group>"; };
     
    1956319580                                FD315FDF12B0267600C1A359 /* ConvolverNode.h */,
    1956419581                                FD315FE012B0267600C1A359 /* ConvolverNode.idl */,
     19582                                FD06DFA3134A4DEF006F5D7D /* DefaultAudioDestinationNode.cpp */,
     19583                                FD06DFA4134A4DEF006F5D7D /* DefaultAudioDestinationNode.h */,
    1956519584                                FD315FE112B0267600C1A359 /* DelayDSPKernel.cpp */,
    1956619585                                FD315FE212B0267600C1A359 /* DelayDSPKernel.h */,
     
    1957919598                                FD315FEF12B0267600C1A359 /* LowPass2FilterNode.h */,
    1958019599                                FD315FF012B0267600C1A359 /* LowPass2FilterNode.idl */,
     19600                                FDA3E955134A49EF008D4B5A /* OfflineAudioCompletionEvent.cpp */,
     19601                                FDA3E956134A49EF008D4B5A /* OfflineAudioCompletionEvent.h */,
     19602                                FDA3E95D134A49FF008D4B5A /* OfflineAudioCompletionEvent.idl */,
     19603                                FDA3E957134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp */,
     19604                                FDA3E958134A49EF008D4B5A /* OfflineAudioDestinationNode.h */,
    1958119605                                FD315FF112B0267600C1A359 /* RealtimeAnalyser.cpp */,
    1958219606                                FD315FF212B0267600C1A359 /* RealtimeAnalyser.h */,
     
    1970419728                                FDA15EC312B03F3B003A583A /* JSLowPass2FilterNode.cpp */,
    1970519729                                FDA15EC412B03F3B003A583A /* JSLowPass2FilterNode.h */,
     19730                                FDF6BAF6134A4C9800822920 /* JSOfflineAudioCompletionEvent.cpp */,
     19731                                FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */,
    1970619732                                FDA15EC712B03F50003A583A /* JSRealtimeAnalyserNode.cpp */,
    1970719733                                FDA15EC812B03F50003A583A /* JSRealtimeAnalyserNode.h */,
     
    2278922815                                E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */,
    2279022816                                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 */,
    2279122821                        );
    2279222822                        runOnlyForDeploymentPostprocessing = 0;
     
    2546925499                                E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */,
    2547025500                                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 */,
    2547125505                        );
    2547225506                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp

    r78360 r82963  
    5555    Document* document = static_cast<Document*>(scriptExecutionContext);
    5656
    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())));
    5979}
    6080
  • trunk/Source/WebCore/bindings/js/JSEventCustom.cpp

    r78752 r82963  
    102102#include "AudioProcessingEvent.h"
    103103#include "JSAudioProcessingEvent.h"
     104#include "JSOfflineAudioCompletionEvent.h"
     105#include "OfflineAudioCompletionEvent.h"
    104106#endif
    105107
     
    191193    else if (event->isAudioProcessingEvent())
    192194        wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, AudioProcessingEvent, event);
     195    else if (event->isOfflineAudioCompletionEvent())
     196        wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, OfflineAudioCompletionEvent, event);
    193197#endif
    194198#if ENABLE(INPUT_SPEECH)
  • trunk/Source/WebCore/bindings/js/JSEventTarget.cpp

    r78908 r82963  
    8585
    8686#if ENABLE(WEB_AUDIO)
     87#include "AudioContext.h"
     88#include "JSAudioContext.h"
    8789#include "JSJavaScriptAudioNode.h"
    8890#include "JavaScriptAudioNode.h"
     
    174176    if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode())
    175177        return toJS(exec, globalObject, jsAudioNode);
     178    if (AudioContext* audioContext = target->toAudioContext())
     179        return toJS(exec, globalObject, audioContext);
    176180#endif
    177181
  • trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp

    r78005 r82963  
    8585
    8686#if ENABLE(WEB_AUDIO)
     87#include "V8AudioContext.h"
    8788#include "V8JavaScriptAudioNode.h"
    8889#endif
     
    445446    if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode())
    446447        return toV8(jsAudioNode);
     448    if (AudioContext* audioContext = target->toAudioContext())
     449        return toV8(audioContext);
    447450#endif   
    448451
  • trunk/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp

    r78360 r82963  
    5252        return throwError("AudioContext constructor associated document is unavailable", V8Proxy::ReferenceError);
    5353
    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);
    5582   
    5683    // Transform the holder into a wrapper object for the audio context.
  • trunk/Source/WebCore/bindings/v8/custom/V8EventCustom.cpp

    r78752 r82963  
    7171#if ENABLE(WEB_AUDIO)
    7272#include "V8AudioProcessingEvent.h"
     73#include "V8OfflineAudioCompletionEvent.h"
    7374#endif
    7475
     
    170171    if (impl->isAudioProcessingEvent())
    171172        return toV8(static_cast<AudioProcessingEvent*>(impl));
     173    if (impl->isOfflineAudioCompletionEvent())
     174        return toV8(static_cast<OfflineAudioCompletionEvent*>(impl));
    172175#endif
    173176#if ENABLE(INPUT_SPEECH)
  • trunk/Source/WebCore/dom/Event.cpp

    r82925 r82963  
    230230    return false;
    231231}
     232
     233bool Event::isOfflineAudioCompletionEvent() const
     234{
     235    return false;
     236}
    232237#endif
    233238
  • trunk/Source/WebCore/dom/Event.h

    r82891 r82963  
    132132#if ENABLE(WEB_AUDIO)
    133133        virtual bool isAudioProcessingEvent() const;
     134        virtual bool isOfflineAudioCompletionEvent() const;
    134135#endif
    135136        virtual bool isErrorEvent() const;
  • trunk/Source/WebCore/dom/EventTarget.cpp

    r78908 r82963  
    120120
    121121#if ENABLE(WEB_AUDIO)
     122AudioContext* EventTarget::toAudioContext()
     123{
     124    return 0;
     125}
     126
    122127JavaScriptAudioNode* EventTarget::toJavaScriptAudioNode()
    123128{
  • trunk/Source/WebCore/dom/EventTarget.h

    r78908 r82963  
    4141namespace WebCore {
    4242
     43    class AudioContext;
    4344    class AbstractWorker;
    4445    class DedicatedWorkerContext;
     
    123124
    124125#if ENABLE(WEB_AUDIO)
     126        virtual AudioContext* toAudioContext();
    125127        virtual JavaScriptAudioNode* toJavaScriptAudioNode();
    126128#endif
  • trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.cpp

    r68470 r82963  
    121121}
    122122
     123
     124void HRTFDatabaseLoader::waitForLoaderThreadCompletion()
     125{
     126    ASSERT(!isMainThread());
     127    ASSERT(m_databaseLoaderThread);
     128    waitForThreadCompletion(m_databaseLoaderThread, 0);   
     129}
     130
    123131HRTFDatabase* HRTFDatabaseLoader::defaultHRTFDatabase()
    124132{
  • trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.h

    r68470 r82963  
    4747    static PassRefPtr<HRTFDatabaseLoader> createAndLoadAsynchronouslyIfNecessary(double sampleRate);
    4848
     49    // Returns the singleton HRTFDatabaseLoader.
     50    static HRTFDatabaseLoader* loader() { return s_loader; }
     51   
    4952    // Both constructor and destructor must be called from the main thread.
    5053    ~HRTFDatabaseLoader();
     
    5255    // Returns true once the default database has been completely loaded.
    5356    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();
    5461   
    5562    HRTFDatabase* database() { return m_hrtfDatabase.get(); }
  • trunk/Source/WebCore/webaudio/AudioContext.cpp

    r78102 r82963  
    4040#include "AudioPannerNode.h"
    4141#include "ConvolverNode.h"
     42#include "DefaultAudioDestinationNode.h"
    4243#include "DelayNode.h"
    4344#include "Document.h"
     
    4849#include "JavaScriptAudioNode.h"
    4950#include "LowPass2FilterNode.h"
     51#include "OfflineAudioCompletionEvent.h"
     52#include "OfflineAudioDestinationNode.h"
    5053#include "PlatformString.h"
    5154#include "RealtimeAnalyserNode.h"
     
    6770}
    6871
     72PassRefPtr<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.
    6978AudioContext::AudioContext(Document* document)
    7079    : ActiveDOMObject(document, this)
     
    7685    , m_audioThread(0)
    7786    , 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);
    8992
    9093    // This sets in motion an asynchronous loading mechanism on another thread.
     
    9396    // when this has finished (see AudioDestinationNode).
    9497    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.
     105AudioContext::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
     126void 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));
    95137}
    96138
     
    168210}
    169211
    170 Document* AudioContext::document()
     212Document* AudioContext::document() const
    171213{
    172214    ASSERT(m_document);
     
    527569}
    528570
     571ScriptExecutionContext* AudioContext::scriptExecutionContext() const
     572{
     573    return document();
     574}
     575
     576AudioContext* AudioContext::toAudioContext()
     577{
     578    return this;
     579}
     580
     581void AudioContext::startRendering()
     582{
     583    destination()->startRendering();
     584}
     585
     586void 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}
    529604
    530605} // namespace WebCore
  • trunk/Source/WebCore/webaudio/AudioContext.h

    r73174 r82963  
    2929#include "AudioBus.h"
    3030#include "AudioDestinationNode.h"
     31#include "EventListener.h"
     32#include "EventTarget.h"
    3133#include "HRTFDatabaseLoader.h"
    3234#include <wtf/HashSet.h>
     
    6062// For thread safety between the audio thread and the main thread, it has a rendering graph locking mechanism.
    6163
    62 class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext> {
     64class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext>, public EventTarget {
    6365public:
     66    // Create an AudioContext for rendering to the audio hardware.
    6467    static PassRefPtr<AudioContext> create(Document*);
    6568
     69    // Create an AudioContext for offline (non-realtime) rendering.
     70    static PassRefPtr<AudioContext> createOfflineContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate);
     71
    6672    virtual ~AudioContext();
    6773
    6874    bool isInitialized() const;
     75   
     76    bool isOfflineContext() { return m_isOfflineContext; }
    6977
    7078    // Returns true when initialize() was called AND all asynchronous initialization has completed.
     
    7482    virtual void stop();
    7583
    76     Document* document(); // ASSERTs if document no longer exists.
     84    Document* document() const; // ASSERTs if document no longer exists.
    7785    bool hasDocument();
    7886
     
    181189    void markAudioNodeInputDirty(AudioNodeInput*);
    182190    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();
    183206   
    184207private:
    185208    AudioContext(Document*);
     209    AudioContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate);
     210    void constructCommon();
     211
    186212    void lazyInitialize();
    187213    void uninitialize();
     
    253279    // HRTF Database loader
    254280    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;
    255290};
    256291
  • trunk/Source/WebCore/webaudio/AudioContext.idl

    r78360 r82963  
    2828        CanBeConstructed,
    2929        CustomConstructFunction,
    30         V8CustomConstructor
     30        V8CustomConstructor,
     31#if defined(V8_BINDING) && V8_BINDING
     32        EventTarget
     33#endif       
    3134    ] AudioContext {
    3235        // All rendered audio ultimately connects to destination, which represents the audio hardware.
     
    6366        AudioChannelSplitter createChannelSplitter();
    6467        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       
    6574    };
    6675}
  • trunk/Source/WebCore/webaudio/AudioDestinationNode.cpp

    r71200 r82963  
    3333#include "AudioNodeInput.h"
    3434#include "AudioNodeOutput.h"
    35 #include <wtf/Threading.h>
    3635
    3736namespace WebCore {
    38 
    39 AudioDestinationNode::AudioDestinationNode(AudioContext* context)
    40     : AudioNode(context, AudioDestination::hardwareSampleRate())
     37   
     38AudioDestinationNode::AudioDestinationNode(AudioContext* context, double sampleRate)
     39    : AudioNode(context, sampleRate)
    4140    , m_currentTime(0.0)
    4241{
     
    4443   
    4544    setType(NodeTypeDestination);
    46    
    47     initialize();
    4845}
    4946
     
    5148{
    5249    uninitialize();
    53 }
    54 
    55 void AudioDestinationNode::initialize()
    56 {
    57     if (isInitialized())
    58         return;
    59 
    60     double hardwareSampleRate = AudioDestination::hardwareSampleRate();
    61 #ifndef NDEBUG   
    62     fprintf(stderr, ">>>> hardwareSampleRate = %f\n", hardwareSampleRate);
    63 #endif
    64    
    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();
    7950}
    8051
  • trunk/Source/WebCore/webaudio/AudioDestinationNode.h

    r71149 r82963  
    2626#define AudioDestinationNode_h
    2727
    28 #include "AudioDestination.h"
     28#include "AudioBuffer.h"
    2929#include "AudioNode.h"
    3030#include "AudioSourceProvider.h"
    31 #include <wtf/OwnPtr.h>
    32 #include <wtf/PassRefPtr.h>
    3331
    3432namespace WebCore {
     
    3937class AudioDestinationNode : public AudioNode, public AudioSourceProvider {
    4038public:
    41     static PassRefPtr<AudioDestinationNode> create(AudioContext* context)
    42     {
    43         return adoptRef(new AudioDestinationNode(context));       
    44     }
    45 
     39    AudioDestinationNode(AudioContext*, double sampleRate);
    4640    virtual ~AudioDestinationNode();
    4741   
     
    4943    virtual void process(size_t) { }; // we're pulled by hardware so this is never called
    5044    virtual void reset() { m_currentTime = 0.0; };
    51     virtual void initialize();
    52     virtual void uninitialize();
    5345   
    5446    // The audio hardware calls here periodically to gets its input stream.
     
    5749    double currentTime() { return m_currentTime; }
    5850
    59     double sampleRate() const { return m_destination->sampleRate(); }
     51    virtual double sampleRate() const = 0;
    6052
    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;
    6256   
    63 private:
    64     AudioDestinationNode(AudioContext*);
    65 
    66     OwnPtr<AudioDestination> m_destination;
     57protected:
    6758    double m_currentTime;
    6859};
  • trunk/Source/WebCore/webaudio/ConvolverNode.cpp

    r71195 r82963  
    3030
    3131#include "AudioBuffer.h"
     32#include "AudioContext.h"
    3233#include "AudioNodeInput.h"
    3334#include "AudioNodeOutput.h"
     
    132133   
    133134    // 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));
    135137
    136138    {
Note: See TracChangeset for help on using the changeset viewer.