#pragma once

#include "BkSound.h"
#include "Speaker.h"
#include "Covox.h"
#include "emu2149.h"
#include "Tape.h"

class CMediaProc
{
		CBkSound            m_Sound;            //модуль звуковой подсистемы

		CSpeaker            m_Speaker;          //объект пищалка
		CCovox              m_Covox;            //объект ковокс
		CEMU2149            m_AY8910;           //объект сопроцессор Ay8910-3
		CTape               m_Tape;             //объект обработчика кассет

		double              fCpuTickTime;
		double              fMediaTicks;        //счётчик медиа тактов, происходящих за одну инструкцию
		double              fMedia_Mod;

	public:
		struct ThrMTVars_t
		{
			//переменные для медиатактов
			int     nMediaTicksPerFrame; //количество медиатактов во фрейме.
			int     nMediaTickCount;    // счётчик медиа тактов (их должно быть не более g_Config.m_nSoundSampleRate/CPU_FRAMES_PER_SECOND в текущем фрейме)
			int     nBufPos;            // позиция в звуковом буфере
			SAMPLE_INT *pSoundBuffer;   // звуковой буфер

			void init()
			{
				nMediaTicksPerFrame = 0;
				nMediaTickCount = 0;
				nBufPos = 0;
				pSoundBuffer = nullptr;
			}
		};
	protected:
		ThrMTVars_t         m_sMTV;

		void                MediaTick();

	public:
		CMediaProc();
		virtual ~CMediaProc();
		void                init();
		void                clear();
		void                uninit();

		//выдача указателей на объекты всем желающим
		inline CBkSound     *GetBKSoundPtr()
		{
			return &m_Sound;
		}
		inline CSpeaker     *GetSpeakerPtr()
		{
			return &m_Speaker;
		}
		inline CCovox       *GetCovoxPtr()
		{
			return &m_Covox;
		}
		inline CEMU2149     *GetAY8910Ptr()
		{
			return &m_AY8910;
		}
		inline CTape        *GetTapePtr()
		{
			return &m_Tape;
		}
		inline void         SetCPUTickTime(double f)
		{
			fCpuTickTime = f;
		}
		inline void         SetMod(double f)
		{
			fMedia_Mod = f;
		}
		inline void         SetTicks(double f)
		{
			fMediaTicks = f;
		}
		inline double       GetTicks()
		{
			return fMediaTicks;
		}
		void                InitEmulator();
		int                 InitObjects();
		void                StartPlayTape(const CString &strPath);
		void                clock();
};

