// 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 MEDIA_AUDIO_AUDIO_DEVICE_THREAD_H_
#define MEDIA_AUDIO_AUDIO_DEVICE_THREAD_H_

#include <stdint.h>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/shared_memory.h"
#include "base/sync_socket.h"
#include "base/synchronization/lock.h"
#include "media/audio/audio_parameters.h"
#include "media/base/media_export.h"

namespace base {
class MessageLoop;
}

namespace media {
class AudioBus;

// Data transfer between browser and render process uses a combination
// of sync sockets and shared memory. To read from the socket and render
// data, we use a worker thread, a.k.a. the AudioDeviceThread, which reads
// data from the browser via the socket and fills the shared memory from the
// audio thread via the AudioDeviceThread::Callback interface/class.
// For more details see the documentation in audio_device.h.
//
// TODO(tommi): Multiple audio input/output device instances should be able to
// share the same thread instead of spinning one per instance.
class MEDIA_EXPORT AudioDeviceThread {
 public:
  // This is the callback interface/base class that Audio[Output|Input]Device
  // implements to render input/output data. The callbacks run on the
  // thread owned by AudioDeviceThread.
  class Callback {
   public:
    Callback(const AudioParameters& audio_parameters,
             base::SharedMemoryHandle memory,
             int memory_length,
             int total_segments);
    virtual ~Callback();

    // One time initialization for the callback object on the audio thread.
    void InitializeOnAudioThread();

    // Derived implementations must call shared_memory_.Map appropriately
    // before Process can be called.
    virtual void MapSharedMemory() = 0;

    // Called whenever we receive notifications about pending input data.
    virtual void Process(uint32_t pending_data) = 0;

   protected:
    // Protected so that derived classes can access directly.
    // The variables are 'const' since values are calculated/set in the
    // constructor and must never change.
    const AudioParameters audio_parameters_;
    const int samples_per_ms_;
    const int bytes_per_ms_;

    base::SharedMemory shared_memory_;
    const int memory_length_;
    const int total_segments_;
    int segment_length_;

   private:
    DISALLOW_COPY_AND_ASSIGN(Callback);
  };

  AudioDeviceThread();
  ~AudioDeviceThread();

  // Starts the audio thread. The thread must not already be running.  If
  // |sychronized_buffers| is set, the browser expects to be notified via the
  // |socket| every time AudioDeviceThread::Process() completes.
  void Start(AudioDeviceThread::Callback* callback,
             base::SyncSocket::Handle socket,
             const char* thread_name,
             bool synchronized_buffers);

  // This tells the audio thread to stop and clean up the data.
  // The method can stop the thread synchronously or asynchronously.
  // In the latter case, the thread will still be running after Stop()
  // returns, but the callback pointer is cleared so no further callbacks will
  // be made (IOW after Stop() returns, it is safe to delete the callback).
  // The |loop_for_join| parameter is required for asynchronous operation
  // in order to join the worker thread and close the thread handle later via a
  // posted task.
  // If set to NULL, function will wait for the thread to exit before returning.
  void Stop(base::MessageLoop* loop_for_join);

  // Returns true if the thread is stopped or stopping.
  bool IsStopped();

 private:
  // Our own private SimpleThread override.  We implement this in a
  // private class so that we get the following benefits:
  // 1) AudioDeviceThread doesn't expose SimpleThread methods.
  //    I.e. the caller can't call Start()/Stop() - which would be bad.
  // 2) We override ThreadMain to add additional on-thread initialization
  //    while still synchronized with SimpleThread::Start() to provide
  //    reliable initialization.
  class Thread;

  base::Lock thread_lock_;
  scoped_refptr<AudioDeviceThread::Thread> thread_;

  DISALLOW_COPY_AND_ASSIGN(AudioDeviceThread);
};

}  // namespace media.

#endif  // MEDIA_AUDIO_AUDIO_DEVICE_THREAD_H_
