/*
 *  Copyright (c) 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 VOICE_ENGINE_SHARED_DATA_H_
#define VOICE_ENGINE_SHARED_DATA_H_

#include <memory>

#include "modules/audio_device/include/audio_device.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "modules/utility/include/process_thread.h"
#include "rtc_base/criticalsection.h"
#include "rtc_base/scoped_ref_ptr.h"
#include "rtc_base/task_queue.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/thread_checker.h"
#include "voice_engine/channel_manager.h"
#include "voice_engine/voice_engine_defines.h"

class ProcessThread;

namespace webrtc {
namespace voe {

class TransmitMixer;

class SharedData
{
public:
    // Public accessors.
    uint32_t instance_id() const { return _instanceId; }
    ChannelManager& channel_manager() { return _channelManager; }
    AudioDeviceModule* audio_device() { return _audioDevicePtr.get(); }
    void set_audio_device(
        const rtc::scoped_refptr<AudioDeviceModule>& audio_device);
    void set_audio_processing(AudioProcessing* audio_processing);
    TransmitMixer* transmit_mixer() { return _transmitMixerPtr; }
    rtc::CriticalSection* crit_sec() { return &_apiCritPtr; }
    ProcessThread* process_thread() { return _moduleProcessThreadPtr.get(); }
    rtc::TaskQueue* encoder_queue();

    int NumOfSendingChannels();
    int NumOfPlayingChannels();

protected:
 rtc::ThreadChecker construction_thread_;
 const uint32_t _instanceId;
 rtc::CriticalSection _apiCritPtr;
 ChannelManager _channelManager;
 rtc::scoped_refptr<AudioDeviceModule> _audioDevicePtr;
 TransmitMixer* _transmitMixerPtr;
 std::unique_ptr<ProcessThread> _moduleProcessThreadPtr;
 // |encoder_queue| is defined last to ensure all pending tasks are cancelled
 // and deleted before any other members.
 rtc::TaskQueue encoder_queue_ RTC_ACCESS_ON(construction_thread_);

 SharedData();
 virtual ~SharedData();
};

}  // namespace voe
}  // namespace webrtc
#endif // VOICE_ENGINE_SHARED_DATA_H_
