/*
 *  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.
 */

#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/tick_util.h"
#include "webrtc/voice_engine/monitor_module.h"

namespace webrtc  {

namespace voe  {

MonitorModule::MonitorModule() :
    _observerPtr(NULL),
    _callbackCritSect(*CriticalSectionWrapper::CreateCriticalSection()),
    _lastProcessTime(TickTime::MillisecondTimestamp())
{
}

MonitorModule::~MonitorModule()
{
    delete &_callbackCritSect;
}

int32_t 
MonitorModule::RegisterObserver(MonitorObserver& observer)
{
    CriticalSectionScoped lock(&_callbackCritSect);
    if (_observerPtr)
    {
        return -1;
    }
    _observerPtr = &observer;
    return 0;
}

int32_t 
MonitorModule::DeRegisterObserver()
{
    CriticalSectionScoped lock(&_callbackCritSect);
    if (!_observerPtr)
    {
        return 0;
    }
    _observerPtr = NULL;
    return 0;
}

int32_t 
MonitorModule::Version(char* version,
                       uint32_t& remainingBufferInBytes,
                       uint32_t& position) const
{
    return 0;
}
   
int32_t 
MonitorModule::ChangeUniqueId(int32_t id)
{
    return 0;
}

int32_t 
MonitorModule::TimeUntilNextProcess()
{
    uint32_t now = TickTime::MillisecondTimestamp();
    int32_t timeToNext =
        kAverageProcessUpdateTimeMs - (now - _lastProcessTime);
    return (timeToNext); 
}

int32_t 
MonitorModule::Process()
{
    _lastProcessTime = TickTime::MillisecondTimestamp();
    if (_observerPtr)
    {
        CriticalSectionScoped lock(&_callbackCritSect);
        _observerPtr->OnPeriodicProcess();
    }
    return 0;
}

}  // namespace voe

}  // namespace webrtc
