/*
 * Copyright (C) 2010, Google Inc. All rights reserved.
 * Copyright (C) 2011 Apple 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.
 */

[
    ActiveDOMObject,
    Conditional=WEB_AUDIO,
    EnabledBySetting=WebAudioEnabled,
    ExportMacro=WEBCORE_EXPORT,
    JSGenerateToNativeObject,
    Exposed=Window
] interface AudioContext : BaseAudioContext {
    [CallWith=CurrentDocument] constructor(optional AudioContextOptions contextOptions);

    readonly attribute double baseLatency;

    // FIXME: Add support.
    // readonly attribute double outputLatency;

    AudioTimestamp getOutputTimestamp();

    [ImplementedAs=suspendRendering] Promise<undefined> suspend();
    [ImplementedAs=resumeRendering] Promise<undefined> resume();
    Promise<undefined> close();

    [Conditional=VIDEO] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement);
    [Conditional=MEDIA_STREAM] MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
    [Conditional=MEDIA_STREAM] MediaStreamAudioDestinationNode createMediaStreamDestination();

    // FIXME: Add support.
    // MediaStreamTrackAudioSourceNode createMediaStreamTrackSource(MediaStreamTrack mediaStreamTrack);
};
