// Copyright 2014 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 MEDIA_AUDIO_AUDIO_OUTPUT_STREAM_SINK_H_
#define MEDIA_AUDIO_AUDIO_OUTPUT_STREAM_SINK_H_

#include <stdint.h>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/single_thread_task_runner.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "base/time/time.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_renderer_sink.h"
#include "media/base/media_export.h"

namespace media {

// Wrapper which exposes the browser side audio interface (AudioOutputStream) as
// if it were a renderer side audio interface (AudioRendererSink). Note: This
// will not work for sandboxed renderers.
//
// TODO(dalecurtis): Delete this class once we have a proper mojo audio service;
// tracked by http://crbug.com/425368
class MEDIA_EXPORT AudioOutputStreamSink
    : public RestartableAudioRendererSink,
      public AudioOutputStream::AudioSourceCallback {
 public:
  AudioOutputStreamSink();

  // RestartableAudioRendererSink implementation.
  void Initialize(const AudioParameters& params,
                  RenderCallback* callback) override;
  void Start() override;
  void Stop() override;
  void Pause() override;
  void Play() override;
  bool SetVolume(double volume) override;
  OutputDeviceInfo GetOutputDeviceInfo() override;
  void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override;
  bool IsOptimizedForHardwareParameters() override;
  bool CurrentThreadIsRenderingThread() override;

  // AudioSourceCallback implementation.
  int OnMoreData(base::TimeDelta delay,
                 base::TimeTicks delay_timestamp,
                 int prior_frames_skipped,
                 AudioBus* dest) override;
  void OnError(ErrorType type) override;
  void Flush() override;

 private:
  ~AudioOutputStreamSink() override;
  void ClearCallback();

  // Helper methods for running AudioManager methods on the audio thread.
  void DoStart(const AudioParameters& params);
  void DoStop();
  void DoPause();
  void DoFlush();
  void DoPlay();
  void DoSetVolume(double volume);

  bool initialized_;
  bool started_;

  // Parameters provided by Initialize().
  AudioParameters params_;
  RenderCallback* render_callback_;

  // State latched for the audio thread.
  // |active_render_callback_| allows Stop()/Pause() to synchronously prevent
  // callbacks. Access is synchronized by |callback_lock_|.
  // |active_params_| is set on the audio thread and therefore does not need
  // synchronization.
  AudioParameters active_params_;
  RenderCallback* active_render_callback_ GUARDED_BY(callback_lock_);

  // Lock to synchronize setting and clearing of |active_render_callback_|.
  base::Lock callback_lock_;

  // The task runner for the audio thread.
  const scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;

  // The actual AudioOutputStream, must only be accessed on the audio thread.
  AudioOutputStream* stream_;

  DISALLOW_COPY_AND_ASSIGN(AudioOutputStreamSink);
};

}  // namespace media

#endif  // MEDIA_AUDIO_AUDIO_OUTPUT_STREAM_SINK_H_
