Home | History | Annotate | Download | only in webaudio
      1 /*
      2  * Copyright (C) 2012, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1.  Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2.  Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include "config.h"
     26 
     27 #if ENABLE(WEB_AUDIO)
     28 
     29 #include "modules/webaudio/OfflineAudioContext.h"
     30 
     31 #include "bindings/core/v8/ExceptionMessages.h"
     32 #include "bindings/core/v8/ExceptionState.h"
     33 #include "core/dom/Document.h"
     34 #include "core/dom/ExceptionCode.h"
     35 #include "core/dom/ExecutionContext.h"
     36 #include "platform/audio/AudioUtilities.h"
     37 
     38 namespace blink {
     39 
     40 OfflineAudioContext* OfflineAudioContext::create(ExecutionContext* context, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate, ExceptionState& exceptionState)
     41 {
     42     // FIXME: add support for workers.
     43     if (!context || !context->isDocument()) {
     44         exceptionState.throwDOMException(
     45             NotSupportedError,
     46             "Workers are not supported.");
     47         return 0;
     48     }
     49 
     50     Document* document = toDocument(context);
     51 
     52     if (!numberOfFrames) {
     53         exceptionState.throwDOMException(SyntaxError, "number of frames cannot be zero.");
     54         return 0;
     55     }
     56 
     57     if (numberOfChannels > AudioContext::maxNumberOfChannels()) {
     58         exceptionState.throwDOMException(
     59             IndexSizeError,
     60             ExceptionMessages::indexOutsideRange<unsigned>(
     61                 "number of channels",
     62                 numberOfChannels,
     63                 0,
     64                 ExceptionMessages::InclusiveBound,
     65                 AudioContext::maxNumberOfChannels(),
     66                 ExceptionMessages::InclusiveBound));
     67         return 0;
     68     }
     69 
     70     if (!AudioUtilities::isValidAudioBufferSampleRate(sampleRate)) {
     71         exceptionState.throwDOMException(
     72             IndexSizeError,
     73             ExceptionMessages::indexOutsideRange(
     74                 "sampleRate", sampleRate,
     75                 AudioUtilities::minAudioBufferSampleRate(), ExceptionMessages::InclusiveBound,
     76                 AudioUtilities::maxAudioBufferSampleRate(), ExceptionMessages::InclusiveBound));
     77         return nullptr;
     78     }
     79 
     80     OfflineAudioContext* audioContext = adoptRefCountedGarbageCollectedWillBeNoop(new OfflineAudioContext(document, numberOfChannels, numberOfFrames, sampleRate));
     81 
     82     if (!audioContext->destination()) {
     83         exceptionState.throwDOMException(
     84             NotSupportedError,
     85             "OfflineAudioContext(" + String::number(numberOfChannels)
     86             + ", " + String::number(numberOfFrames)
     87             + ", " + String::number(sampleRate)
     88             + ")");
     89     }
     90 
     91     audioContext->suspendIfNeeded();
     92     return audioContext;
     93 }
     94 
     95 OfflineAudioContext::OfflineAudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate)
     96     : AudioContext(document, numberOfChannels, numberOfFrames, sampleRate)
     97 {
     98 }
     99 
    100 OfflineAudioContext::~OfflineAudioContext()
    101 {
    102 }
    103 
    104 } // namespace blink
    105 
    106 #endif // ENABLE(WEB_AUDIO)
    107