/*
 * Copyright (C) 2010, Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */

#ifndef DelayNode_h
#define DelayNode_h

#include "modules/webaudio/AudioNode.h"

namespace blink {

class BaseAudioContext;
class DelayOptions;
class ExceptionState;

class DelayNode final : public AudioNode {
  DEFINE_WRAPPERTYPEINFO();

 public:
  static DelayNode* create(BaseAudioContext&, ExceptionState&);
  static DelayNode* create(BaseAudioContext&,
                           double maxDelayTime,
                           ExceptionState&);
  static DelayNode* create(BaseAudioContext*,
                           const DelayOptions&,
                           ExceptionState&);
  DECLARE_VIRTUAL_TRACE();
  AudioParam* delayTime();

 private:
  DelayNode(BaseAudioContext&, double maxDelayTime);

  Member<AudioParam> m_delayTime;
};

}  // namespace blink

#endif  // DelayNode_h
