chore: move some init code to functions
This commit is contained in:
parent
eecd78a008
commit
d144973acf
93
src/main.zig
93
src/main.zig
|
@ -67,25 +67,12 @@ pub fn main() anyerror!void {
|
||||||
log.info("Save Path: {s}", .{save_path});
|
log.info("Save Path: {s}", .{save_path});
|
||||||
|
|
||||||
// Initialize SDL
|
// Initialize SDL
|
||||||
const status = SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_EVENTS | SDL.SDL_INIT_AUDIO | SDL.SDL_INIT_GAMECONTROLLER);
|
_ = initSdl2();
|
||||||
defer SDL.SDL_Quit();
|
defer SDL.SDL_Quit();
|
||||||
if (status < 0) sdlPanic();
|
|
||||||
|
|
||||||
// Initialize SDL Audio
|
// Initialize SDL Audio
|
||||||
var have: SDL.SDL_AudioSpec = undefined;
|
const audio_dev = initAudio();
|
||||||
var want = std.mem.zeroes(SDL.SDL_AudioSpec);
|
|
||||||
want.freq = 32768;
|
|
||||||
want.format = SDL.AUDIO_S8;
|
|
||||||
want.channels = 2;
|
|
||||||
want.samples = 0x200;
|
|
||||||
want.callback = null;
|
|
||||||
|
|
||||||
const audio_dev = SDL.SDL_OpenAudioDevice(null, 0, &want, &have, 0);
|
|
||||||
defer SDL.SDL_CloseAudioDevice(audio_dev);
|
defer SDL.SDL_CloseAudioDevice(audio_dev);
|
||||||
if (audio_dev == 0) sdlPanic();
|
|
||||||
|
|
||||||
// Start Playback on the Audio evice
|
|
||||||
SDL.SDL_PauseAudioDevice(audio_dev, 0);
|
|
||||||
|
|
||||||
// Initialize Emulator
|
// Initialize Emulator
|
||||||
var scheduler = Scheduler.init(alloc);
|
var scheduler = Scheduler.init(alloc);
|
||||||
|
@ -113,25 +100,16 @@ pub fn main() anyerror!void {
|
||||||
const emu_thread = try Thread.spawn(.{}, emu.run, .{ .LimitedFPS, &quit, &emu_rate, &scheduler, &cpu });
|
const emu_thread = try Thread.spawn(.{}, emu.run, .{ .LimitedFPS, &quit, &emu_rate, &scheduler, &cpu });
|
||||||
defer emu_thread.join();
|
defer emu_thread.join();
|
||||||
|
|
||||||
const title = correctTitle(cpu.bus.pak.title);
|
|
||||||
|
|
||||||
var title_buf: [0x20]u8 = std.mem.zeroes([0x20]u8);
|
var title_buf: [0x20]u8 = std.mem.zeroes([0x20]u8);
|
||||||
const window_title = try std.fmt.bufPrint(&title_buf, "ZBA | {s}", .{title});
|
const window_title = try std.fmt.bufPrint(&title_buf, "ZBA | {s}", .{correctTitle(cpu.bus.pak.title)});
|
||||||
|
|
||||||
var window = SDL.SDL_CreateWindow(
|
const window = createWindow(window_title, gba_width, gba_height);
|
||||||
window_title.ptr,
|
|
||||||
SDL.SDL_WINDOWPOS_CENTERED,
|
|
||||||
SDL.SDL_WINDOWPOS_CENTERED,
|
|
||||||
gba_width * window_scale,
|
|
||||||
gba_height * window_scale,
|
|
||||||
SDL.SDL_WINDOW_SHOWN,
|
|
||||||
) orelse sdlPanic();
|
|
||||||
defer SDL.SDL_DestroyWindow(window);
|
defer SDL.SDL_DestroyWindow(window);
|
||||||
|
|
||||||
const renderer = SDL.SDL_CreateRenderer(window, -1, SDL.SDL_RENDERER_ACCELERATED | SDL.SDL_RENDERER_PRESENTVSYNC) orelse sdlPanic();
|
const renderer = createRenderer(window);
|
||||||
defer SDL.SDL_DestroyRenderer(renderer);
|
defer SDL.SDL_DestroyRenderer(renderer);
|
||||||
|
|
||||||
const texture = SDL.SDL_CreateTexture(renderer, SDL.SDL_PIXELFORMAT_RGBA8888, SDL.SDL_TEXTUREACCESS_STREAMING, 240, 160) orelse sdlPanic();
|
const texture = createTexture(renderer, gba_width, gba_height);
|
||||||
defer SDL.SDL_DestroyTexture(texture);
|
defer SDL.SDL_DestroyTexture(texture);
|
||||||
|
|
||||||
// Init FPS Timer
|
// Init FPS Timer
|
||||||
|
@ -198,16 +176,16 @@ pub fn main() anyerror!void {
|
||||||
quit.store(true, .Unordered); // Terminate Emulator Thread
|
quit.store(true, .Unordered); // Terminate Emulator Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sdlPanic() noreturn {
|
|
||||||
const str = @as(?[*:0]const u8, SDL.SDL_GetError()) orelse "unknown error";
|
|
||||||
@panic(std.mem.sliceTo(str, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
const CliError = error{
|
const CliError = error{
|
||||||
InsufficientOptions,
|
InsufficientOptions,
|
||||||
UnneededOptions,
|
UnneededOptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn sdlPanic() noreturn {
|
||||||
|
const str = @as(?[*:0]const u8, SDL.SDL_GetError()) orelse "unknown error";
|
||||||
|
@panic(std.mem.sliceTo(str, 0));
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: Superfluous allocations?
|
// FIXME: Superfluous allocations?
|
||||||
fn setupSavePath(alloc: std.mem.Allocator) !?[]const u8 {
|
fn setupSavePath(alloc: std.mem.Allocator) !?[]const u8 {
|
||||||
const save_subpath = try std.fs.path.join(alloc, &[_][]const u8{ "zba", "save" });
|
const save_subpath = try std.fs.path.join(alloc, &[_][]const u8{ "zba", "save" });
|
||||||
|
@ -227,3 +205,52 @@ fn setupSavePath(alloc: std.mem.Allocator) !?[]const u8 {
|
||||||
|
|
||||||
return save_path;
|
return save_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn initSdl2() c_int {
|
||||||
|
const status = SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_EVENTS | SDL.SDL_INIT_AUDIO | SDL.SDL_INIT_GAMECONTROLLER);
|
||||||
|
if (status < 0) sdlPanic();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn createWindow(title: []u8, width: c_int, height: c_int) *SDL.SDL_Window {
|
||||||
|
return SDL.SDL_CreateWindow(
|
||||||
|
title.ptr,
|
||||||
|
SDL.SDL_WINDOWPOS_CENTERED,
|
||||||
|
SDL.SDL_WINDOWPOS_CENTERED,
|
||||||
|
width * window_scale,
|
||||||
|
height * window_scale,
|
||||||
|
SDL.SDL_WINDOW_SHOWN,
|
||||||
|
) orelse sdlPanic();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn createRenderer(window: *SDL.SDL_Window) *SDL.SDL_Renderer {
|
||||||
|
return SDL.SDL_CreateRenderer(window, -1, SDL.SDL_RENDERER_ACCELERATED | SDL.SDL_RENDERER_PRESENTVSYNC) orelse sdlPanic();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn createTexture(renderer: *SDL.SDL_Renderer, width: c_int, height: c_int) *SDL.SDL_Texture {
|
||||||
|
return SDL.SDL_CreateTexture(
|
||||||
|
renderer,
|
||||||
|
SDL.SDL_PIXELFORMAT_RGBA8888,
|
||||||
|
SDL.SDL_TEXTUREACCESS_STREAMING,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
) orelse sdlPanic();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn initAudio() SDL.SDL_AudioDeviceID {
|
||||||
|
var have: SDL.SDL_AudioSpec = undefined;
|
||||||
|
var want = std.mem.zeroes(SDL.SDL_AudioSpec);
|
||||||
|
want.freq = 32768;
|
||||||
|
want.format = SDL.AUDIO_S8;
|
||||||
|
want.channels = 2;
|
||||||
|
want.samples = 0x200;
|
||||||
|
want.callback = null;
|
||||||
|
|
||||||
|
const dev = SDL.SDL_OpenAudioDevice(null, 0, &want, &have, 0);
|
||||||
|
if (dev == 0) sdlPanic();
|
||||||
|
|
||||||
|
// Start Playback on the Audio evice
|
||||||
|
SDL.SDL_PauseAudioDevice(dev, 0);
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue