#include <stdio.h>
#include <stdint.h>
#include <errno.h>
+#include "print.h"
#include "sdl.h"
#include "opengl.h"
static int audio_initialized = 0;
static SDL_Window *gl_window = NULL;
static SDL_GLContext gl_context = NULL;
+static void (*keyboard_sdl)(int down, SDL_Keycode sym) = NULL;
+static void (*audio_sdl)(float *data, int len) = NULL;
static void audio_cb(void __attribute__((unused)) *userdata, Uint8 *stream, int len)
{
SDL_MixAudio(stream, (Uint8 *)audio_data, len, SDL_MIX_MAXVOLUME);
}
-int init_sdl(const char *progname, int width, int height, int sound_samplerate, int sound_chunk)
+int init_sdl(const char *progname, int width, int height, int sound_samplerate, int sound_chunk, void (*keyboard)(int down, SDL_Keycode sym), void (*audio)(float *data, int len))
{
int rc;
+ keyboard_sdl = keyboard;
+ audio_sdl = audio;
+
/* init SDL library */
rc = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
if (rc < 0) {
- fprintf(stderr, "Failed to init SDL\n");
+ print_error("Failed to init SDL\n");
goto error;
}
sdl_initialized = 1;
/* open window */
gl_window = SDL_CreateWindow(progname, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (!gl_window) {
- fprintf(stderr, "Failed to open SDL window: %s\n", SDL_GetError());
+ print_error("Failed to open SDL window: %s\n", SDL_GetError());
rc = EIO;
goto error;
}
/* create GL context */
gl_context = SDL_GL_CreateContext(gl_window);
if (!gl_context) {
- fprintf(stderr, "Failed to create SDL's OpenGL context: %s\n", SDL_GetError());
+ print_error("Failed to create SDL's OpenGL context: %s\n", SDL_GetError());
rc = EIO;
goto error;
}
rc = SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
if (rc < 0) {
- fprintf(stderr, "Failed to set SDL's OpenGL context profile\n");
+ print_error("Failed to set SDL's OpenGL context profile\n");
goto error;
}
rc = SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
if (rc < 0) {
- fprintf(stderr, "Failed to set SDL's OpenGL major version\n");
+ print_error("Failed to set SDL's OpenGL major version\n");
goto error;
}
rc = SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
if (rc < 0) {
- fprintf(stderr, "Failed to set SDL's OpenGL minor version\n");
+ print_error("Failed to set SDL's OpenGL minor version\n");
goto error;
}
rc = SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if (rc < 0) {
- fprintf(stderr, "Failed to set SDL's OpenGL doublebuffer\n");
+ print_error("Failed to set SDL's OpenGL doublebuffer\n");
goto error;
}
rc = SDL_GL_SetSwapInterval(1);
if (rc < 0) {
- fprintf(stderr, "Failed to set SDL's OpenGL swap interval to VBLANK\n");
+ print_error("Failed to set SDL's OpenGL swap interval to VBLANK\n");
goto error;
}
#ifndef __APPLE__
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
- fprintf(stderr, "Failed to init GLEW\n");
+ print_error("Failed to init GLEW\n");
goto error;
}
#endif
want.callback = audio_cb;
rc = SDL_OpenAudio(&want, &have);
if (rc < 0) {
- fprintf(stderr, "Failed to open audio\n");
+ print_error("Failed to open audio\n");
+ goto error;
} else if (have.format != want.format) {
- fprintf(stderr, "Failed to open audio with desired audio format\n");
+ print_error("Failed to open audio with desired audio format\n");
SDL_CloseAudio();
+ rc = -EIO;
+ goto error;
+ } else if (have.freq != want.freq) {
+ print_error("Failed to open audio with desired sample rate\n");
+ SDL_CloseAudio();
+ rc = -EIO;
+ goto error;
} else {
SDL_PauseAudio(0);
audio_initialized = 1;