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