#include "stdafx.h"
#include "refCSoundTimer.h"

namespace FDK
{
	Int64 CSoundTimer::nシステム時刻ms::get()
	{
		this->Disposed->tDispose済みまたは実行中なら例外発生( "CSoundTimer" );

		if( this->rDevice->e出力デバイス == ESoundDeviceType::ExclusiveWASAPI || 
			this->rDevice->e出力デバイス == ESoundDeviceType::SharedWASAPI ||
			this->rDevice->e出力デバイス == ESoundDeviceType::ASIO )
		{
			// BASS 系の ISoundDevice.n経過時間ms はオーディオバッファの更新間隔ずつでしか更新されないため、単にこれを返すだけではとびとびの値になる。
			// そこで、更新間隔の最中に呼ばれた場合は、システムタイマを使って補間する。
			// この場合の経過時間との誤差は更新間隔以内に収まるので問題ないと判断する。

			return this->rDevice->n経過時間ms
				+ ( this->rDevice->tmシステムタイマ->nシステム時刻ms - this->rDevice->n経過時間を更新したシステム時刻ms );
		}

		throw gcnew InvalidOperationException( "サポートされていない出力デバイスです。" );
	}

	CSoundTimer::CSoundTimer( ISoundDevice^ device ) : CTimerBase()
	{
		this->Disposed = gcnew CDisposed();
		this->rDevice = device;
	}
	CSoundTimer::~CSoundTimer()
	{
		if( this->Disposed->bDispose済みまたは処理中である )
			return;		// 例外は発出しない。

		if( !this->Disposed->t開始を宣言する() )
			return;		// 例外は発出しない。


		// 特になし；ISoundDevice^ の解放は呼び出し元で行うこと。
		
		//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
	}
}