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

#ifndef COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_
#define COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_

#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/media_stream/audio_parameters.h"
#include "cobalt/media_stream/media_stream_audio_deliverer.h"
#include "cobalt/media_stream/media_stream_audio_track.h"
#include "cobalt/media_stream/media_stream_source.h"

namespace cobalt {
namespace media_stream {

// Base class that provides functionality to connect tracks
// and have audio data delivered to them.
// Subclasses should:
//   implement |EnsureSourceIsStarted()| and |EnsureSourceIsStopped()|
//   call |SetFormat()| and |DeliverDataToTracks()|
class MediaStreamAudioSource : public MediaStreamSource {
 public:
  MediaStreamAudioSource();
  ~MediaStreamAudioSource() override;

  // Connects this source to the track. One source can be connected to multiple
  // tracks.  Returns true if successful.
  bool ConnectToTrack(MediaStreamAudioTrack* track);

 protected:
  // Subclasses should override these Ensure* methods.

  // Returns true if the source has been successfully started.
  // After the source has been started, subclasses should call
  // |DeliverDataToTracks| to deliver the data.
  virtual bool EnsureSourceIsStarted() = 0;
  // Stops the source. |DeliverDataToTracks| must not be called after
  // the source is stopped.
  virtual void EnsureSourceIsStopped() = 0;

  // Subclasses should call these methods. |DeliverDataToTracks| can be
  // called from a different thread than where MediaStreamAudioSource
  // was created.
  void DeliverDataToTracks(
      const MediaStreamAudioTrack::ShellAudioBus& audio_bus,
      base::TimeTicks reference_time);

  void SetFormat(const media_stream::AudioParameters& params) {
    DLOG(INFO) << "MediaStreamAudioSource@" << this << "::SetFormat("
               << params.AsHumanReadableString() << "), was previously set to {"
               << deliverer_.GetAudioParameters().AsHumanReadableString()
               << "}.";
    deliverer_.OnSetFormat(params);
  }

 protected:
  void NotifyTracksOfNewReadyState(
      MediaStreamAudioTrack::ReadyState new_ready_state);

 private:
  MediaStreamAudioSource(const MediaStreamAudioSource&) = delete;
  MediaStreamAudioSource& operator=(const MediaStreamAudioSource&) = delete;

  void DoStopSource() final;
  void StopAudioDeliveryTo(MediaStreamAudioTrack* track);

  base::ThreadChecker thread_checker_;
  base::Closure stop_callback_;

  base::WeakPtrFactory<MediaStreamAudioSource> weak_ptr_factory_;
  base::WeakPtr<MediaStreamAudioSource> weak_this_;

  MediaStreamAudioDeliverer<MediaStreamAudioTrack> deliverer_;

  bool is_stopped_ = false;

  FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioSourceTest, DeliverData);
};

}  // namespace media_stream
}  // namespace cobalt

#endif  // COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_
