yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
emulator.h
Go to the documentation of this file.
1#ifndef YAZE_APP_CORE_EMULATOR_H
2#define YAZE_APP_CORE_EMULATOR_H
3
4#include <array>
5#include <cstdint>
6#include <functional>
7#include <vector>
8
13#include "app/emu/snes.h"
14#include "rom/rom.h"
15
16namespace yaze {
17namespace gfx {
18class IRenderer;
19} // namespace gfx
20
21namespace editor {
22class PanelManager;
23} // namespace editor
24
29namespace emu {
30
31// REMOVED: EmulatorKeybindings (ImGuiKey-based)
32// Now using ui::InputHandler with SDL_GetKeyboardState() for proper continuous
33// polling
34
39class Emulator {
40 public:
41 Emulator() = default;
42 ~Emulator();
44 const std::vector<uint8_t>& rom_data);
45 void Run(Rom* rom);
46 void Cleanup();
47
48 // Panel visibility managed by PanelManager (dependency injection)
50 panel_manager_ = manager;
51 }
52 void SetInputConfig(const input::InputConfig& config);
54 std::function<void(const input::InputConfig&)> callback) {
55 input_config_changed_callback_ = std::move(callback);
56 }
57
58 auto snes() -> Snes& { return snes_; }
59 auto running() const -> bool { return running_; }
61
62 // Headless mode for background audio (music editor)
63 // Initializes SNES and audio without requiring visible emulator window
64 bool EnsureInitialized(Rom* rom);
65 // Runs emulator frame without UI rendering (for background audio)
66 void RunFrameOnly();
67 // Runs audio-focused frame: CPU+APU cycles without PPU rendering
68 // Used by MusicEditor for authentic, low-overhead audio playback
69 void RunAudioFrame();
70 // Reset frame timing (call before starting playback to prevent time buildup)
71 void ResetFrameTiming();
72
73 // Audio backend access
77 void ResumeAudio(); // For WASM/WebAudio context resumption
78
79 // Set an external audio backend (for sharing between emulator instances)
80 // When set, this backend is used instead of the internal one
84 void set_audio_buffer(int16_t* audio_buffer) { audio_buffer_ = audio_buffer; }
85 auto set_audio_device_id(SDL_AudioDeviceID audio_device) {
86 audio_device_ = audio_device;
87 }
88 void set_use_sdl_audio_stream(bool enabled);
90 // Mark audio stream as already configured (prevents RunAudioFrame from overriding)
95 auto wanted_samples() const -> int { return wanted_samples_; }
96 auto wanted_frames() const -> float { return wanted_frames_; }
98
99 // Render access
101 void* ppu_texture() { return ppu_texture_; }
102
103 // Turbo mode
104 bool is_turbo_mode() const { return turbo_mode_; }
105 void set_turbo_mode(bool turbo) { turbo_mode_ = turbo; }
106
107 // Audio focus mode - use RunAudioFrame() for lower overhead audio playback
108 bool is_audio_focus_mode() const { return audio_focus_mode_; }
109 void set_audio_focus_mode(bool focus) { audio_focus_mode_ = focus; }
110
111 // Audio settings
112 void set_interpolation_type(int type);
113 int get_interpolation_type() const;
114
115 // Debugger access
119 bool is_debugging() const { return debugging_; }
120 void set_debugging(bool debugging) { debugging_ = debugging; }
121 bool is_initialized() const { return initialized_; }
122 bool is_snes_initialized() const { return snes_initialized_; }
123
124 // AI Agent Integration API
125 bool IsEmulatorReady() const { return snes_.running() && !rom_data_.empty(); }
126 double GetCurrentFPS() const { return current_fps_; }
127 uint64_t GetCurrentCycle() { return snes_.mutable_cycles(); }
128 uint16_t GetCPUPC() { return snes_.cpu().PC; }
129 uint8_t GetCPUB() { return snes_.cpu().DB; }
130 void StepSingleInstruction() { snes_.cpu().RunOpcode(); }
131 void SetBreakpoint(uint32_t address) { snes_.cpu().SetBreakpoint(address); }
132 void ClearAllBreakpoints() { snes_.cpu().ClearBreakpoints(); }
133 std::vector<uint32_t> GetBreakpoints() {
134 return snes_.cpu().GetBreakpoints();
135 }
136
137 // Performance monitoring for AI agents
139 double fps;
140 uint64_t cycles;
143 uint16_t cpu_pc;
144 uint8_t cpu_pb;
145 };
147 return {.fps = current_fps_,
148 .cycles = snes_.mutable_cycles(),
149 .audio_frames_queued =
150 audio_backend_ ? audio_backend_->GetStatus().queued_frames : 0,
151 .is_running = running_,
152 .cpu_pc = snes_.cpu().PC,
153 .cpu_pb = snes_.cpu().PB};
154 }
155
156 // Performance history (for ImPlot)
157 std::vector<float> FrameTimeHistory() const;
158 std::vector<float> FpsHistory() const;
159 std::vector<float> AudioQueueHistory() const;
160 std::vector<float> DmaBytesHistory() const;
161 std::vector<float> VramBytesHistory() const;
162 std::vector<float> AudioRmsLeftHistory() const;
163 std::vector<float> AudioRmsRightHistory() const;
164 std::vector<float> RomBankFreeBytes() const;
165
166 private:
167 void RenderNavBar();
169
170 void RenderSnesPpu();
172 void RenderMemoryViewer();
175 void RenderAIAgentPanel();
176 void RenderSaveStates();
178 void RenderApuDebugger();
179 void RenderAudioMixer();
180
181 struct Bookmark {
182 std::string name;
183 uint64_t value;
184 };
185 std::vector<Bookmark> bookmarks;
186
188 const std::vector<InstructionEntry>& instructionLog);
189
190 bool step_ = true;
191 bool power_ = false;
192 bool loading_ = false;
193 bool running_ = false;
194 bool turbo_mode_ = false;
195 bool audio_focus_mode_ = false; // Skip PPU rendering for audio playback
196
199
200 uint8_t manual_pb_ = 0;
201 uint16_t manual_pc_ = 0;
202
203 // timing
205 uint64_t last_count;
206 double time_adder = 0.0;
207
208 // FPS tracking
210 double fps_timer_ = 0.0;
211 double current_fps_ = 0.0;
212
213 // Recent history for plotting (public for helper functions)
214 public:
215 static constexpr int kMetricHistorySize = 240;
216 private:
217 std::array<float, kMetricHistorySize> frame_time_history_{};
218 std::array<float, kMetricHistorySize> fps_history_{};
219 std::array<float, kMetricHistorySize> audio_queue_history_{};
220 std::array<float, kMetricHistorySize> dma_bytes_history_{};
221 std::array<float, kMetricHistorySize> vram_bytes_history_{};
222 std::array<float, kMetricHistorySize> audio_rms_left_history_{};
223 std::array<float, kMetricHistorySize> audio_rms_right_history_{};
226 void PushFrameMetrics(float frame_ms, uint32_t audio_frames,
227 uint64_t dma_bytes, uint64_t vram_bytes,
228 float audio_rms_left, float audio_rms_right);
229
231 SDL_AudioDeviceID audio_device_;
232
233 // Audio backend abstraction
234 std::unique_ptr<audio::IAudioBackend> audio_backend_;
235 audio::IAudioBackend* external_audio_backend_ = nullptr; // Shared backend (not owned)
236
238 bool initialized_ = false;
239 bool snes_initialized_ = false;
240 bool debugging_ = false;
242 void* ppu_texture_ = nullptr;
243 bool use_sdl_audio_stream_ = true; // Enable resampling by default (32kHz -> 48kHz)
244 bool audio_stream_config_dirty_ = true; // Start dirty to ensure setup on first use
247
248 // Panel visibility managed by EditorPanelManager - no member variables needed!
249
250 // Debugger infrastructure
253
254 std::vector<uint8_t> rom_data_;
255
256 // Input handling (abstracted for SDL2/SDL3/custom backends)
260
261 // Panel manager for card visibility (injected)
263};
264
265} // namespace emu
266} // namespace yaze
267
268#endif // YAZE_APP_CORE_EMULATOR_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
Central registry for all editor cards with session awareness and dependency injection.
Manages CPU and SPC700 breakpoints for debugging.
A class for emulating and debugging SNES games.
Definition emulator.h:39
std::array< float, kMetricHistorySize > audio_queue_history_
Definition emulator.h:219
gfx::IRenderer * renderer()
Definition emulator.h:100
void Initialize(gfx::IRenderer *renderer, const std::vector< uint8_t > &rom_data)
Definition emulator.cc:108
BreakpointManager & breakpoint_manager()
Definition emulator.h:116
void RenderModernCpuDebugger()
Definition emulator.cc:1002
std::unique_ptr< audio::IAudioBackend > audio_backend_
Definition emulator.h:234
auto wanted_samples() const -> int
Definition emulator.h:95
bool is_debugging() const
Definition emulator.h:119
std::vector< float > FrameTimeHistory() const
Definition emulator.cc:782
void set_turbo_mode(bool turbo)
Definition emulator.h:105
bool is_initialized() const
Definition emulator.h:121
void set_input_config_changed_callback(std::function< void(const input::InputConfig &)> callback)
Definition emulator.h:53
void SetInputConfig(const input::InputConfig &config)
Definition emulator.cc:74
std::array< float, kMetricHistorySize > vram_bytes_history_
Definition emulator.h:221
void * ppu_texture()
Definition emulator.h:101
bool IsEmulatorReady() const
Definition emulator.h:125
bool audio_stream_env_checked_
Definition emulator.h:246
static constexpr int kMetricHistorySize
Definition emulator.h:215
void set_use_sdl_audio_stream(bool enabled)
Definition emulator.cc:79
auto wanted_frames() const -> float
Definition emulator.h:96
double GetCurrentFPS() const
Definition emulator.h:126
std::vector< float > RomBankFreeBytes() const
Definition emulator.cc:817
void set_debugging(bool debugging)
Definition emulator.h:120
std::array< float, kMetricHistorySize > audio_rms_left_history_
Definition emulator.h:222
void set_audio_buffer(int16_t *audio_buffer)
Definition emulator.h:84
std::vector< float > AudioRmsRightHistory() const
Definition emulator.cc:812
bool is_audio_focus_mode() const
Definition emulator.h:108
void RenderMemoryViewer()
Definition emulator.cc:997
audio::IAudioBackend * external_audio_backend_
Definition emulator.h:235
void SetBreakpoint(uint32_t address)
Definition emulator.h:131
bool audio_stream_config_dirty_
Definition emulator.h:244
void set_renderer(gfx::IRenderer *renderer)
Definition emulator.h:97
std::array< float, kMetricHistorySize > frame_time_history_
Definition emulator.h:217
uint64_t GetCurrentCycle()
Definition emulator.h:127
uint64_t count_frequency
Definition emulator.h:204
void set_interpolation_type(int type)
Definition emulator.cc:96
std::vector< float > VramBytesHistory() const
Definition emulator.cc:802
std::array< float, kMetricHistorySize > fps_history_
Definition emulator.h:218
std::vector< float > AudioQueueHistory() const
Definition emulator.cc:792
void RenderKeyboardConfig()
Definition emulator.cc:1257
std::vector< float > DmaBytesHistory() const
Definition emulator.cc:797
void SetExternalAudioBackend(audio::IAudioBackend *backend)
Definition emulator.h:81
debug::DisassemblyViewer disassembly_viewer_
Definition emulator.h:252
std::function< void(const input::InputConfig &) input_config_changed_callback_)
Definition emulator.h:259
bool use_sdl_audio_stream() const
Definition emulator.h:89
void PushFrameMetrics(float frame_ms, uint32_t audio_frames, uint64_t dma_bytes, uint64_t vram_bytes, float audio_rms_left, float audio_rms_right)
Definition emulator.cc:747
void StepSingleInstruction()
Definition emulator.h:130
std::vector< uint8_t > rom_data_
Definition emulator.h:254
auto set_audio_device_id(SDL_AudioDeviceID audio_device)
Definition emulator.h:85
input::InputManager & input_manager()
Definition emulator.h:118
void RenderPerformanceMonitor()
Definition emulator.cc:1231
bool EnsureInitialized(Rom *rom)
Definition emulator.cc:173
bool is_turbo_mode() const
Definition emulator.h:104
debug::DisassemblyViewer & disassembly_viewer()
Definition emulator.h:117
input::InputConfig input_config_
Definition emulator.h:258
void RenderBreakpointList()
Definition emulator.cc:992
BreakpointManager breakpoint_manager_
Definition emulator.h:251
editor::PanelManager * panel_manager_
Definition emulator.h:262
uint64_t last_count
Definition emulator.h:205
std::vector< float > FpsHistory() const
Definition emulator.cc:787
void set_audio_focus_mode(bool focus)
Definition emulator.h:109
std::vector< Bookmark > bookmarks
Definition emulator.h:185
input::InputManager input_manager_
Definition emulator.h:257
std::array< float, kMetricHistorySize > audio_rms_right_history_
Definition emulator.h:223
void set_running(bool running)
Definition emulator.h:60
uint16_t GetCPUPC()
Definition emulator.h:128
SDL_AudioDeviceID audio_device_
Definition emulator.h:231
bool is_snes_initialized() const
Definition emulator.h:122
uint16_t manual_pc_
Definition emulator.h:201
void RenderCpuInstructionLog(const std::vector< InstructionEntry > &instructionLog)
Definition emulator.cc:1241
std::vector< float > AudioRmsLeftHistory() const
Definition emulator.cc:807
void ClearAllBreakpoints()
Definition emulator.h:132
void Run(Rom *rom)
Definition emulator.cc:406
audio::IAudioBackend * audio_backend()
Definition emulator.h:74
std::array< float, kMetricHistorySize > dma_bytes_history_
Definition emulator.h:220
auto snes() -> Snes &
Definition emulator.h:58
auto running() const -> bool
Definition emulator.h:59
uint8_t GetCPUB()
Definition emulator.h:129
void mark_audio_stream_configured()
Definition emulator.h:91
void RenderEmulatorInterface()
Definition emulator.cc:838
EmulatorMetrics GetMetrics()
Definition emulator.h:146
int16_t * audio_buffer_
Definition emulator.h:230
gfx::IRenderer * renderer_
Definition emulator.h:241
void set_panel_manager(editor::PanelManager *manager)
Definition emulator.h:49
int get_interpolation_type() const
Definition emulator.cc:103
std::vector< uint32_t > GetBreakpoints()
Definition emulator.h:133
auto mutable_cycles() -> uint64_t &
Definition snes.h:90
bool running() const
Definition snes.h:81
auto cpu() -> Cpu &
Definition snes.h:84
Abstract audio backend interface.
Advanced disassembly viewer with sparse storage and interactive features.
Defines an abstract interface for all rendering operations.
Definition irenderer.h:40
Input configuration (platform-agnostic key codes)