// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// https://www.w3.org/TR/webaudio/#AudioContext-section

[
    Constructor,
    ConstructorCallWith=EnvironmentSettings,
]
interface AudioContext : EventTarget {
  readonly attribute AudioDestinationNode destination;
  readonly attribute float sampleRate;
  readonly attribute double currentTime;

  [CallWith=EnvironmentSettings] void decodeAudioData(
      ArrayBuffer audioData, DecodeSuccessCallback successCallback,
      optional DecodeErrorCallback errorCallback);

  // AudioNode creation
  [CallWith=EnvironmentSettings] AudioBufferSourceNode createBufferSource();

  // AudioBuffer creation
  AudioBuffer createBuffer(unsigned long numOfChannels, unsigned long length,
                           float sample_rate);
};

callback DecodeSuccessCallback = void(AudioBuffer decodedData);
callback DecodeErrorCallback = void();
