
// BKOscScr.cpp : файл реализации
//

#include "stdafx.h"
#include "BKOscScr.h"

#include "BKOscScrOGL\BKOscScrOGL.h"
#include "BKOscScrD2D\BKOscScrD2D.h"
#include "BKOscScrGDI\BKOscScrGDI.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// диалоговое окно CBKOscScr
IMPLEMENT_DYNAMIC(CBKOscScr, CWnd)



CBKOscScr::CBKOscScr(int nRenderType)
	: m_pSharefFunc(NULL)
	, hmod(NULL)
	, m_hwndScreen(NULL)  // Screen View window handle
	, m_inBuf(NULL)
	, m_inLen(0)
{
	GETBKOSC pGetBKOSC = NULL;

	switch (nRenderType)//Берём номер из конфига. 0 - OGL, 1 - D2D
	{
		default:
		case 0:
		{
#ifdef _WIN64
			hmod = LoadLibrary(_T("BKOscScrOGL_x64.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "GetBKOscScr");
#else
			hmod = LoadLibrary(_T("BKOscScrOGL.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "_GetBKOscScr@0");
#endif

			if (pGetBKOSC)
			{
				m_pSharefFunc = reinterpret_cast<CBKOscScrOGL *>(pGetBKOSC());
			}

			break;
		}

		case 1:
		{
#ifdef _WIN64
			hmod = LoadLibrary(_T("BKOscScrD2D_x64.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "GetBKOscScr");
#else
			hmod = LoadLibrary(_T("BKOscScrD2D.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "_GetBKOscScr@0");
#endif

			if (pGetBKOSC)
			{
				m_pSharefFunc = reinterpret_cast<CBKOscScrD2D *>(pGetBKOSC());
			}

			break;
		}

		case 2:
		{
#ifdef _WIN64
			hmod = LoadLibrary(_T("BKOscScrGDI_x64.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "GetBKOscScr");
#else
			hmod = LoadLibrary(_T("BKOscScrGDI.dll"));
			pGetBKOSC = (GETBKOSC) GetProcAddress(hmod, "_GetBKOscScr@0");
#endif

			if (pGetBKOSC)
			{
				m_pSharefFunc = reinterpret_cast<CBKOscScrGDI *>(pGetBKOSC());
			}

			break;
		}
	}
}

CBKOscScr::~CBKOscScr(void)
{
	if (m_pSharefFunc)
	{
		delete m_pSharefFunc;
		m_pSharefFunc = NULL;
	}

	if (hmod)
	{
		FreeLibrary(hmod);
	}
}

BEGIN_MESSAGE_MAP(CBKOscScr, CWnd)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	ON_WM_SIZE()
END_MESSAGE_MAP()


// обработчики сообщений CScreen

BOOL CBKOscScr::PreCreateWindow(CREATESTRUCT &cs)
{
	cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
	return CWnd::PreCreateWindow(cs);
}

// обработчики сообщений CBKOscScr
// обработчики сообщений CBKOscScrOGL
int CBKOscScr::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
	{
		return -1;
	}

	if (m_pSharefFunc == NULL)
	{
		return -1;
	}

	m_hwndScreen = GetSafeHwnd();

	if ((m_hwndScreen != NULL))
	{
		if (SUCCEEDED(m_pSharefFunc->BKOSC_Screen_Init(m_hwndScreen)))
		{
			return 0;
		}
	}

	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

void CBKOscScr::OnDestroy()
{
	m_pSharefFunc->BKOSC_Screen_Done();
	CWnd::OnDestroy();
}


void CBKOscScr::OnPaint()
{
	if (m_lockBusy.IsLocked())
	{
		return;
	}

	m_lockBusy.Lock();
	CPaintDC dc(this); // device context for painting
	// TODO: добавьте свой код обработчика сообщений
	// Не вызывать CBKOscScr::OnPaint() для сообщений рисования
	m_pSharefFunc->BKOSC_OnDisplay(m_hwndScreen, m_inBuf, m_inLen);
	m_lockBusy.UnLock();
}

void CBKOscScr::OnSize(UINT nType, int cx, int cy)
{
	CWnd::OnSize(nType, cx, cy);
	m_pSharefFunc->BKOSC_OnSize(cx, cy);
}

BOOL CBKOscScr::OnEraseBkgnd(CDC *pDC)
{
	return TRUE;
}


void CBKOscScr::SetBuffer(BYTE *pBuffer, int buffer_len)
{
	m_inBuf = reinterpret_cast<SAMPLE_TYPE *>(pBuffer);
	m_inLen = buffer_len / SAMPLE_LENGTH; //длина буфера в сэмплах
	m_pSharefFunc->BKOSC_OnSetBuffer(buffer_len);
}

