/*
 *  Copyright 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_API_MEDIASTREAMPROVIDER_H_
#define WEBRTC_API_MEDIASTREAMPROVIDER_H_

#include "webrtc/base/basictypes.h"
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/media/base/videosinkinterface.h"

namespace cricket {

class AudioRenderer;
class VideoCapturer;
class VideoFrame;
class VideoRenderer;
struct AudioOptions;
struct VideoOptions;

}  // namespace cricket

namespace webrtc {

class AudioSinkInterface;

// TODO(deadbeef): Change the key from an ssrc to a "sender_id" or
// "receiver_id" string, which will be the MSID in the short term and MID in
// the long term.

// TODO(deadbeef): These interfaces are effectively just a way for the
// RtpSenders/Receivers to get to the BaseChannels. These interfaces should be
// refactored away eventually, as the classes converge.

// This interface is called by AudioRtpSender/Receivers to change the settings
// of an audio track connected to certain PeerConnection.
class AudioProviderInterface {
 public:
  // Enable/disable the audio playout of a remote audio track with |ssrc|.
  virtual void SetAudioPlayout(uint32_t ssrc, bool enable) = 0;
  // Enable/disable sending audio on the local audio track with |ssrc|.
  // When |enable| is true |options| should be applied to the audio track.
  virtual void SetAudioSend(uint32_t ssrc,
                            bool enable,
                            const cricket::AudioOptions& options,
                            cricket::AudioRenderer* renderer) = 0;

  // Sets the audio playout volume of a remote audio track with |ssrc|.
  // |volume| is in the range of [0, 10].
  virtual void SetAudioPlayoutVolume(uint32_t ssrc, double volume) = 0;

  // Allows for setting a direct audio sink for an incoming audio source.
  // Only one audio sink is supported per ssrc and ownership of the sink is
  // passed to the provider.
  virtual void SetRawAudioSink(
      uint32_t ssrc,
      rtc::scoped_ptr<webrtc::AudioSinkInterface> sink) = 0;

 protected:
  virtual ~AudioProviderInterface() {}
};

// This interface is called by VideoRtpSender/Receivers to change the settings
// of a video track connected to a certain PeerConnection.
class VideoProviderInterface {
 public:
  virtual bool SetCaptureDevice(uint32_t ssrc,
                                cricket::VideoCapturer* camera) = 0;
  // Enable/disable the video playout of a remote video track with |ssrc|.
  virtual void SetVideoPlayout(
      uint32_t ssrc,
      bool enable,
      rtc::VideoSinkInterface<cricket::VideoFrame>* sink) = 0;
  // Enable sending video on the local video track with |ssrc|.
  virtual void SetVideoSend(uint32_t ssrc,
                            bool enable,
                            const cricket::VideoOptions* options) = 0;

 protected:
  virtual ~VideoProviderInterface() {}
};

}  // namespace webrtc

#endif  // WEBRTC_API_MEDIASTREAMPROVIDER_H_
