/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/**
 * This file defines the <code>PPB_Audio</code> interface, which provides
 * realtime stereo audio streaming capabilities.
 */

label Chrome {
  M14 = 1.0,
  M31 = 1.1
};

/**
 * <code>PPB_Audio_Callback</code> defines the type of an audio callback
 * function used to fill the audio buffer with data. Please see the
 * Create() function in the <code>PPB_Audio</code> interface for
 * more details on this callback.
 *
 * @param[in] sample_buffer A buffer to fill with audio data.
 * @param[in] buffer_size_in_bytes The size of the buffer in bytes.
 * @param[in] latency How long before the audio data is to be presented.
 * @param[inout] user_data An opaque pointer that was passed into
 * <code>PPB_Audio.Create()</code>.
 */
typedef void PPB_Audio_Callback([out] mem_t sample_buffer,
                                [in] uint32_t buffer_size_in_bytes,
                                [in, version=1.1] PP_TimeDelta latency,
                                [inout] mem_t user_data);

/**
 * The <code>PPB_Audio</code> interface contains pointers to several functions
 * for handling audio resources. Refer to the
 * <a href="/native-client/devguide/coding/audio.html">Audio</a>
 * chapter in the Developer's Guide for information on using this interface.
 * Please see descriptions for each <code>PPB_Audio</code> and
 * <code>PPB_AudioConfig</code> function for more details. A C example using
 * <code>PPB_Audio</code> and <code>PPB_AudioConfig</code> follows.
 *
 * <strong>Example: </strong>
 * 
 * @code
 * void audio_callback(void* sample_buffer,
 *                     uint32_t buffer_size_in_bytes,
 *                     void* user_data) {
 *   ... quickly fill in the buffer with samples and return to caller ...
 *  }
 *
 * ...Assume the application has cached the audio configuration interface in
 * audio_config_interface and the audio interface in
 * audio_interface...
 *
 * uint32_t count = audio_config_interface->RecommendSampleFrameCount(
 *     PP_AUDIOSAMPLERATE_44100, 4096);
 * PP_Resource pp_audio_config = audio_config_interface->CreateStereo16Bit(
 *     pp_instance, PP_AUDIOSAMPLERATE_44100, count);
 * PP_Resource pp_audio = audio_interface->Create(pp_instance, pp_audio_config,
 *     audio_callback, NULL);
 * audio_interface->StartPlayback(pp_audio);
 *
 * ...audio_callback() will now be periodically invoked on a separate thread...
 * @endcode
 */
interface PPB_Audio {
 /**
  * Create() creates an audio resource. No sound will be heard until
  * StartPlayback() is called. The callback is called with the buffer address
  * and given user data whenever the buffer needs to be filled. From within the
  * callback, you should not call <code>PPB_Audio</code> functions. The
  * callback will be called on a different thread than the one which created
  * the interface. For performance-critical applications (i.e. low-latency
  * audio), the callback should avoid blocking or calling functions that can
  * obtain locks, such as malloc. The layout and the size of the buffer passed
  * to the audio callback will be determined by the device configuration and is
  * specified in the <code>AudioConfig</code> documentation.
  *
  * @param[in] instance A <code>PP_Instance</code> identifying one instance
  * of a module.
  * @param[in] config A <code>PP_Resource</code> corresponding to an audio
  * config resource.
  * @param[in] audio_callback A <code>PPB_Audio_Callback</code> callback
  * function that the browser calls when it needs more samples to play.
  * @param[in] user_data A pointer to user data used in the callback function.
  *
  * @return A <code>PP_Resource</code> containing the audio resource if
  * successful or 0 if the configuration cannot be honored or the callback is
  * null.
  */
  PP_Resource Create(
      [in] PP_Instance instance,
      [in] PP_Resource config,
      [in] PPB_Audio_Callback audio_callback,
      [inout] mem_t user_data);

  /**
   * IsAudio() determines if the provided resource is an audio resource.
   *
   * @param[in] resource A <code>PP_Resource</code> corresponding to a generic
   * resource.
   *
   * @return A <code>PP_Bool</code> containing containing <code>PP_TRUE</code>
   * if the given resource is an Audio resource, otherwise
   * <code>PP_FALSE</code>.
   */
  PP_Bool IsAudio(
      [in] PP_Resource resource);

  /**
   * GetCurrrentConfig() returns an audio config resource for the given audio
   * resource.
   *
   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
   * resource.
   *
   * @return A <code>PP_Resource</code> containing the audio config resource if
   * successful.
   */
  PP_Resource GetCurrentConfig(
      [in] PP_Resource audio);

  /**
   * StartPlayback() starts the playback of the audio resource and begins
  * periodically calling the callback.
   *
   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
   * resource.
   *
   * @return A <code>PP_Bool</code> containing <code>PP_TRUE</code> if
   * successful, otherwise <code>PP_FALSE</code>. Also returns
   * <code>PP_TRUE</code> (and be a no-op) if called while playback is already
   * in progress.
   */
  PP_Bool StartPlayback(
      [in] PP_Resource audio);

  /**
   * StopPlayback() stops the playback of the audio resource.
   *
   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
   * resource.
   *
   * @return A <code>PP_Bool</code> containing <code>PP_TRUE</code> if
   * successful, otherwise <code>PP_FALSE</code>. Also returns
   * <code>PP_TRUE</code> (and is a no-op) if called while playback is already
   * stopped. If a callback is in progress, StopPlayback() will block until the
   * callback completes.
   */
  PP_Bool StopPlayback(
      [in] PP_Resource audio);
};

