// 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.

#ifndef PPAPI_CPP_AUDIO_H_
#define PPAPI_CPP_AUDIO_H_

#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/ppb_audio.h"
#include "ppapi/cpp/audio_config.h"
#include "ppapi/cpp/resource.h"

/// @file
/// This file defines the API to create realtime stereo audio streaming
/// capabilities.

namespace pp {

class InstanceHandle;

/// An audio resource. 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.
class Audio : public Resource {
 public:

  /// An empty constructor for an Audio resource.
  Audio() {}

  /// A constructor that 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 (such
  /// as 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 The instance with which this resource will be
  /// associated.
  /// @param[in] config An <code>AudioConfig</code> containing the audio config
  /// resource.
  /// @param[in] 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.
  Audio(const InstanceHandle& instance,
        const AudioConfig& config,
        PPB_Audio_Callback callback,
        void* user_data);

  /// A constructor that creates an Audio resource.
  ///
  /// @param[in] instance The instance with which this resource will be
  /// associated.
  /// @param[in] config An <code>AudioConfig</code> containing the audio config
  /// resource.
  /// @param[in] callback A <code>PPB_Audio_Callback_1_0</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.
  Audio(const InstanceHandle& instance,
        const AudioConfig& config,
        PPB_Audio_Callback_1_0 callback,
        void* user_data);

  /// Getter function for returning the internal <code>PPB_AudioConfig</code>
  /// struct.
  ///
  /// @return A mutable reference to the PPB_AudioConfig struct.
  AudioConfig& config() { return config_; }

  /// Getter function for returning the internal <code>PPB_AudioConfig</code>
  /// struct.
  ///
  /// @return A const reference to the internal <code>PPB_AudioConfig</code>
  /// struct.
  const AudioConfig& config() const { return config_; }

  /// StartPlayback() starts playback of audio.
  ///
  /// @return true if successful, otherwise false.
  bool StartPlayback();

  /// StopPlayback stops playback of audio.
  ///
  /// @return true if successful, otherwise false.
  bool StopPlayback();

 private:
  AudioConfig config_;
  bool use_1_0_interface_;
};

}  // namespace pp

#endif  // PPAPI_CPP_AUDIO_H_

