annotate src/system_sdl.c @ 50:8e39a877c651

Switch from RGB 444 to RGB 565 for palette entries
author Michael Pavone <pavone@retrodev.com>
date Wed, 31 Aug 2016 20:29:45 -0700
parents 3b7910575a00
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <SDL.h>
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdint.h>
16
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
3 #include <stdlib.h>
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
4 #include "controller.h"
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
7 static SDL_Window *window;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
8 static SDL_Renderer *renderer;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
9 static SDL_Texture *texture;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
10 static int sample_rate;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
11 static int buffer_size;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
12 static uint8_t quitting;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
13
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
14 static SDL_mutex * audio_mutex;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
15 static SDL_cond * source_ready;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
16 static SDL_cond * output_ready;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
17 static int16_t *source_buffer;
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
19 static void audio_callback(void * userdata, uint8_t *stream, int len)
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
20 {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
21 uint8_t local_quit;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
22 int16_t *local_source;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
23 SDL_LockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
24 local_source = NULL;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
25 do {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
26 if (!local_source) {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
27 local_source = source_buffer;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
28 source_buffer = NULL;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
29 SDL_CondSignal(output_ready);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
30 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
31 if (!quitting && !local_source) {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
32 SDL_CondWait(source_ready, audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
33 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
34 } while (!quitting && !local_source);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
35 local_quit = quitting;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
36 SDL_UnlockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
37 if (!local_quit) {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
38 fflush(stdout);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
39 memcpy(stream, local_source, len);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
40 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
41 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
42
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
43 static void close_audio()
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 {
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
45 SDL_LockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
46 quitting = 1;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
47 SDL_CondSignal(source_ready);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
48 SDL_UnlockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
49 SDL_CloseAudio();
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
50 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
51
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
52 void system_present_audio(int16_t *buffer)
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
53 {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
54 SDL_LockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
55 while (source_buffer) {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
56 SDL_CondWait(output_ready, audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
57 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
58 source_buffer = buffer;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
59 SDL_CondSignal(source_ready);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
60 SDL_UnlockMutex(audio_mutex);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
61 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
62
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
63 int system_sample_rate()
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
64 {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
65 return sample_rate;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
66 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
67
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
68 int system_buffer_size()
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
69 {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
70 return buffer_size;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
71 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
72
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
73 static int num_controllers;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
74 static SDL_GameController **game_controllers;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
75
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
76 int system_init(int width, int height, int desired_sample_rate)
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
77 {
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
78 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER) < 0) {
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError());
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 return 0;
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 atexit(SDL_Quit);
17
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
83 window = SDL_CreateWindow("simple16", 0, 0, width, height, 0);
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
84 if (!window) {
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
85 fprintf(stderr, "Failed to create window: %s\n", SDL_GetError());
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 return 0;
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 }
17
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
88
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
89 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
90 if (!renderer) {
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
91 fprintf(stderr, "Failed to create renderer: %s\n", SDL_GetError());
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
92 goto renderer_error;
17
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
93 }
41ec033ef8c3 Enable vsync
Michael Pavone <pavone@retrodev.com>
parents: 16
diff changeset
94
50
8e39a877c651 Switch from RGB 444 to RGB 565 for palette entries
Michael Pavone <pavone@retrodev.com>
parents: 38
diff changeset
95 texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, 320, 240);
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 if (!texture) {
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError());
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
98 goto error;
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 }
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
100
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
101 audio_mutex = SDL_CreateMutex();
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
102 source_ready = SDL_CreateCond();
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
103 output_ready = SDL_CreateCond();
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
104
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
105 SDL_AudioSpec desired, actual;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
106 desired.freq = desired_sample_rate;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
107 desired.format = AUDIO_S16SYS;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
108 desired.channels = 1;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
109 desired.callback = audio_callback;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
110 desired.userdata = NULL;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
111 desired.samples = 512;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
112
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
113 if (SDL_OpenAudio(&desired, &actual) < 0) {
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
114 fprintf(stderr, "Failed to open audio: %s\n", SDL_GetError());
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
115 goto error;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
116 }
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
117 printf("Initialized audio at frequency %d with a %d sample buffer and %d channels\n", actual.freq, actual.samples, actual.channels);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
118 sample_rate = actual.freq;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
119 buffer_size = actual.samples;
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
120 atexit(close_audio);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
121 SDL_PauseAudio(0);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
122
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
123 num_controllers = SDL_NumJoysticks();
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
124 game_controllers = calloc(num_controllers, sizeof(*game_controllers));
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
125
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
126 for (int i = 0; i < num_controllers; i++)
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
127 {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
128 if (!SDL_IsGameController(i)) {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
129 printf("Joystick %d: %s is not recognized as a controller by SDL2\n", i, SDL_JoystickNameForIndex(i));
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
130 continue;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
131 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
132 game_controllers[i] = SDL_GameControllerOpen(i);
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
133 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
134
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 return 1;
24
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
136
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
137 error:
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
138 SDL_DestroyRenderer(renderer);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
139 renderer_error:
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
140 SDL_DestroyWindow(window);
4c9dbfa30a66 Implemented audio
Michael Pavone <pavone@retrodev.com>
parents: 17
diff changeset
141 return 0;
15
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 }
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 uint16_t *system_get_framebuffer(int *pitch)
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 {
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 void *pixels;
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 if (SDL_LockTexture(texture, NULL, &pixels, pitch) < 0) {
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 fprintf(stderr, "Failed to lock texture: %s\n", SDL_GetError());
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 return NULL;
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 }
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 return pixels;
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 }
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 void system_framebuffer_updated()
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 {
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 SDL_UnlockTexture(texture);
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 SDL_RenderCopy(renderer, texture, NULL, NULL);
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 SDL_RenderPresent(renderer);
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 }
c8a0dbd7752c Forgot to commit SDL code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
161 //SDL2 provides this, but only in 2.0.4+
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
162 SDL_GameController *controller_by_id(SDL_JoystickID which)
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
163 {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
164 for (int i = 0; i < num_controllers; i++)
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
165 {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
166 if (!game_controllers[i]) {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
167 continue;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
168 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
169 if (SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(game_controllers[i])) == which) {
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
170 return game_controllers[i];
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
171 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
172 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
173 return NULL;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
174 }
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
175
38
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
176 static const uint16_t mapping[SDL_CONTROLLER_BUTTON_MAX] = {
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
177 [SDL_CONTROLLER_BUTTON_LEFTSHOULDER] = 0x001,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
178 [SDL_CONTROLLER_BUTTON_Y] = 0x002,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
179 [SDL_CONTROLLER_BUTTON_X] = 0x004,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
180 [SDL_CONTROLLER_BUTTON_RIGHTSHOULDER] = 0x008,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
181 [SDL_CONTROLLER_BUTTON_B] = 0x010,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
182 [SDL_CONTROLLER_BUTTON_A] = 0x020,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
183 [SDL_CONTROLLER_BUTTON_BACK] = 0x040,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
184 [SDL_CONTROLLER_BUTTON_START] = 0x080,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
185 [SDL_CONTROLLER_BUTTON_DPAD_RIGHT] = 0x100,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
186 [SDL_CONTROLLER_BUTTON_DPAD_LEFT] = 0x200,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
187 [SDL_CONTROLLER_BUTTON_DPAD_DOWN] = 0x400,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
188 [SDL_CONTROLLER_BUTTON_DPAD_UP] = 0x800,
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
189 };
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
190
38
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
191 static uint16_t keycode_to_bit(SDL_Keycode keycode)
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
192 {
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
193 switch(keycode)
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
194 {
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
195 case SDLK_a:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
196 return 0x020;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
197 case SDLK_s:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
198 return 0x010;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
199 case SDLK_d:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
200 return 0x008;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
201 case SDLK_q:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
202 return 0x004;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
203 case SDLK_w:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
204 return 0x002;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
205 case SDLK_e:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
206 return 0x001;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
207 case SDLK_f:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
208 return 0x040;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
209 case SDLK_RETURN:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
210 return 0x080;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
211 case SDLK_UP:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
212 return 0x800;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
213 case SDLK_DOWN:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
214 return 0x400;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
215 case SDLK_LEFT:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
216 return 0x200;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
217 case SDLK_RIGHT:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
218 return 0x100;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
219 }
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
220 return 0;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
221 }
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
222
16
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
223 void system_poll_events()
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
224 {
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
225 SDL_Event event;
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
226 while(SDL_PollEvent(&event))
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
227 {
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
228 switch (event.type)
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
229 {
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
230 case SDL_QUIT:
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
231 exit(0);
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
232 break;
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
233 case SDL_CONTROLLERBUTTONDOWN:
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
234 controller_pressed(event.cbutton.which, mapping[event.cbutton.button]);
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
235 break;
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
236 case SDL_CONTROLLERBUTTONUP:
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
237 controller_released(event.cbutton.which, mapping[event.cbutton.button]);
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
238 break;
38
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
239 case SDL_KEYDOWN:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
240 controller_pressed(0, keycode_to_bit(event.key.keysym.sym));
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
241 break;
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
242 case SDL_KEYUP:
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
243 controller_released(0, keycode_to_bit(event.key.keysym.sym));
3b7910575a00 Implemented basic keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 28
diff changeset
244 break;
28
c677507682e3 Untested controller implementation
Michael Pavone <pavone@retrodev.com>
parents: 24
diff changeset
245 //TODO: Controller hotplug
16
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
246 }
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
247 }
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
248 }
ae58e7c3c328 Poll events regularly to avoid unresponsive app warnings. Handle quit event
Michael Pavone <pavone@retrodev.com>
parents: 15
diff changeset
249