#pragma once #include "pch.h" #include #include "Shared/SettingTypes.h" #include "Shared/RenderedFrame.h" #include "Shared/Interfaces/IRenderingDevice.h" #include "Utilities/AutoResetEvent.h" #include "Utilities/SimpleLock.h" #include "Utilities/safe_ptr.h" class IRenderingDevice; class Emulator; class SystemHud; class DebugHud; class InputHud; class IVideoRecorder; enum class VideoCodec; struct RecordAviOptions { VideoCodec Codec; uint32_t CompressionLevel; bool RecordSystemHud; bool RecordInputHud; }; class VideoRenderer { private: Emulator* _emu; AutoResetEvent _waitForRender; unique_ptr _renderThread; IRenderingDevice* _renderer = nullptr; atomic _stopFlag; SimpleLock _stopStartLock; uint32_t _rendererWidth = 512; uint32_t _rendererHeight = 480; unique_ptr _rendererHud; unique_ptr _systemHud; unique_ptr _inputHud; SimpleLock _hudLock; RenderSurfaceInfo _aviRecorderSurface = {}; RecordAviOptions _recorderOptions = {}; RenderSurfaceInfo _emuHudSurface = {}; RenderSurfaceInfo _scriptHudSurface = {}; bool _needScriptHudClear = false; uint32_t _scriptHudScale = 2; uint32_t _lastScriptHudFrameNumber = 0; bool _needRedraw = true; RenderedFrame _lastFrame; SimpleLock _frameLock; safe_ptr _recorder; void RenderThread(); bool DrawScriptHud(RenderedFrame& frame); FrameInfo GetEmuHudSize(FrameInfo baseFrameSize); void ProcessAviRecording(RenderedFrame& frame); public: VideoRenderer(Emulator* emu); ~VideoRenderer(); FrameInfo GetRendererSize(); void SetRendererSize(uint32_t width, uint32_t height); void SetScriptHudScale(uint32_t scale) { _scriptHudScale = scale; } std::pair GetScriptHudSize(); void StartThread(); void StopThread(); void UpdateFrame(RenderedFrame& frame); void ClearFrame(); void RegisterRenderingDevice(IRenderingDevice *renderer); void UnregisterRenderingDevice(IRenderingDevice *renderer); void StartRecording(string filename, RecordAviOptions options); void AddRecordingSound(int16_t* soundBuffer, uint32_t sampleCount, uint32_t sampleRate); void StopRecording(); bool IsRecording(); };