annotate render_sdl.c @ 1781:2b4d5cfec6d9

Grab keyboard devices at startup so keyboard input stops going to terminal while running
author Michael Pavone <pavone@retrodev.com>
date Sun, 10 Mar 2019 22:22:23 -0700
parents ba3fb7a3be6b
children 52a47611a273
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 445
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 445
diff changeset
2 Copyright 2013 Michael Pavone
487
c08a4efeee7f Update opengl branch from default. Fix build breakage unrelated to merge
Mike Pavone <pavone@retrodev.com>
parents: 449 486
diff changeset
3 This file is part of BlastEm.
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 445
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 445
diff changeset
5 */
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include <stdlib.h>
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdio.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 744
diff changeset
8 #include <string.h>
500
251fe7a75a14 Preserve aspect ratio unless config file says otherwise
Mike Pavone <pavone@retrodev.com>
parents: 498
diff changeset
9 #include <math.h>
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include "render.h"
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
11 #include "render_sdl.h"
66
7a22a0e6c004 Gamepad support
Mike Pavone <pavone@retrodev.com>
parents: 64
diff changeset
12 #include "blastem.h"
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 1102
diff changeset
13 #include "genesis.h"
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1580
diff changeset
14 #include "bindings.h"
497
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
15 #include "util.h"
1693
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
16 #include "paths.h"
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
17 #include "ppm.h"
1532
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
18 #include "png.h"
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
19 #include "config.h"
1603
c0727712d529 Read extral SDL2 mappings on startup from controller_types.cfg
Michael Pavone <pavone@retrodev.com>
parents: 1600
diff changeset
20 #include "controller_info.h"
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
22 #ifndef DISABLE_OPENGL
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
23 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
24 #include <SDL_opengles2.h>
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
25 #else
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
26 #include <GL/glew.h>
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
27 #endif
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
28 #endif
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
29
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
30 #define MAX_EVENT_POLL_PER_FRAME 2
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
31
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
32 static SDL_Window *main_window;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
33 static SDL_Window **extra_windows;
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
34 static SDL_Renderer *main_renderer;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
35 static SDL_Renderer **extra_renderers;
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
36 static SDL_Texture **sdl_textures;
1649
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
37 static window_close_handler *close_handlers;
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
38 static uint8_t num_textures;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
39 static SDL_Rect main_clip;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
40 static SDL_GLContext *main_context;
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
41
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
42 static int main_width, main_height, windowed_width, windowed_height, is_fullscreen;
914
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
43
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
44 static uint8_t render_gl = 1;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
45 static uint8_t scanlines = 0;
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
47 static uint32_t last_frame = 0;
54
3b79cbcf6846 Get Flavio's color bar demo kind of sort of working
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
48
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
49 static uint8_t output_channels;
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
50 static uint32_t buffer_samples, sample_rate;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
51 static uint32_t missing_count;
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
52
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
53 static SDL_mutex * audio_mutex;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
54 static SDL_cond * audio_ready;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
55 static uint8_t quitting = 0;
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
56
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
57 struct audio_source {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
58 SDL_cond *cond;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
59 int16_t *front;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
60 int16_t *back;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
61 double dt;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
62 uint64_t buffer_fraction;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
63 uint64_t buffer_inc;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
64 uint32_t buffer_pos;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
65 uint32_t read_start;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
66 uint32_t read_end;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
67 uint32_t lowpass_alpha;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
68 uint32_t mask;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
69 int16_t last_left;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
70 int16_t last_right;
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
71 uint8_t num_channels;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
72 uint8_t front_populated;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
73 };
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
74
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
75 static audio_source *audio_sources[8];
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
76 static audio_source *inactive_audio_sources[8];
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
77 static uint8_t num_audio_sources;
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
78 static uint8_t num_inactive_audio_sources;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
79 static uint8_t sync_to_audio;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
80 static uint32_t min_buffered;
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
81
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
82 typedef int32_t (*mix_func)(audio_source *audio, void *vstream, int len);
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
83
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
84 static int32_t mix_s16(audio_source *audio, void *vstream, int len)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
85 {
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
86 int samples = len/(sizeof(int16_t)*2);
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
87 int16_t *stream = vstream;
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
88 int16_t *end = stream + output_channels*samples;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
89 int16_t *src = audio->front;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
90 uint32_t i = audio->read_start;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
91 uint32_t i_end = audio->read_end;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
92 int16_t *cur = stream;
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
93 size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
94 if (audio->num_channels == 1) {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
95 while (cur < end && i != i_end)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
96 {
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
97 *cur += src[i];
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
98 cur += first_add;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
99 *cur += src[i++];
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
100 cur += second_add;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
101 i &= audio->mask;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
102 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
103 } else {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
104 while (cur < end && i != i_end)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
105 {
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
106 *cur += src[i++];
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
107 cur += first_add;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
108 *cur += src[i++];
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
109 cur += second_add;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
110 i &= audio->mask;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
111 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
112 }
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
113
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
114 if (cur != end) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
115 printf("Underflow of %d samples, read_start: %d, read_end: %d, mask: %X\n", (int)(end-cur)/2, audio->read_start, audio->read_end, audio->mask);
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
116 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
117 if (!sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
118 audio->read_start = i;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
119 }
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
120 if (cur != end) {
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
121 //printf("Underflow of %d samples, read_start: %d, read_end: %d, mask: %X\n", (int)(end-cur)/2, audio->read_start, audio->read_end, audio->mask);
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
122 return (cur-end)/2;
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
123 } else {
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
124 return ((i_end - i) & audio->mask) / audio->num_channels;
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
125 }
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
126 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
127
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
128 static int32_t mix_f32(audio_source *audio, void *vstream, int len)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
129 {
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
130 int samples = len/(sizeof(float)*2);
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
131 float *stream = vstream;
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
132 float *end = stream + 2*samples;
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
133 int16_t *src = audio->front;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
134 uint32_t i = audio->read_start;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
135 uint32_t i_end = audio->read_end;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
136 float *cur = stream;
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
137 size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
138 if (audio->num_channels == 1) {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
139 while (cur < end && i != i_end)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
140 {
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
141 *cur += ((float)src[i]) / 0x7FFF;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
142 cur += first_add;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
143 *cur += ((float)src[i++]) / 0x7FFF;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
144 cur += second_add;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
145 i &= audio->mask;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
146 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
147 } else {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
148 while(cur < end && i != i_end)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
149 {
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
150 *cur += ((float)src[i++]) / 0x7FFF;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
151 cur += first_add;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
152 *cur += ((float)src[i++]) / 0x7FFF;
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
153 cur += second_add;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
154 i &= audio->mask;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
155 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
156 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
157 if (!sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
158 audio->read_start = i;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
159 }
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
160 if (cur != end) {
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
161 printf("Underflow of %d samples, read_start: %d, read_end: %d, mask: %X\n", (int)(end-cur)/2, audio->read_start, audio->read_end, audio->mask);
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
162 return (cur-end)/2;
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
163 } else {
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
164 return ((i_end - i) & audio->mask) / audio->num_channels;
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
165 }
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
166 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
167
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
168 static int32_t mix_null(audio_source *audio, void *vstream, int len)
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
169 {
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
170 return 0;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
171 }
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
172
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
173 static mix_func mix;
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
174
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
175 static void audio_callback(void * userdata, uint8_t *byte_stream, int len)
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176 {
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
177 uint8_t num_populated;
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
178 memset(byte_stream, 0, len);
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
179 SDL_LockMutex(audio_mutex);
364
62177cc39049 Incredibly broken YM2612 support plus a fix to Z80 bus request
Mike Pavone <pavone@retrodev.com>
parents: 361
diff changeset
180 do {
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
181 num_populated = 0;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
182 for (uint8_t i = 0; i < num_audio_sources; i++)
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
183 {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
184 if (audio_sources[i]->front_populated) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
185 num_populated++;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
186 }
364
62177cc39049 Incredibly broken YM2612 support plus a fix to Z80 bus request
Mike Pavone <pavone@retrodev.com>
parents: 361
diff changeset
187 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
188 if (!quitting && num_populated < num_audio_sources) {
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
189 fflush(stdout);
364
62177cc39049 Incredibly broken YM2612 support plus a fix to Z80 bus request
Mike Pavone <pavone@retrodev.com>
parents: 361
diff changeset
190 SDL_CondWait(audio_ready, audio_mutex);
62177cc39049 Incredibly broken YM2612 support plus a fix to Z80 bus request
Mike Pavone <pavone@retrodev.com>
parents: 361
diff changeset
191 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
192 } while(!quitting && num_populated < num_audio_sources);
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
193 if (!quitting) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
194 for (uint8_t i = 0; i < num_audio_sources; i++)
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
195 {
1552
13a82adb185b Add support for float32 format audio samples
Michael Pavone <pavone@retrodev.com>
parents: 1551
diff changeset
196 mix(audio_sources[i], byte_stream, len);
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
197 audio_sources[i]->front_populated = 0;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
198 SDL_CondSignal(audio_sources[i]->cond);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
199 }
361
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
200 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
201 SDL_UnlockMutex(audio_mutex);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
202 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
203
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
204 #define NO_LAST_BUFFERED -2000000000
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
205 static int32_t last_buffered = NO_LAST_BUFFERED;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
206 static float average_change;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
207 #define BUFFER_FRAMES_THRESHOLD 6
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
208 #define BASE_MAX_ADJUST 0.0125
1565
61fafcbc2c38 Audio DRC now sounds good in both NTSC and PAL, just need to adjust constants to minimize latency without leading to dropouts
Michael Pavone <pavone@retrodev.com>
parents: 1564
diff changeset
209 static float max_adjust;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
210 static int32_t cur_min_buffered;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
211 static uint32_t min_remaining_buffer;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
212 static void audio_callback_drc(void *userData, uint8_t *byte_stream, int len)
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
213 {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
214 memset(byte_stream, 0, len);
1589
780604a036e4 Limit underflow warning spam
Michael Pavone <pavone@retrodev.com>
parents: 1588
diff changeset
215 if (cur_min_buffered < 0) {
780604a036e4 Limit underflow warning spam
Michael Pavone <pavone@retrodev.com>
parents: 1588
diff changeset
216 //underflow last frame, but main thread hasn't gotten a chance to call SDL_PauseAudio yet
780604a036e4 Limit underflow warning spam
Michael Pavone <pavone@retrodev.com>
parents: 1588
diff changeset
217 return;
780604a036e4 Limit underflow warning spam
Michael Pavone <pavone@retrodev.com>
parents: 1588
diff changeset
218 }
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
219 cur_min_buffered = 0x7FFFFFFF;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
220 min_remaining_buffer = 0xFFFFFFFF;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
221 for (uint8_t i = 0; i < num_audio_sources; i++)
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
222 {
1564
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
223
48b08986bf8f Mostly working dynamic rate control. Needs some tweaking, especially for PAL
Michael Pavone <pavone@retrodev.com>
parents: 1563
diff changeset
224 int32_t buffered = mix(audio_sources[i], byte_stream, len);
1565
61fafcbc2c38 Audio DRC now sounds good in both NTSC and PAL, just need to adjust constants to minimize latency without leading to dropouts
Michael Pavone <pavone@retrodev.com>
parents: 1564
diff changeset
225 cur_min_buffered = buffered < cur_min_buffered ? buffered : cur_min_buffered;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
226 uint32_t remaining = (audio_sources[i]->mask + 1)/audio_sources[i]->num_channels - buffered;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
227 min_remaining_buffer = remaining < min_remaining_buffer ? remaining : min_remaining_buffer;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
228 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
229 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
230
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
231 static void lock_audio()
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
232 {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
233 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
234 SDL_LockMutex(audio_mutex);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
235 } else {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
236 SDL_LockAudio();
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
237 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
238 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
239
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
240 static void unlock_audio()
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
241 {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
242 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
243 SDL_UnlockMutex(audio_mutex);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
244 } else {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
245 SDL_UnlockAudio();
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
246 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
247 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
248
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
249 static void render_close_audio()
361
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
250 {
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
251 SDL_LockMutex(audio_mutex);
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
252 quitting = 1;
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
253 SDL_CondSignal(audio_ready);
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
254 SDL_UnlockMutex(audio_mutex);
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
255 SDL_CloseAudio();
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
256 }
946ae3749260 Fix deadlock on quit
Mike Pavone <pavone@retrodev.com>
parents: 356
diff changeset
257
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
258 #define BUFFER_INC_RES 0x40000000UL
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
259
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
260 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
261 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
262 src->buffer_inc = ((BUFFER_INC_RES * (uint64_t)sample_rate) / master_clock) * sample_divider;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
263 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
264
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
265 audio_source *render_audio_source(uint64_t master_clock, uint64_t sample_divider, uint8_t channels)
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
266 {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
267 audio_source *ret = NULL;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
268 uint32_t alloc_size = sync_to_audio ? channels * buffer_samples : nearest_pow2(min_buffered * 4 * channels);
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
269 lock_audio();
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
270 if (num_audio_sources < 8) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
271 ret = malloc(sizeof(audio_source));
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
272 ret->back = malloc(alloc_size * sizeof(int16_t));
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
273 ret->front = sync_to_audio ? malloc(alloc_size * sizeof(int16_t)) : ret->back;
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
274 ret->front_populated = 0;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
275 ret->cond = SDL_CreateCond();
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
276 ret->num_channels = channels;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
277 audio_sources[num_audio_sources++] = ret;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
278 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
279 unlock_audio();
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
280 if (!ret) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
281 fatal_error("Too many audio sources!");
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
282 } else {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
283 render_audio_adjust_clock(ret, master_clock, sample_divider);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
284 double lowpass_cutoff = get_lowpass_cutoff(config);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
285 double rc = (1.0 / lowpass_cutoff) / (2.0 * M_PI);
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
286 ret->dt = 1.0 / ((double)master_clock / (double)(sample_divider));
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
287 double alpha = ret->dt / (ret->dt + rc);
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
288 ret->lowpass_alpha = (int32_t)(((double)0x10000) * alpha);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
289 ret->buffer_pos = 0;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
290 ret->buffer_fraction = 0;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
291 ret->last_left = ret->last_right = 0;
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
292 ret->read_start = 0;
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
293 ret->read_end = sync_to_audio ? buffer_samples * channels : 0;
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
294 ret->mask = sync_to_audio ? 0xFFFFFFFF : alloc_size-1;
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
295 }
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
296 if (sync_to_audio && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) {
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
297 SDL_PauseAudio(0);
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
298 }
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
299 return ret;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
300 }
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
301
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
302 void render_pause_source(audio_source *src)
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
303 {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
304 uint8_t need_pause = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
305 lock_audio();
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
306 for (uint8_t i = 0; i < num_audio_sources; i++)
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
307 {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
308 if (audio_sources[i] == src) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
309 audio_sources[i] = audio_sources[--num_audio_sources];
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
310 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
311 SDL_CondSignal(audio_ready);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
312 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
313 break;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
314 }
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
315 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
316 if (!num_audio_sources) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
317 need_pause = 1;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
318 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
319 unlock_audio();
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
320 if (need_pause) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
321 SDL_PauseAudio(1);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
322 }
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
323 inactive_audio_sources[num_inactive_audio_sources++] = src;
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
324 }
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
325
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
326 void render_resume_source(audio_source *src)
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
327 {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
328 lock_audio();
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
329 if (num_audio_sources < 8) {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
330 audio_sources[num_audio_sources++] = src;
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
331 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
332 unlock_audio();
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
333 for (uint8_t i = 0; i < num_inactive_audio_sources; i++)
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
334 {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
335 if (inactive_audio_sources[i] == src) {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
336 inactive_audio_sources[i] = inactive_audio_sources[--num_inactive_audio_sources];
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
337 }
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
338 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
339 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
340 SDL_PauseAudio(0);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
341 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
342 }
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
343
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
344 void render_free_source(audio_source *src)
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
345 {
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
346 render_pause_source(src);
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
347
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
348 free(src->front);
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
349 if (sync_to_audio) {
1588
348814d5b73f Fix double free in sync to video mode
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
350 free(src->back);
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
351 SDL_DestroyCond(src->cond);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
352 }
1551
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
353 free(src);
ce1f93be0104 Small cleanup to audio interface between emulation code and renderer backend
Michael Pavone <pavone@retrodev.com>
parents: 1534
diff changeset
354 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
355 static uint32_t sync_samples;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
356 static void do_audio_ready(audio_source *src)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
357 {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
358 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
359 SDL_LockMutex(audio_mutex);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
360 while (src->front_populated) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
361 SDL_CondWait(src->cond, audio_mutex);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
362 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
363 int16_t *tmp = src->front;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
364 src->front = src->back;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
365 src->back = tmp;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
366 src->front_populated = 1;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
367 src->buffer_pos = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
368 SDL_CondSignal(audio_ready);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
369 SDL_UnlockMutex(audio_mutex);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
370 } else {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
371 uint32_t num_buffered;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
372 SDL_LockAudio();
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
373 src->read_end = src->buffer_pos;
1565
61fafcbc2c38 Audio DRC now sounds good in both NTSC and PAL, just need to adjust constants to minimize latency without leading to dropouts
Michael Pavone <pavone@retrodev.com>
parents: 1564
diff changeset
374 num_buffered = ((src->read_end - src->read_start) & src->mask) / src->num_channels;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
375 SDL_UnlockAudio();
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
376 if (num_buffered >= min_buffered && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) {
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
377 SDL_PauseAudio(0);
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
378 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
379 }
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
380 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
381
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
382 static int16_t lowpass_sample(audio_source *src, int16_t last, int16_t current)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
383 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
384 int32_t tmp = current * src->lowpass_alpha + last * (0x10000 - src->lowpass_alpha);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
385 current = tmp >> 16;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
386 return current;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
387 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
388
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
389 static void interp_sample(audio_source *src, int16_t last, int16_t current)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
390 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
391 int64_t tmp = last * ((src->buffer_fraction << 16) / src->buffer_inc);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
392 tmp += current * (0x10000 - ((src->buffer_fraction << 16) / src->buffer_inc));
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
393 src->back[src->buffer_pos++] = tmp >> 16;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
394 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
395
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
396 void render_put_mono_sample(audio_source *src, int16_t value)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
397 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
398 value = lowpass_sample(src, src->last_left, value);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
399 src->buffer_fraction += src->buffer_inc;
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
400 uint32_t base = sync_to_audio ? 0 : src->read_end;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
401 while (src->buffer_fraction > BUFFER_INC_RES)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
402 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
403 src->buffer_fraction -= BUFFER_INC_RES;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
404 interp_sample(src, src->last_left, value);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
405
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
406 if (((src->buffer_pos - base) & src->mask) >= sync_samples) {
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
407 do_audio_ready(src);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
408 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
409 src->buffer_pos &= src->mask;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
410 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
411 src->last_left = value;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
412 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
413
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
414 void render_put_stereo_sample(audio_source *src, int16_t left, int16_t right)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
415 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
416 left = lowpass_sample(src, src->last_left, left);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
417 right = lowpass_sample(src, src->last_right, right);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
418 src->buffer_fraction += src->buffer_inc;
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
419 uint32_t base = sync_to_audio ? 0 : src->read_end;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
420 while (src->buffer_fraction > BUFFER_INC_RES)
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
421 {
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
422 src->buffer_fraction -= BUFFER_INC_RES;
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
423
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
424 interp_sample(src, src->last_left, left);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
425 interp_sample(src, src->last_right, right);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
426
1574
ade5b8148caa Fix sync to audio option
Michael Pavone <pavone@retrodev.com>
parents: 1573
diff changeset
427 if (((src->buffer_pos - base) & src->mask)/2 >= sync_samples) {
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
428 do_audio_ready(src);
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
429 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
430 src->buffer_pos &= src->mask;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
431 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
432 src->last_left = left;
1562
d7b0d0ce8ed1 Fix regression in right audio channel
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
433 src->last_right = right;
1555
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
434 }
6ce36c3f250b More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents: 1552
diff changeset
435
937
9364dad5561a Added reasonable handling of joystick hotplug
Michael Pavone <pavone@retrodev.com>
parents: 915
diff changeset
436 static SDL_Joystick * joysticks[MAX_JOYSTICKS];
1187
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
437 static int joystick_sdl_index[MAX_JOYSTICKS];
432
18cde14e8c10 Read joystick bindings from config file
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
438
914
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
439 int render_width()
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
440 {
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
441 return main_width;
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
442 }
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
443
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
444 int render_height()
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
445 {
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
446 return main_height;
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
447 }
28ec32e720b2 Scale mouse data based on window size
Michael Pavone <pavone@retrodev.com>
parents: 907
diff changeset
448
915
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
449 int render_fullscreen()
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
450 {
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
451 return is_fullscreen;
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
452 }
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
453
426
add9e2f5c0e3 Make VDP render in native pixel format of the renderer for a modest performance gain and to make it easier to use OpenGL for rendering
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
454 uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b)
add9e2f5c0e3 Make VDP render in native pixel format of the renderer for a modest performance gain and to make it easier to use OpenGL for rendering
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
455 {
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
456 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
457 return 255 << 24 | b << 16 | g << 8 | r;
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
458 #else
719
019d27995e32 Upgrade to SDL 2.0 and drop support for the non-OpenGL render path
Michael Pavone <pavone@retrodev.com>
parents: 655
diff changeset
459 return 255 << 24 | r << 16 | g << 8 | b;
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
460 #endif
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
461 }
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
462
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
463 #ifndef DISABLE_OPENGL
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
464 static GLuint textures[3], buffers[2], vshader, fshader, program, un_textures[2], un_width, un_height, at_pos;
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
465
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
466 static GLfloat vertex_data_default[] = {
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
467 -1.0f, -1.0f,
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
468 1.0f, -1.0f,
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
469 -1.0f, 1.0f,
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
470 1.0f, 1.0f
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
471 };
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
472
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
473 static GLfloat vertex_data[8];
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
474
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
475 static const GLushort element_data[] = {0, 1, 2, 3};
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
476
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
477 static const GLchar shader_prefix[] =
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
478 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
479 "#version 100\n";
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
480 #else
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
481 "#version 110\n"
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
482 "#define lowp\n"
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
483 "#define mediump\n"
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
484 "#define highp\n";
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
485 #endif
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
486
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
487 static GLuint load_shader(char * fname, GLenum shader_type)
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
488 {
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 874
diff changeset
489 char const * parts[] = {get_home_dir(), "/.config/blastem/shaders/", fname};
497
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
490 char * shader_path = alloc_concat_m(3, parts);
816
7ed55a361e79 Use binary mode for reading shaders and config files so we actually get the number of bytes we expect
Michael Pavone <pavone@retrodev.com>
parents: 800
diff changeset
491 FILE * f = fopen(shader_path, "rb");
497
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
492 free(shader_path);
1693
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
493 GLchar * text;
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
494 long fsize;
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
495 if (f) {
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
496 fsize = file_size(f);
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
497 text = malloc(fsize);
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
498 if (fread(text, 1, fsize, f) != fsize) {
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
499 warning("Error reading from shader file %s\n", fname);
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
500 free(text);
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
501 return 0;
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
502 }
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
503 } else {
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
504 shader_path = path_append("shaders", fname);
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
505 uint32_t fsize32;
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
506 text = read_bundled_file(shader_path, &fsize32);
497
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
507 free(shader_path);
1693
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
508 if (!text) {
800
ec23202df6a6 Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 799
diff changeset
509 warning("Failed to open shader file %s for reading\n", fname);
497
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
510 return 0;
0820a71b80f3 Move shader files to their own directory. Read shaders from /.config/blastem/shaders or from path_to_exe/shaders instead of the current working directory.
Mike Pavone <pavone@retrodev.com>
parents: 495
diff changeset
511 }
1693
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
512 fsize = fsize32;
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
513 }
1693
ba3fb7a3be6b Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents: 1686
diff changeset
514
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
515 if (strncmp(text, "#version", strlen("#version"))) {
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
516 GLchar *tmp = text;
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
517 text = alloc_concat(shader_prefix, tmp);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
518 free(tmp);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
519 fsize += strlen(shader_prefix);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
520 }
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
521 GLuint ret = glCreateShader(shader_type);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
522 glShaderSource(ret, 1, (const GLchar **)&text, (const GLint *)&fsize);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
523 free(text);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
524 glCompileShader(ret);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
525 GLint compile_status, loglen;
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
526 glGetShaderiv(ret, GL_COMPILE_STATUS, &compile_status);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
527 if (!compile_status) {
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
528 glGetShaderiv(ret, GL_INFO_LOG_LENGTH, &loglen);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
529 text = malloc(loglen);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
530 glGetShaderInfoLog(ret, loglen, NULL, text);
800
ec23202df6a6 Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 799
diff changeset
531 warning("Shader %s failed to compile:\n%s\n", fname, text);
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
532 free(text);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
533 glDeleteShader(ret);
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
534 return 0;
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
535 }
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
536 return ret;
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
537 }
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
538 #endif
488
32f053ad9b02 Basic OpenGL rendering is working
Mike Pavone <pavone@retrodev.com>
parents: 487
diff changeset
539
1167
e758ddbf0624 Initial work on emulating top and bottom border area
Michael Pavone <pavone@retrodev.com>
parents: 1117
diff changeset
540 static uint32_t texture_buf[512 * 513];
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
541 #ifndef DISABLE_OPENGL
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
542 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
543 #define INTERNAL_FORMAT GL_RGBA
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
544 #define SRC_FORMAT GL_RGBA
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
545 #define RENDER_FORMAT SDL_PIXELFORMAT_ABGR8888
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
546 #else
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
547 #define INTERNAL_FORMAT GL_RGBA8
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
548 #define SRC_FORMAT GL_BGRA
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
549 #define RENDER_FORMAT SDL_PIXELFORMAT_ARGB8888
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
550 #endif
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
551 static void gl_setup()
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
552 {
1403
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
553 tern_val def = {.ptrval = "linear"};
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
554 char *scaling = tern_find_path_default(config, "video\0scaling\0", def, TVAL_PTR).ptrval;
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
555 GLint filter = strcmp(scaling, "linear") ? GL_NEAREST : GL_LINEAR;
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
556 glGenTextures(3, textures);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
557 for (int i = 0; i < 3; i++)
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
558 {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
559 glBindTexture(GL_TEXTURE_2D, textures[i]);
1403
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
560 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
561 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
562 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
563 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
564 if (i < 2) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
565 //TODO: Fixme for PAL + invalid display mode
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
566 glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, 512, 512, 0, SRC_FORMAT, GL_UNSIGNED_BYTE, texture_buf);
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
567 } else {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
568 uint32_t blank = 255 << 24;
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
569 glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, 1, 1, 0, SRC_FORMAT, GL_UNSIGNED_BYTE, &blank);
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
570 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
571 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
572 glGenBuffers(2, buffers);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
573 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
574 glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
575 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
576 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(element_data), element_data, GL_STATIC_DRAW);
1403
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
577 def.ptrval = "default.v.glsl";
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
578 vshader = load_shader(tern_find_path_default(config, "video\0vertex_shader\0", def, TVAL_PTR).ptrval, GL_VERTEX_SHADER);
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
579 def.ptrval = "default.f.glsl";
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
580 fshader = load_shader(tern_find_path_default(config, "video\0fragment_shader\0", def, TVAL_PTR).ptrval, GL_FRAGMENT_SHADER);
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
581 program = glCreateProgram();
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
582 glAttachShader(program, vshader);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
583 glAttachShader(program, fshader);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
584 glLinkProgram(program);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
585 GLint link_status;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
586 glGetProgramiv(program, GL_LINK_STATUS, &link_status);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
587 if (!link_status) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
588 fputs("Failed to link shader program\n", stderr);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
589 exit(1);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
590 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
591 un_textures[0] = glGetUniformLocation(program, "textures[0]");
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
592 un_textures[1] = glGetUniformLocation(program, "textures[1]");
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
593 un_width = glGetUniformLocation(program, "width");
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
594 un_height = glGetUniformLocation(program, "height");
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
595 at_pos = glGetAttribLocation(program, "pos");
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
596 }
1593
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
597
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
598 static void gl_teardown()
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
599 {
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
600 glDeleteProgram(program);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
601 glDeleteShader(vshader);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
602 glDeleteShader(fshader);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
603 glDeleteBuffers(2, buffers);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
604 glDeleteTextures(3, textures);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
605 }
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
606 #endif
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
607
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
608 static uint8_t texture_init;
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
609 static void render_alloc_surfaces()
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
610 {
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 874
diff changeset
611 if (texture_init) {
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 874
diff changeset
612 return;
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 874
diff changeset
613 }
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
614 sdl_textures= malloc(sizeof(SDL_Texture *) * 2);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
615 num_textures = 2;
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 874
diff changeset
616 texture_init = 1;
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
617 #ifndef DISABLE_OPENGL
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
618 if (render_gl) {
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
619 sdl_textures[0] = sdl_textures[1] = NULL;
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
620 gl_setup();
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
621 } else {
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
622 #endif
1403
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
623 tern_val def = {.ptrval = "linear"};
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
624 char *scaling = tern_find_path_default(config, "video\0scaling\0", def, TVAL_PTR).ptrval;
87493f585c7f Allow selecting linear or nearet neighbor scaling for both the Open GL and SDL 2 renderers
Michael Pavone <pavone@retrodev.com>
parents: 1402
diff changeset
625 SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaling);
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
626 //TODO: Fixme for invalid display mode
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
627 sdl_textures[0] = sdl_textures[1] = SDL_CreateTexture(main_renderer, RENDER_FORMAT, SDL_TEXTUREACCESS_STREAMING, LINEBUF_SIZE, 588);
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
628 #ifndef DISABLE_OPENGL
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
629 }
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
630 #endif
426
add9e2f5c0e3 Make VDP render in native pixel format of the renderer for a modest performance gain and to make it easier to use OpenGL for rendering
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
631 }
add9e2f5c0e3 Make VDP render in native pixel format of the renderer for a modest performance gain and to make it easier to use OpenGL for rendering
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
632
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
633 static void free_surfaces(void)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
634 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
635 for (int i = 0; i < num_textures; i++)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
636 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
637 if (sdl_textures[i]) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
638 SDL_DestroyTexture(sdl_textures[i]);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
639 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
640 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
641 free(sdl_textures);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
642 sdl_textures = NULL;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
643 texture_init = 0;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
644 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
645
1102
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
646 static char * caption = NULL;
c15896605bf2 Clean up symbol visiblity and delete a ltitle bit of dead code
Michael Pavone <pavone@retrodev.com>
parents: 1077
diff changeset
647 static char * fps_caption = NULL;
486
db5880d8ea03 Add an FPS counter to the title bar
Mike Pavone <pavone@retrodev.com>
parents: 467
diff changeset
648
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
649 static void render_quit()
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
650 {
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
651 render_close_audio();
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
652 free_surfaces();
1593
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
653 #ifndef DISABLE_OPENGL
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
654 if (render_gl) {
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
655 gl_teardown();
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
656 SDL_GL_DeleteContext(main_context);
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
657 }
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
658 #endif
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
659 }
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
660
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
661 static float config_aspect()
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
662 {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
663 static float aspect = 0.0f;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
664 if (aspect == 0.0f) {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
665 char *config_aspect = tern_find_path_default(config, "video\0aspect\0", (tern_val){.ptrval = "4:3"}, TVAL_PTR).ptrval;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
666 if (strcmp("stretch", config_aspect)) {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
667 aspect = 4.0f/3.0f;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
668 char *end;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
669 float aspect_numerator = strtof(config_aspect, &end);
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
670 if (aspect_numerator > 0.0f && *end == ':') {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
671 float aspect_denominator = strtof(end+1, &end);
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
672 if (aspect_denominator > 0.0f && !*end) {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
673 aspect = aspect_numerator / aspect_denominator;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
674 }
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
675 }
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
676 } else {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
677 aspect = -1.0f;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
678 }
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
679 }
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
680 return aspect;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
681 }
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
682
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
683 static void update_aspect()
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
684 {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
685 //reset default values
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
686 memcpy(vertex_data, vertex_data_default, sizeof(vertex_data));
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
687 main_clip.w = main_width;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
688 main_clip.h = main_height;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
689 main_clip.x = main_clip.y = 0;
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
690 if (config_aspect() > 0.0f) {
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
691 float aspect = (float)main_width / main_height;
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
692 if (fabs(aspect - config_aspect()) < 0.01f) {
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
693 //close enough for government work
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
694 return;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
695 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
696 #ifndef DISABLE_OPENGL
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
697 if (render_gl) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
698 for (int i = 0; i < 4; i++)
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
699 {
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
700 if (aspect > config_aspect()) {
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
701 vertex_data[i*2] *= config_aspect()/aspect;
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
702 } else {
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
703 vertex_data[i*2+1] *= aspect/config_aspect();
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
704 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
705 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
706 } else {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
707 #endif
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
708 main_clip.w = aspect > config_aspect() ? config_aspect() * (float)main_height : main_width;
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
709 main_clip.h = aspect > config_aspect() ? main_height : main_width / config_aspect();
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
710 main_clip.x = (main_width - main_clip.w) / 2;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
711 main_clip.y = (main_height - main_clip.h) / 2;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
712 #ifndef DISABLE_OPENGL
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
713 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
714 #endif
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
715 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
716 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
717
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
718 static ui_render_fun on_context_destroyed, on_context_created;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
719 void render_set_gl_context_handlers(ui_render_fun destroy, ui_render_fun create)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
720 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
721 on_context_destroyed = destroy;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
722 on_context_created = create;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
723 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
724
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
725 static uint8_t scancode_map[SDL_NUM_SCANCODES] = {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
726 [SDL_SCANCODE_A] = 0x1C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
727 [SDL_SCANCODE_B] = 0x32,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
728 [SDL_SCANCODE_C] = 0x21,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
729 [SDL_SCANCODE_D] = 0x23,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
730 [SDL_SCANCODE_E] = 0x24,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
731 [SDL_SCANCODE_F] = 0x2B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
732 [SDL_SCANCODE_G] = 0x34,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
733 [SDL_SCANCODE_H] = 0x33,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
734 [SDL_SCANCODE_I] = 0x43,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
735 [SDL_SCANCODE_J] = 0x3B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
736 [SDL_SCANCODE_K] = 0x42,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
737 [SDL_SCANCODE_L] = 0x4B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
738 [SDL_SCANCODE_M] = 0x3A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
739 [SDL_SCANCODE_N] = 0x31,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
740 [SDL_SCANCODE_O] = 0x44,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
741 [SDL_SCANCODE_P] = 0x4D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
742 [SDL_SCANCODE_Q] = 0x15,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
743 [SDL_SCANCODE_R] = 0x2D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
744 [SDL_SCANCODE_S] = 0x1B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
745 [SDL_SCANCODE_T] = 0x2C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
746 [SDL_SCANCODE_U] = 0x3C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
747 [SDL_SCANCODE_V] = 0x2A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
748 [SDL_SCANCODE_W] = 0x1D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
749 [SDL_SCANCODE_X] = 0x22,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
750 [SDL_SCANCODE_Y] = 0x35,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
751 [SDL_SCANCODE_Z] = 0x1A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
752 [SDL_SCANCODE_1] = 0x16,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
753 [SDL_SCANCODE_2] = 0x1E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
754 [SDL_SCANCODE_3] = 0x26,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
755 [SDL_SCANCODE_4] = 0x25,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
756 [SDL_SCANCODE_5] = 0x2E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
757 [SDL_SCANCODE_6] = 0x36,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
758 [SDL_SCANCODE_7] = 0x3D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
759 [SDL_SCANCODE_8] = 0x3E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
760 [SDL_SCANCODE_9] = 0x46,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
761 [SDL_SCANCODE_0] = 0x45,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
762 [SDL_SCANCODE_RETURN] = 0x5A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
763 [SDL_SCANCODE_ESCAPE] = 0x76,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
764 [SDL_SCANCODE_SPACE] = 0x29,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
765 [SDL_SCANCODE_TAB] = 0x0D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
766 [SDL_SCANCODE_BACKSPACE] = 0x66,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
767 [SDL_SCANCODE_MINUS] = 0x4E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
768 [SDL_SCANCODE_EQUALS] = 0x55,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
769 [SDL_SCANCODE_LEFTBRACKET] = 0x54,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
770 [SDL_SCANCODE_RIGHTBRACKET] = 0x5B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
771 [SDL_SCANCODE_BACKSLASH] = 0x5D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
772 [SDL_SCANCODE_SEMICOLON] = 0x4C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
773 [SDL_SCANCODE_APOSTROPHE] = 0x52,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
774 [SDL_SCANCODE_GRAVE] = 0x0E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
775 [SDL_SCANCODE_COMMA] = 0x41,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
776 [SDL_SCANCODE_PERIOD] = 0x49,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
777 [SDL_SCANCODE_SLASH] = 0x4A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
778 [SDL_SCANCODE_CAPSLOCK] = 0x58,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
779 [SDL_SCANCODE_F1] = 0x05,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
780 [SDL_SCANCODE_F2] = 0x06,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
781 [SDL_SCANCODE_F3] = 0x04,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
782 [SDL_SCANCODE_F4] = 0x0C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
783 [SDL_SCANCODE_F5] = 0x03,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
784 [SDL_SCANCODE_F6] = 0x0B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
785 [SDL_SCANCODE_F7] = 0x83,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
786 [SDL_SCANCODE_F8] = 0x0A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
787 [SDL_SCANCODE_F9] = 0x01,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
788 [SDL_SCANCODE_F10] = 0x09,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
789 [SDL_SCANCODE_F11] = 0x78,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
790 [SDL_SCANCODE_F12] = 0x07,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
791 [SDL_SCANCODE_LCTRL] = 0x14,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
792 [SDL_SCANCODE_LSHIFT] = 0x12,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
793 [SDL_SCANCODE_LALT] = 0x11,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
794 [SDL_SCANCODE_RCTRL] = 0x18,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
795 [SDL_SCANCODE_RSHIFT] = 0x59,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
796 [SDL_SCANCODE_RALT] = 0x17,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
797 [SDL_SCANCODE_INSERT] = 0x81,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
798 [SDL_SCANCODE_PAUSE] = 0x82,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
799 [SDL_SCANCODE_PRINTSCREEN] = 0x84,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
800 [SDL_SCANCODE_SCROLLLOCK] = 0x7E,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
801 [SDL_SCANCODE_DELETE] = 0x85,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
802 [SDL_SCANCODE_LEFT] = 0x86,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
803 [SDL_SCANCODE_HOME] = 0x87,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
804 [SDL_SCANCODE_END] = 0x88,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
805 [SDL_SCANCODE_UP] = 0x89,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
806 [SDL_SCANCODE_DOWN] = 0x8A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
807 [SDL_SCANCODE_PAGEUP] = 0x8B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
808 [SDL_SCANCODE_PAGEDOWN] = 0x8C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
809 [SDL_SCANCODE_RIGHT] = 0x8D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
810 [SDL_SCANCODE_NUMLOCKCLEAR] = 0x77,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
811 [SDL_SCANCODE_KP_DIVIDE] = 0x80,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
812 [SDL_SCANCODE_KP_MULTIPLY] = 0x7C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
813 [SDL_SCANCODE_KP_MINUS] = 0x7B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
814 [SDL_SCANCODE_KP_PLUS] = 0x79,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
815 [SDL_SCANCODE_KP_ENTER] = 0x19,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
816 [SDL_SCANCODE_KP_1] = 0x69,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
817 [SDL_SCANCODE_KP_2] = 0x72,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
818 [SDL_SCANCODE_KP_3] = 0x7A,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
819 [SDL_SCANCODE_KP_4] = 0x6B,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
820 [SDL_SCANCODE_KP_5] = 0x73,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
821 [SDL_SCANCODE_KP_6] = 0x74,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
822 [SDL_SCANCODE_KP_7] = 0x6C,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
823 [SDL_SCANCODE_KP_8] = 0x75,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
824 [SDL_SCANCODE_KP_9] = 0x7D,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
825 [SDL_SCANCODE_KP_0] = 0x70,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
826 [SDL_SCANCODE_KP_PERIOD] = 0x71,
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
827 };
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
828
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
829 static drop_handler drag_drop_handler;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
830 void render_set_drag_drop_handler(drop_handler handler)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
831 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
832 drag_drop_handler = handler;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
833 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
834
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
835 static event_handler custom_event_handler;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
836 void render_set_event_handler(event_handler handler)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
837 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
838 custom_event_handler = handler;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
839 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
840
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
841 static int find_joystick_index(SDL_JoystickID instanceID)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
842 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
843 for (int i = 0; i < MAX_JOYSTICKS; i++) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
844 if (joysticks[i] && SDL_JoystickInstanceID(joysticks[i]) == instanceID) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
845 return i;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
846 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
847 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
848 return -1;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
849 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
850
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
851 static int lowest_unused_joystick_index()
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
852 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
853 for (int i = 0; i < MAX_JOYSTICKS; i++) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
854 if (!joysticks[i]) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
855 return i;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
856 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
857 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
858 return -1;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
859 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
860
1596
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
861 SDL_Joystick *render_get_joystick(int index)
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
862 {
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
863 if (index >= MAX_JOYSTICKS) {
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
864 return NULL;
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
865 }
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
866 return joysticks[index];
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
867 }
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
868
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
869 char* render_joystick_type_id(int index)
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
870 {
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
871 SDL_Joystick *stick = render_get_joystick(index);
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
872 if (!stick) {
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
873 return NULL;
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
874 }
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
875 char *guid_string = malloc(33);
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
876 SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(stick), guid_string, 33);
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
877 return guid_string;
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
878 }
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1603
diff changeset
879
1596
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
880 SDL_GameController *render_get_controller(int index)
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
881 {
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
882 if (index >= MAX_JOYSTICKS) {
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
883 return NULL;
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
884 }
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
885 return SDL_GameControllerOpen(joystick_sdl_index[index]);
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
886 }
437e80a700aa Initial heuristics for detecting controller types and showing different labels in UI. Modified controller settings view to first display a list of controllers, only showing mapping after selecting controller
Michael Pavone <pavone@retrodev.com>
parents: 1593
diff changeset
887
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
888 static uint32_t overscan_top[NUM_VID_STD] = {2, 21};
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
889 static uint32_t overscan_bot[NUM_VID_STD] = {1, 17};
1267
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
890 static uint32_t overscan_left[NUM_VID_STD] = {13, 13};
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
891 static uint32_t overscan_right[NUM_VID_STD] = {14, 14};
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
892 static vid_std video_standard = VID_NTSC;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
893
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
894 static int32_t handle_event(SDL_Event *event)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
895 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
896 if (custom_event_handler) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
897 custom_event_handler(event);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
898 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
899 switch (event->type) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
900 case SDL_KEYDOWN:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
901 handle_keydown(event->key.keysym.sym, scancode_map[event->key.keysym.scancode]);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
902 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
903 case SDL_KEYUP:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
904 handle_keyup(event->key.keysym.sym, scancode_map[event->key.keysym.scancode]);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
905 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
906 case SDL_JOYBUTTONDOWN:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
907 handle_joydown(find_joystick_index(event->jbutton.which), event->jbutton.button);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
908 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
909 case SDL_JOYBUTTONUP:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
910 handle_joyup(find_joystick_index(event->jbutton.which), event->jbutton.button);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
911 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
912 case SDL_JOYHATMOTION:
1600
7f39c40b4b25 WIP UI for creating an SDL2 mapping for controllers that don't have one
Michael Pavone <pavone@retrodev.com>
parents: 1596
diff changeset
913 handle_joy_dpad(find_joystick_index(event->jhat.which), event->jhat.hat, event->jhat.value);
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
914 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
915 case SDL_JOYAXISMOTION:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
916 handle_joy_axis(find_joystick_index(event->jaxis.which), event->jaxis.axis, event->jaxis.value);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
917 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
918 case SDL_JOYDEVICEADDED:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
919 if (event->jdevice.which < MAX_JOYSTICKS) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
920 int index = lowest_unused_joystick_index();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
921 if (index >= 0) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
922 SDL_Joystick * joy = joysticks[index] = SDL_JoystickOpen(event->jdevice.which);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
923 joystick_sdl_index[index] = event->jdevice.which;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
924 if (joy) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
925 printf("Joystick %d added: %s\n", index, SDL_JoystickName(joy));
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
926 printf("\tNum Axes: %d\n\tNum Buttons: %d\n\tNum Hats: %d\n", SDL_JoystickNumAxes(joy), SDL_JoystickNumButtons(joy), SDL_JoystickNumHats(joy));
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
927 handle_joy_added(index);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
928 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
929 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
930 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
931 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
932 case SDL_JOYDEVICEREMOVED: {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
933 int index = find_joystick_index(event->jdevice.which);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
934 if (index >= 0) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
935 SDL_JoystickClose(joysticks[index]);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
936 joysticks[index] = NULL;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
937 printf("Joystick %d removed\n", index);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
938 } else {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
939 printf("Failed to find removed joystick with instance ID: %d\n", index);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
940 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
941 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
942 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
943 case SDL_MOUSEMOTION:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
944 handle_mouse_moved(event->motion.which, event->motion.x, event->motion.y + overscan_top[video_standard], event->motion.xrel, event->motion.yrel);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
945 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
946 case SDL_MOUSEBUTTONDOWN:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
947 handle_mousedown(event->button.which, event->button.button);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
948 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
949 case SDL_MOUSEBUTTONUP:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
950 handle_mouseup(event->button.which, event->button.button);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
951 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
952 case SDL_WINDOWEVENT:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
953 switch (event->window.event)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
954 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
955 case SDL_WINDOWEVENT_SIZE_CHANGED:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
956 main_width = event->window.data1;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
957 main_height = event->window.data2;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
958 update_aspect();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
959 #ifndef DISABLE_OPENGL
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
960 if (render_gl) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
961 if (on_context_destroyed) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
962 on_context_destroyed();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
963 }
1593
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
964 gl_teardown();
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
965 SDL_GL_DeleteContext(main_context);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
966 main_context = SDL_GL_CreateContext(main_window);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
967 gl_setup();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
968 if (on_context_created) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
969 on_context_created();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
970 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
971 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
972 #endif
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
973 break;
1649
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
974 case SDL_WINDOWEVENT_CLOSE:
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
975 if (SDL_GetWindowID(main_window) == event->window.windowID) {
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
976 exit(0);
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
977 } else {
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
978 for (int i = 0; i < num_textures - FRAMEBUFFER_USER_START; i++)
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
979 {
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
980 if (SDL_GetWindowID(extra_windows[i]) == event->window.windowID) {
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
981 if (close_handlers[i]) {
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
982 close_handlers[i](i + FRAMEBUFFER_USER_START);
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
983 }
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
984 break;
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
985 }
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
986 }
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
987 }
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
988 break;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
989 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
990 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
991 case SDL_DROPFILE:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
992 if (drag_drop_handler) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
993 drag_drop_handler(event->drop.file);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
994 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
995 SDL_free(event->drop.file);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
996 break;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
997 case SDL_QUIT:
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
998 puts("");
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
999 exit(0);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1000 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1001 return 0;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1002 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1003
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1004 static void drain_events()
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1005 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1006 SDL_Event event;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1007 while(SDL_PollEvent(&event))
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1008 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1009 handle_event(&event);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1010 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1011 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1012
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1013 static char *vid_std_names[NUM_VID_STD] = {"ntsc", "pal"};
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1014 static int display_hz;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1015 static int source_hz;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1016 static int source_frame;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1017 static int source_frame_count;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1018 static int frame_repeat[60];
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1019
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1020 static void init_audio()
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1021 {
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1022 SDL_AudioSpec desired, actual;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1023 char * rate_str = tern_find_path(config, "audio\0rate\0", TVAL_PTR).ptrval;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1024 int rate = rate_str ? atoi(rate_str) : 0;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1025 if (!rate) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1026 rate = 48000;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1027 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1028 desired.freq = rate;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1029 desired.format = AUDIO_S16SYS;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1030 desired.channels = 2;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1031 char * samples_str = tern_find_path(config, "audio\0buffer\0", TVAL_PTR).ptrval;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1032 int samples = samples_str ? atoi(samples_str) : 0;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1033 if (!samples) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1034 samples = 512;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1035 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1036 printf("config says: %d\n", samples);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1037 desired.samples = samples*2;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1038 desired.callback = sync_to_audio ? audio_callback : audio_callback_drc;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1039 desired.userdata = NULL;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1040
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1041 if (SDL_OpenAudio(&desired, &actual) < 0) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1042 fatal_error("Unable to open SDL audio: %s\n", SDL_GetError());
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1043 }
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1044 buffer_samples = actual.samples;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1045 sample_rate = actual.freq;
1684
b1d063466d03 Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Michael Pavone <pavone@retrodev.com>
parents: 1659
diff changeset
1046 output_channels = actual.channels;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1047 printf("Initialized audio at frequency %d with a %d sample buffer, ", actual.freq, actual.samples);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1048 if (actual.format == AUDIO_S16SYS) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1049 puts("signed 16-bit int format");
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1050 mix = mix_s16;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1051 } else if (actual.format == AUDIO_F32SYS) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1052 puts("32-bit float format");
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1053 mix = mix_f32;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1054 } else {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1055 printf("unsupported format %X\n", actual.format);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1056 warning("Unsupported audio sample format: %X\n", actual.format);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1057 mix = mix_null;
1402
458df351af06 Allow height to be specified in the config file and properly calculate from the aspect setting if it is not specified
Michael Pavone <pavone@retrodev.com>
parents: 1398
diff changeset
1058 }
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1059 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1060
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1061 void window_setup(void)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1062 {
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1063 uint32_t flags = SDL_WINDOW_RESIZABLE;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1064 if (is_fullscreen) {
719
019d27995e32 Upgrade to SDL 2.0 and drop support for the non-OpenGL render path
Michael Pavone <pavone@retrodev.com>
parents: 655
diff changeset
1065 flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1066 }
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1067
1659
19331a21da3a Switched default sync source back to audio as the video option is not ready for prime timeop
Mike Pavone <pavone@retrodev.com>
parents: 1658
diff changeset
1068 tern_val def = {.ptrval = "audio"};
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1069 char *sync_src = tern_find_path_default(config, "system\0sync_source\0", def, TVAL_PTR).ptrval;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1070 sync_to_audio = !strcmp(sync_src, "audio");
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1071
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1072 const char *vsync;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1073 if (sync_to_audio) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1074 def.ptrval = "off";
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1075 vsync = tern_find_path_default(config, "video\0vsync\0", def, TVAL_PTR).ptrval;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1076 } else {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1077 vsync = "on";
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1078 }
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1079
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1080 tern_node *video = tern_find_node(config, "video");
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1081 if (video)
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1082 {
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1083 for (int i = 0; i < NUM_VID_STD; i++)
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1084 {
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1085 tern_node *std_settings = tern_find_node(video, vid_std_names[i]);
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1086 if (std_settings) {
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1087 char *val = tern_find_path_default(std_settings, "overscan\0top\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1088 if (val) {
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1089 overscan_top[i] = atoi(val);
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1090 }
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1091 val = tern_find_path_default(std_settings, "overscan\0bottom\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1092 if (val) {
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1093 overscan_bot[i] = atoi(val);
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1094 }
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1095 val = tern_find_path_default(std_settings, "overscan\0left\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
1267
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1096 if (val) {
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1097 overscan_left[i] = atoi(val);
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1098 }
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1099 val = tern_find_path_default(std_settings, "overscan\0right\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
1267
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1100 if (val) {
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1101 overscan_right[i] = atoi(val);
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1102 }
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1103 }
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1104 }
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1105 }
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1106 render_gl = 0;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1107
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1108 #ifndef DISABLE_OPENGL
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1109 char *gl_enabled_str = tern_find_path_default(config, "video\0gl\0", def, TVAL_PTR).ptrval;
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1110 uint8_t gl_enabled = strcmp(gl_enabled_str, "off") != 0;
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1111 if (gl_enabled)
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1112 {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1113 flags |= SDL_WINDOW_OPENGL;
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1114 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1115 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1116 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1117 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1118 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1119 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1120 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1121 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1122 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1123 #endif
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1124 }
1074
3a0f684891ae Fix NOGL compile option
Michael Pavone <pavone@retrodev.com>
parents: 1068
diff changeset
1125 #endif
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1126 main_window = SDL_CreateWindow(caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, main_width, main_height, flags);
719
019d27995e32 Upgrade to SDL 2.0 and drop support for the non-OpenGL render path
Michael Pavone <pavone@retrodev.com>
parents: 655
diff changeset
1127 if (!main_window) {
792
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1128 fatal_error("Unable to create SDL window: %s\n", SDL_GetError());
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1129 }
1074
3a0f684891ae Fix NOGL compile option
Michael Pavone <pavone@retrodev.com>
parents: 1068
diff changeset
1130 #ifndef DISABLE_OPENGL
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1131 if (gl_enabled)
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1132 {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1133 main_context = SDL_GL_CreateContext(main_window);
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1134 #ifdef USE_GLES
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1135 int major_version;
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1136 if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major_version) == 0 && major_version >= 2) {
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1137 #else
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1138 GLenum res = glewInit();
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1139 if (res != GLEW_OK) {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1140 warning("Initialization of GLEW failed with code %d\n", res);
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1141 }
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1142
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1143 if (res == GLEW_OK && GLEW_VERSION_2_0) {
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1144 #endif
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1145 render_gl = 1;
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1146 SDL_GL_MakeCurrent(main_window, main_context);
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1147 if (!strcmp("tear", vsync)) {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1148 if (SDL_GL_SetSwapInterval(-1) < 0) {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1149 warning("late tear is not available (%s), using normal vsync\n", SDL_GetError());
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1150 vsync = "on";
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1151 } else {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1152 vsync = NULL;
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1153 }
1004
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1154 }
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1155 if (vsync) {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1156 if (SDL_GL_SetSwapInterval(!strcmp("on", vsync)) < 0) {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1157 warning("Failed to set vsync to %s: %s\n", vsync, SDL_GetError());
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1158 }
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1159 }
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1160 } else {
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1161 warning("OpenGL 2.0 is unavailable, falling back to SDL2 renderer\n");
1004
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1162 }
1328
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1163 }
70faad89d491 Add config file option to disable Open GL rendering
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1164 if (!render_gl) {
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1165 #endif
1004
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1166 flags = SDL_RENDERER_ACCELERATED;
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1167 if (!strcmp("on", vsync) || !strcmp("tear", vsync)) {
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1168 flags |= SDL_RENDERER_PRESENTVSYNC;
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1169 }
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1170 main_renderer = SDL_CreateRenderer(main_window, -1, flags);
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1171
1074
3a0f684891ae Fix NOGL compile option
Michael Pavone <pavone@retrodev.com>
parents: 1068
diff changeset
1172 if (!main_renderer) {
3a0f684891ae Fix NOGL compile option
Michael Pavone <pavone@retrodev.com>
parents: 1068
diff changeset
1173 fatal_error("unable to create SDL renderer: %s\n", SDL_GetError());
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1174 }
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1175 SDL_RendererInfo rinfo;
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1176 SDL_GetRendererInfo(main_renderer, &rinfo);
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1177 printf("SDL2 Render Driver: %s\n", rinfo.name);
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1178 main_clip.x = main_clip.y = 0;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1179 main_clip.w = main_width;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1180 main_clip.h = main_height;
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1181 #ifndef DISABLE_OPENGL
719
019d27995e32 Upgrade to SDL 2.0 and drop support for the non-OpenGL render path
Michael Pavone <pavone@retrodev.com>
parents: 655
diff changeset
1182 }
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
1183 #endif
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1184
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1185 SDL_GetWindowSize(main_window, &main_width, &main_height);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1186 printf("Window created with size: %d x %d\n", main_width, main_height);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1187 update_aspect();
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1188 render_alloc_surfaces();
1004
fc000f245cc8 Set vsync state based on config file rather than just using whatever the system decides for us.
Michael Pavone <pavone@retrodev.com>
parents: 1003
diff changeset
1189 def.ptrval = "off";
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1268
diff changeset
1190 scanlines = !strcmp(tern_find_path_default(config, "video\0scanlines\0", def, TVAL_PTR).ptrval, "on");
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1191 }
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1192
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1193 void render_init(int width, int height, char * title, uint8_t fullscreen)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1194 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1195 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1196 fatal_error("Unable to init SDL: %s\n", SDL_GetError());
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1197 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1198 atexit(SDL_Quit);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1199 if (height <= 0) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1200 float aspect = config_aspect() > 0.0f ? config_aspect() : 4.0f/3.0f;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1201 height = ((float)width / aspect) + 0.5f;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1202 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1203 printf("width: %d, height: %d\n", width, height);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1204 windowed_width = width;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1205 windowed_height = height;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1206
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1207 SDL_DisplayMode mode;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1208 //TODO: Explicit multiple monitor support
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1209 SDL_GetCurrentDisplayMode(0, &mode);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1210 display_hz = mode.refresh_rate;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1211
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1212 if (fullscreen) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1213 //the SDL2 migration guide suggests setting width and height to 0 when using SDL_WINDOW_FULLSCREEN_DESKTOP
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1214 //but that doesn't seem to work right when using OpenGL, at least on Linux anyway
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1215 width = mode.w;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1216 height = mode.h;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1217 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1218 main_width = width;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1219 main_height = height;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1220 is_fullscreen = fullscreen;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1221
486
db5880d8ea03 Add an FPS counter to the title bar
Mike Pavone <pavone@retrodev.com>
parents: 467
diff changeset
1222 caption = title;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1223
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1224 window_setup();
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1225
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1226 audio_mutex = SDL_CreateMutex();
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1227 audio_ready = SDL_CreateCond();
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1228
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1229 init_audio();
1355
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1230
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1231 uint32_t db_size;
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1232 char *db_data = read_bundled_file("gamecontrollerdb.txt", &db_size);
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1233 if (db_data) {
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1234 int added = SDL_GameControllerAddMappingsFromRW(SDL_RWFromMem(db_data, db_size), 1);
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1235 free(db_data);
1359
8c6d2ed3b959 Use printf rather than info_message for message about game controller mappings so it does not pop up a modal when not run from a terminal
Michael Pavone <pavone@retrodev.com>
parents: 1355
diff changeset
1236 printf("Added %d game controller mappings from gamecontrollerdb.txt\n", added);
1355
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1237 }
03cb4dd2499f Load extra controller mappings from gamecontrollerdb.txt
Michael Pavone <pavone@retrodev.com>
parents: 1336
diff changeset
1238
1603
c0727712d529 Read extral SDL2 mappings on startup from controller_types.cfg
Michael Pavone <pavone@retrodev.com>
parents: 1600
diff changeset
1239 controller_add_mappings();
c0727712d529 Read extral SDL2 mappings on startup from controller_types.cfg
Michael Pavone <pavone@retrodev.com>
parents: 1600
diff changeset
1240
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1241 SDL_JoystickEventState(SDL_ENABLE);
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1242
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1243 render_set_video_standard(VID_NTSC);
874
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1244
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
1245 atexit(render_quit);
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1246 }
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1247 #include<unistd.h>
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1248 static int in_toggle;
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1249 static void update_source(audio_source *src, double rc, uint8_t sync_changed)
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1250 {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1251 double alpha = src->dt / (src->dt + rc);
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1252 int32_t lowpass_alpha = (int32_t)(((double)0x10000) * alpha);
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1253 src->lowpass_alpha = lowpass_alpha;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1254 if (sync_changed) {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1255 uint32_t alloc_size = sync_to_audio ? src->num_channels * buffer_samples : nearest_pow2(min_buffered * 4 * src->num_channels);
1591
5cfc7e4a207e Fix code for handling switch between sync styles at runtime
Michael Pavone <pavone@retrodev.com>
parents: 1590
diff changeset
1256 src->back = realloc(src->back, alloc_size * sizeof(int16_t));
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1257 if (sync_to_audio) {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1258 src->front = malloc(alloc_size * sizeof(int16_t));
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1259 } else {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1260 free(src->front);
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1261 src->front = src->back;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1262 }
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1263 src->mask = sync_to_audio ? 0xFFFFFFFF : alloc_size-1;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1264 src->read_start = 0;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1265 src->read_end = sync_to_audio ? buffer_samples * src->num_channels : 0;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1266 src->buffer_pos = 0;
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1267 }
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1268 }
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1269
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1270 void render_config_updated(void)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1271 {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1272 uint8_t old_sync_to_audio = sync_to_audio;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1273
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1274 free_surfaces();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1275 #ifndef DISABLE_OPENGL
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1276 if (render_gl) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1277 if (on_context_destroyed) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1278 on_context_destroyed();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1279 }
1593
24508cb54f87 Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents: 1591
diff changeset
1280 gl_teardown();
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1281 SDL_GL_DeleteContext(main_context);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1282 } else {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1283 #endif
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1284 SDL_DestroyRenderer(main_renderer);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1285 #ifndef DISABLE_OPENGL
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1286 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1287 #endif
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1288 in_toggle = 1;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1289 SDL_DestroyWindow(main_window);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1290 drain_events();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1291
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1292 char *config_width = tern_find_path(config, "video\0width\0", TVAL_PTR).ptrval;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1293 if (config_width) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1294 windowed_width = atoi(config_width);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1295 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1296 char *config_height = tern_find_path(config, "video\0height\0", TVAL_PTR).ptrval;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1297 if (config_height) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1298 windowed_height = atoi(config_height);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1299 } else {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1300 float aspect = config_aspect() > 0.0f ? config_aspect() : 4.0f/3.0f;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1301 windowed_height = ((float)windowed_width / aspect) + 0.5f;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1302 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1303 char *config_fullscreen = tern_find_path(config, "video\0fullscreen\0", TVAL_PTR).ptrval;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1304 is_fullscreen = config_fullscreen && !strcmp("on", config_fullscreen);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1305 if (is_fullscreen) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1306 SDL_DisplayMode mode;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1307 //TODO: Multiple monitor support
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1308 SDL_GetCurrentDisplayMode(0, &mode);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1309 main_width = mode.w;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1310 main_height = mode.h;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1311 } else {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1312 main_width = windowed_width;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1313 main_height = windowed_height;
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1314 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1315
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1316 window_setup();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1317 update_aspect();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1318 #ifndef DISABLE_OPENGL
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1319 //need to check render_gl again after window_setup as render option could have changed
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1320 if (render_gl && on_context_created) {
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1321 on_context_created();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1322 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1323 #endif
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1324
1580
ea7d5ced2415 Fix deadlock when changing settings before loading first ROM
Michael Pavone <pavone@retrodev.com>
parents: 1574
diff changeset
1325 uint8_t was_paused = SDL_GetAudioStatus() == SDL_AUDIO_PAUSED;
ea7d5ced2415 Fix deadlock when changing settings before loading first ROM
Michael Pavone <pavone@retrodev.com>
parents: 1574
diff changeset
1326 render_close_audio();
ea7d5ced2415 Fix deadlock when changing settings before loading first ROM
Michael Pavone <pavone@retrodev.com>
parents: 1574
diff changeset
1327 quitting = 0;
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1328 init_audio();
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1329 render_set_video_standard(video_standard);
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1330
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1331 double lowpass_cutoff = get_lowpass_cutoff(config);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1332 double rc = (1.0 / lowpass_cutoff) / (2.0 * M_PI);
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1333 lock_audio();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1334 for (uint8_t i = 0; i < num_audio_sources; i++)
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1335 {
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1336 update_source(audio_sources[i], rc, old_sync_to_audio != sync_to_audio);
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1337 }
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1338 unlock_audio();
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1339 for (uint8_t i = 0; i < num_inactive_audio_sources; i++)
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1340 {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1341 update_source(inactive_audio_sources[i], rc, old_sync_to_audio != sync_to_audio);
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1342 }
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1343 drain_events();
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1344 in_toggle = 0;
1590
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1345 if (!was_paused) {
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1346 SDL_PauseAudio(0);
220ede292e97 Initial attempt at handling switches between sync modes at runtime. Needs work
Michael Pavone <pavone@retrodev.com>
parents: 1589
diff changeset
1347 }
1573
a051d8ee4528 Only save config file if something has changed. Re-initialize audio and video with new settings if config has changed
Michael Pavone <pavone@retrodev.com>
parents: 1567
diff changeset
1348 }
719
019d27995e32 Upgrade to SDL 2.0 and drop support for the non-OpenGL render path
Michael Pavone <pavone@retrodev.com>
parents: 655
diff changeset
1349
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1350 SDL_Window *render_get_window(void)
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1351 {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1352 return main_window;
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1353 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1354
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1355 void render_set_video_standard(vid_std std)
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1356 {
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1357 video_standard = std;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1358 source_hz = std == VID_PAL ? 50 : 60;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1359 uint32_t max_repeat = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1360 if (abs(source_hz - display_hz) < 2) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1361 memset(frame_repeat, 0, sizeof(int)*display_hz);
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1362 } else {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1363 int inc = display_hz * 100000 / source_hz;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1364 int accum = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1365 int dst_frames = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1366 for (int src_frame = 0; src_frame < source_hz; src_frame++)
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1367 {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1368 frame_repeat[src_frame] = -1;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1369 accum += inc;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1370 while (accum > 100000)
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1371 {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1372 accum -= 100000;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1373 frame_repeat[src_frame]++;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1374 max_repeat = frame_repeat[src_frame] > max_repeat ? frame_repeat[src_frame] : max_repeat;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1375 dst_frames++;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1376 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1377 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1378 if (dst_frames != display_hz) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1379 frame_repeat[source_hz-1] += display_hz - dst_frames;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1380 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1381 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1382 source_frame = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1383 source_frame_count = frame_repeat[0];
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1384 //sync samples with audio thread approximately every 8 lines
1686
475e84bfccbb Small fix to sync sample calculation in render_sdl
Michael Pavone <pavone@retrodev.com>
parents: 1684
diff changeset
1385 sync_samples = sync_to_audio ? buffer_samples : 8 * sample_rate / (source_hz * (std == VID_PAL ? 313 : 262));
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1386 max_repeat++;
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1387 min_buffered = (((float)max_repeat * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1388 //min_buffered *= buffer_samples;
1565
61fafcbc2c38 Audio DRC now sounds good in both NTSC and PAL, just need to adjust constants to minimize latency without leading to dropouts
Michael Pavone <pavone@retrodev.com>
parents: 1564
diff changeset
1389 printf("Min samples buffered before audio start: %d\n", min_buffered);
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1390 max_adjust = BASE_MAX_ADJUST / source_hz;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1391 }
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1392
874
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1393 void render_update_caption(char *title)
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1394 {
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1395 caption = title;
1068
624696318b5b Fix a memory corruption bug from failing to grow the buffer for the window caption when switching games
Michael Pavone <pavone@retrodev.com>
parents: 1033
diff changeset
1396 free(fps_caption);
624696318b5b Fix a memory corruption bug from failing to grow the buffer for the window caption when switching games
Michael Pavone <pavone@retrodev.com>
parents: 1033
diff changeset
1397 fps_caption = NULL;
874
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1398 }
b6842dfb8edf ROM is now run after being selected in menu. Initial path for menu is read from config file.
Michael Pavone <pavone@retrodev.com>
parents: 816
diff changeset
1399
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1400 static char *screenshot_path;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1401 void render_save_screenshot(char *path)
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1402 {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1403 if (screenshot_path) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1404 free(screenshot_path);
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1405 }
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1406 screenshot_path = path;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1407 }
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1408
1649
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
1409 uint8_t render_create_window(char *caption, uint32_t width, uint32_t height, window_close_handler close_handler)
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1410 {
1642
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1411 uint8_t win_idx = 0xFF;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1412 for (int i = 0; i < num_textures - FRAMEBUFFER_USER_START; i++)
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1413 {
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1414 if (!extra_windows[i]) {
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1415 win_idx = i;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1416 break;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1417 }
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1418 }
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1419
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1420 if (win_idx == 0xFF) {
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1421 num_textures++;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1422 sdl_textures = realloc(sdl_textures, num_textures * sizeof(*sdl_textures));
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1423 extra_windows = realloc(extra_windows, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_windows));
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1424 extra_renderers = realloc(extra_renderers, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*extra_renderers));
1649
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
1425 close_handlers = realloc(close_handlers, (num_textures - FRAMEBUFFER_USER_START) * sizeof(*close_handlers));
1642
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1426 win_idx = num_textures - FRAMEBUFFER_USER_START - 1;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1427 }
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1428 extra_windows[win_idx] = SDL_CreateWindow(caption, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, 0);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1429 if (!extra_windows[win_idx]) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1430 goto fail_window;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1431 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1432 extra_renderers[win_idx] = SDL_CreateRenderer(extra_windows[win_idx], -1, SDL_RENDERER_ACCELERATED);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1433 if (!extra_renderers[win_idx]) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1434 goto fail_renderer;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1435 }
1642
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1436 uint8_t texture_idx = win_idx + FRAMEBUFFER_USER_START;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1437 sdl_textures[texture_idx] = SDL_CreateTexture(extra_renderers[win_idx], SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1438 if (!sdl_textures[texture_idx]) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1439 goto fail_texture;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1440 }
1649
b500e971da75 Allow closing VDP debug windows with the close button in the window title bar
Michael Pavone <pavone@retrodev.com>
parents: 1642
diff changeset
1441 close_handlers[win_idx] = close_handler;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1442 return texture_idx;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1443
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1444 fail_texture:
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1445 SDL_DestroyRenderer(extra_renderers[win_idx]);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1446 fail_renderer:
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1447 SDL_DestroyWindow(extra_windows[win_idx]);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1448 fail_window:
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1449 num_textures--;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1450 return 0;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1451 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1452
1642
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1453 void render_destroy_window(uint8_t which)
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1454 {
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1455 uint8_t win_idx = which - FRAMEBUFFER_USER_START;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1456 //Destroying the renderers also frees the textures
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1457 SDL_DestroyRenderer(extra_renderers[win_idx]);
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1458 SDL_DestroyWindow(extra_windows[win_idx]);
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1459
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1460 extra_renderers[win_idx] = NULL;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1461 extra_windows[win_idx] = NULL;
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1462 }
c6b2c0f8cc61 Implemented support for toggling off a debug view
Michael Pavone <pavone@retrodev.com>
parents: 1635
diff changeset
1463
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1464 uint32_t *locked_pixels;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1465 uint32_t locked_pitch;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1466 uint32_t *render_get_framebuffer(uint8_t which, int *pitch)
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1467 {
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1468 #ifndef DISABLE_OPENGL
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1469 if (render_gl && which <= FRAMEBUFFER_EVEN) {
1267
3772bb926be5 Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
Michael Pavone <pavone@retrodev.com>
parents: 1263
diff changeset
1470 *pitch = LINEBUF_SIZE * sizeof(uint32_t);
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1471 return texture_buf;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1472 } else {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1473 #endif
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1474 if (which >= num_textures) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1475 warning("Request for invalid framebuffer number %d\n", which);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1476 return NULL;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1477 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1478 void *pixels;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1479 if (SDL_LockTexture(sdl_textures[which], NULL, &pixels, pitch) < 0) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1480 warning("Failed to lock texture: %s\n", SDL_GetError());
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1481 return NULL;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1482 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1483 static uint8_t last;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1484 if (which <= FRAMEBUFFER_EVEN) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1485 locked_pixels = pixels;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1486 if (which == FRAMEBUFFER_EVEN) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1487 pixels += *pitch;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1488 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1489 locked_pitch = *pitch;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1490 if (which != last) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1491 *pitch *= 2;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1492 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1493 last = which;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1494 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1495 return pixels;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1496 #ifndef DISABLE_OPENGL
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1497 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1498 #endif
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1499 }
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
1500
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1501 uint8_t events_processed;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1502 #ifdef __ANDROID__
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1503 #define FPS_INTERVAL 10000
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1504 #else
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1505 #define FPS_INTERVAL 1000
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1506 #endif
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1507
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1508 static uint32_t last_width, last_height;
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1509 static uint8_t interlaced;
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1510 void render_framebuffer_updated(uint8_t which, int width)
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1511 {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1512 static uint8_t last;
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1513 if (!sync_to_audio && which <= FRAMEBUFFER_EVEN && source_frame_count < 0) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1514 source_frame++;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1515 if (source_frame >= source_hz) {
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1516 source_frame = 0;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1517 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1518 source_frame_count = frame_repeat[source_frame];
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1519 //TODO: Figure out what to do about SDL Render API texture locking
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1520 return;
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1521 }
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1522
1398
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1523 last_width = width;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1524 uint32_t height = which <= FRAMEBUFFER_EVEN
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1525 ? (video_standard == VID_NTSC ? 243 : 294) - (overscan_top[video_standard] + overscan_bot[video_standard])
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1526 : 240;
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1527 FILE *screenshot_file = NULL;
1336
baaf05fd64c4 Make internal screenshot functionality completely ignore overscan settings rather than only doing it for the height
Michael Pavone <pavone@retrodev.com>
parents: 1328
diff changeset
1528 uint32_t shot_height, shot_width;
1532
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1529 char *ext;
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1530 if (screenshot_path && which == FRAMEBUFFER_ODD) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1531 screenshot_file = fopen(screenshot_path, "wb");
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1532 if (screenshot_file) {
1532
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1533 #ifndef DISABLE_ZLIB
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1534 ext = path_extension(screenshot_path);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1535 #endif
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1536 info_message("Saving screenshot to %s\n", screenshot_path);
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1537 } else {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1538 warning("Failed to open screenshot file %s for writing\n", screenshot_path);
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1539 }
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1540 free(screenshot_path);
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1541 screenshot_path = NULL;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1542 shot_height = video_standard == VID_NTSC ? 243 : 294;
1336
baaf05fd64c4 Make internal screenshot functionality completely ignore overscan settings rather than only doing it for the height
Michael Pavone <pavone@retrodev.com>
parents: 1328
diff changeset
1543 shot_width = width;
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1544 }
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1545 interlaced = last != which;
1336
baaf05fd64c4 Make internal screenshot functionality completely ignore overscan settings rather than only doing it for the height
Michael Pavone <pavone@retrodev.com>
parents: 1328
diff changeset
1546 width -= overscan_left[video_standard] + overscan_right[video_standard];
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1547 #ifndef DISABLE_OPENGL
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1548 if (render_gl && which <= FRAMEBUFFER_EVEN) {
1633
9b7cba9ba541 Use SDL_GL_MakeCurrent to make the SDL renderer API windows play nice with GL windows
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
1549 SDL_GL_MakeCurrent(main_window, main_context);
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1550 glBindTexture(GL_TEXTURE_2D, textures[which]);
1658
fa9ae059e4d3 Added support for GLES in addition to desktop GL
Mike Pavone <pavone@retrodev.com>
parents: 1649
diff changeset
1551 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, LINEBUF_SIZE, height, SRC_FORMAT, GL_UNSIGNED_BYTE, texture_buf + overscan_left[video_standard] + LINEBUF_SIZE * overscan_top[video_standard]);
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1552
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1553 if (screenshot_file) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1554 //properly supporting interlaced modes here is non-trivial, so only save the odd field for now
1532
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1555 #ifndef DISABLE_ZLIB
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1556 if (!strcasecmp(ext, "png")) {
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1557 free(ext);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1558 save_png(screenshot_file, texture_buf, shot_width, shot_height, LINEBUF_SIZE*sizeof(uint32_t));
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1559 } else {
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1560 free(ext);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1561 #endif
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1562 save_ppm(screenshot_file, texture_buf, shot_width, shot_height, LINEBUF_SIZE*sizeof(uint32_t));
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1563 #ifndef DISABLE_ZLIB
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1564 }
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1565 #endif
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1566 }
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1567 } else {
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1568 #endif
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1569 if (which <= FRAMEBUFFER_EVEN && last != which) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1570 uint8_t *cur_dst = (uint8_t *)locked_pixels;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1571 uint8_t *cur_saved = (uint8_t *)texture_buf;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1572 uint32_t dst_off = which == FRAMEBUFFER_EVEN ? 0 : locked_pitch;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1573 uint32_t src_off = which == FRAMEBUFFER_EVEN ? locked_pitch : 0;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1167
diff changeset
1574 for (int i = 0; i < height; ++i)
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1575 {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1576 //copy saved line from other field
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1577 memcpy(cur_dst + dst_off, cur_saved, locked_pitch);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1578 //save line from this field to buffer for next frame
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1579 memcpy(cur_saved, cur_dst + src_off, locked_pitch);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1580 cur_dst += locked_pitch * 2;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1581 cur_saved += locked_pitch;
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1582 }
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1583 height = 480;
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1584 }
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1585 if (screenshot_file) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1586 uint32_t shot_pitch = locked_pitch;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1587 if (which == FRAMEBUFFER_EVEN) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1588 shot_height *= 2;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1589 } else {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1590 shot_pitch *= 2;
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1591 }
1532
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1592 #ifndef DISABLE_ZLIB
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1593 if (!strcasecmp(ext, "png")) {
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1594 free(ext);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1595 save_png(screenshot_file, locked_pixels, shot_width, shot_height, shot_pitch);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1596 } else {
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1597 free(ext);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1598 #endif
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1599 save_ppm(screenshot_file, locked_pixels, shot_width, shot_height, shot_pitch);
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1600 #ifndef DISABLE_ZLIB
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1601 }
b505083dcd87 Added png screenshot support
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1602 #endif
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1603 }
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1604 SDL_UnlockTexture(sdl_textures[which]);
798
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1605 #ifndef DISABLE_OPENGL
062a2199daf6 Use SDL2 renderer as a fallback
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 797
diff changeset
1606 }
797
65181c3ee560 Add pure SDL2 renderer
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents: 766
diff changeset
1607 #endif
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1608 last_height = height;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1609 if (which <= FRAMEBUFFER_EVEN) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1610 render_update_display();
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1611 } else {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1612 SDL_RenderCopy(extra_renderers[which - FRAMEBUFFER_USER_START], sdl_textures[which], NULL, NULL);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1613 SDL_RenderPresent(extra_renderers[which - FRAMEBUFFER_USER_START]);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1614 }
1263
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1615 if (screenshot_file) {
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1616 fclose(screenshot_file);
5f65a16c23ff Implement raw screenshot functionality requested in ticket:10
Michael Pavone <pavone@retrodev.com>
parents: 1258
diff changeset
1617 }
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1618 if (which <= FRAMEBUFFER_EVEN) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1619 last = which;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1620 static uint32_t frame_counter, start;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1621 frame_counter++;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1622 last_frame= SDL_GetTicks();
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1623 if ((last_frame - start) > FPS_INTERVAL) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1624 if (start && (last_frame-start)) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1625 #ifdef __ANDROID__
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1626 info_message("%s - %.1f fps", caption, ((float)frame_counter) / (((float)(last_frame-start)) / 1000.0));
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1627 #else
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1628 if (!fps_caption) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1629 fps_caption = malloc(strlen(caption) + strlen(" - 100000000.1 fps") + 1);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1630 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1631 sprintf(fps_caption, "%s - %.1f fps", caption, ((float)frame_counter) / (((float)(last_frame-start)) / 1000.0));
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1632 SDL_SetWindowTitle(main_window, fps_caption);
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1633 #endif
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1634 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1635 start = last_frame;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1636 frame_counter = 0;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1637 }
449
7696d824489d Started work on OpenGL support in new branch
Mike Pavone <pavone@retrodev.com>
parents: 426
diff changeset
1638 }
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1639 if (!sync_to_audio) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1640 int32_t local_cur_min, local_min_remaining;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1641 SDL_LockAudio();
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1642 if (last_buffered > NO_LAST_BUFFERED) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1643 average_change *= 0.9f;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1644 average_change += (cur_min_buffered - last_buffered) * 0.1f;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1645 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1646 local_cur_min = cur_min_buffered;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1647 local_min_remaining = min_remaining_buffer;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1648 last_buffered = cur_min_buffered;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1649 SDL_UnlockAudio();
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1650 float frames_to_problem;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1651 if (average_change < 0) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1652 frames_to_problem = (float)local_cur_min / -average_change;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1653 } else {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1654 frames_to_problem = (float)local_min_remaining / average_change;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1655 }
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1656 float adjust_ratio = 0.0f;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1657 if (
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1658 frames_to_problem < BUFFER_FRAMES_THRESHOLD
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1659 || (average_change < 0 && local_cur_min < 3*min_buffered / 4)
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1660 || (average_change >0 && local_cur_min > 5 * min_buffered / 4)
1635
022d01b64496 Fix edge case in DRC audio path
Michael Pavone <pavone@retrodev.com>
parents: 1633
diff changeset
1661 || cur_min_buffered < 0
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1662 ) {
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1663
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1664 if (cur_min_buffered < 0) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1665 adjust_ratio = max_adjust;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1666 SDL_PauseAudio(1);
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1667 last_buffered = NO_LAST_BUFFERED;
1589
780604a036e4 Limit underflow warning spam
Michael Pavone <pavone@retrodev.com>
parents: 1588
diff changeset
1668 cur_min_buffered = 0;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1669 } else {
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1670 adjust_ratio = -1.0 * average_change / ((float)sample_rate / (float)source_hz);
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1671 adjust_ratio /= 2.5 * source_hz;
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1672 if (fabsf(adjust_ratio) > max_adjust) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1673 adjust_ratio = adjust_ratio > 0 ? max_adjust : -max_adjust;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1674 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1675 }
1567
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1676 } else if (local_cur_min < min_buffered / 2) {
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1677 adjust_ratio = max_adjust;
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1678 }
66387b1645e4 Audio DRC seems to be working pretty well now. Removed debug printfs
Michael Pavone <pavone@retrodev.com>
parents: 1566
diff changeset
1679 if (adjust_ratio != 0.0f) {
1566
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1680 average_change = 0;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1681 for (uint8_t i = 0; i < num_audio_sources; i++)
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1682 {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1683 audio_sources[i]->buffer_inc = ((double)audio_sources[i]->buffer_inc) + ((double)audio_sources[i]->buffer_inc) * adjust_ratio + 0.5;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1684 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1685 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1686 while (source_frame_count > 0)
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1687 {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1688 render_update_display();
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1689 source_frame_count--;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1690 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1691 source_frame++;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1692 if (source_frame >= source_hz) {
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1693 source_frame = 0;
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1694 }
cbb40af77a94 Moved resample rate adjustment to after frame flip rather than in audio callback as it makes more sense there. Needs adjustment to avoid audible pitch changes
Michael Pavone <pavone@retrodev.com>
parents: 1565
diff changeset
1695 source_frame_count = frame_repeat[source_frame];
1563
6a62434d6bb1 WIP dynamic rate control
Michael Pavone <pavone@retrodev.com>
parents: 1562
diff changeset
1696 }
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1697 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1698
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1699 static ui_render_fun render_ui;
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1700 void render_set_ui_render_fun(ui_render_fun fun)
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1701 {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1702 render_ui = fun;
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1703 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1704
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1705 void render_update_display()
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1706 {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1707 #ifndef DISABLE_OPENGL
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1708 if (render_gl) {
1528
855210dca5b9 Set glClearColor back to black
Michael Pavone <pavone@retrodev.com>
parents: 1483
diff changeset
1709 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1474
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1710 glClear(GL_COLOR_BUFFER_BIT);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1711
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1712 glUseProgram(program);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1713 glActiveTexture(GL_TEXTURE0);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1714 glBindTexture(GL_TEXTURE_2D, textures[0]);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1715 glUniform1i(un_textures[0], 0);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1716
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1717 glActiveTexture(GL_TEXTURE1);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1718 glBindTexture(GL_TEXTURE_2D, textures[interlaced ? 1 : scanlines ? 2 : 0]);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1719 glUniform1i(un_textures[1], 1);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1720
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1721 glUniform1f(un_width, render_emulated_width());
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1722 glUniform1f(un_height, last_height);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1723
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1724 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1725 glVertexAttribPointer(at_pos, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat[2]), (void *)0);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1726 glEnableVertexAttribArray(at_pos);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1727
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1728 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1729 glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void *)0);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1730
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1731 glDisableVertexAttribArray(at_pos);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1732
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1733 if (render_ui) {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1734 render_ui();
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1735 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1736
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1737 SDL_GL_SwapWindow(main_window);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1738 } else {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1739 #endif
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1740 SDL_Rect src_clip = {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1741 .x = overscan_left[video_standard],
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1742 .y = overscan_top[video_standard],
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1743 .w = render_emulated_width(),
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1744 .h = last_height
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1745 };
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1746 SDL_SetRenderDrawColor(main_renderer, 0, 0, 0, 255);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1747 SDL_RenderClear(main_renderer);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1748 SDL_RenderCopy(main_renderer, sdl_textures[FRAMEBUFFER_ODD], &src_clip, &main_clip);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1749 if (render_ui) {
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1750 render_ui();
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1751 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1752 SDL_RenderPresent(main_renderer);
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1753 #ifndef DISABLE_OPENGL
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1754 }
c5c022c7aa54 Initial work on Nuklear-based UI
Michael Pavone <pavone@retrodev.com>
parents: 1441
diff changeset
1755 #endif
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1756 if (!events_processed) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1757 process_events();
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1758 }
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1759 events_processed = 0;
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1760 }
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1761
1398
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1762 uint32_t render_emulated_width()
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1763 {
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1764 return last_width - overscan_left[video_standard] - overscan_right[video_standard];
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1765 }
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1766
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1767 uint32_t render_emulated_height()
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1768 {
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1769 return (video_standard == VID_NTSC ? 243 : 294) - overscan_top[video_standard] - overscan_bot[video_standard];
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1770 }
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1771
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1772 uint32_t render_overscan_left()
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1773 {
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1774 return overscan_left[video_standard];
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1775 }
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1776
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1777 uint32_t render_overscan_top()
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1778 {
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1779 return overscan_top[video_standard];
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1780 }
08116cb5ffaa Fix absolute mouse mode when non-default overscan settings are used
Michael Pavone <pavone@retrodev.com>
parents: 1397
diff changeset
1781
43
3fc57e1a2c56 Add debug render mode and fix vertical flip bit for bg tiles
Mike Pavone <pavone@retrodev.com>
parents: 33
diff changeset
1782 void render_wait_quit(vdp_context * context)
20
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1783 {
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1784 SDL_Event event;
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1785 while(SDL_WaitEvent(&event)) {
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1786 switch (event.type) {
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1787 case SDL_QUIT:
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1788 return;
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1789 }
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1790 }
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1791 }
f664eeb55cb4 Mostly broken VDP core and savestate viewer
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1792
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1793 int render_lookup_button(char *name)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1794 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1795 static tern_node *button_lookup;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1796 if (!button_lookup) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1797 for (int i = SDL_CONTROLLER_BUTTON_A; i < SDL_CONTROLLER_BUTTON_MAX; i++)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1798 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1799 button_lookup = tern_insert_int(button_lookup, SDL_GameControllerGetStringForButton(i), i);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1800 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1801 //alternative Playstation-style names
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1802 button_lookup = tern_insert_int(button_lookup, "cross", SDL_CONTROLLER_BUTTON_A);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1803 button_lookup = tern_insert_int(button_lookup, "circle", SDL_CONTROLLER_BUTTON_B);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1804 button_lookup = tern_insert_int(button_lookup, "square", SDL_CONTROLLER_BUTTON_X);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1805 button_lookup = tern_insert_int(button_lookup, "triangle", SDL_CONTROLLER_BUTTON_Y);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1806 button_lookup = tern_insert_int(button_lookup, "share", SDL_CONTROLLER_BUTTON_BACK);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1807 button_lookup = tern_insert_int(button_lookup, "select", SDL_CONTROLLER_BUTTON_BACK);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1808 button_lookup = tern_insert_int(button_lookup, "options", SDL_CONTROLLER_BUTTON_START);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1809 button_lookup = tern_insert_int(button_lookup, "l1", SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1810 button_lookup = tern_insert_int(button_lookup, "r1", SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1811 button_lookup = tern_insert_int(button_lookup, "l3", SDL_CONTROLLER_BUTTON_LEFTSTICK);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1812 button_lookup = tern_insert_int(button_lookup, "r3", SDL_CONTROLLER_BUTTON_RIGHTSTICK);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1813 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1814 return (int)tern_find_int(button_lookup, name, SDL_CONTROLLER_BUTTON_INVALID);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1815 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1816
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1817 int render_lookup_axis(char *name)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1818 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1819 static tern_node *axis_lookup;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1820 if (!axis_lookup) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1821 for (int i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1822 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1823 axis_lookup = tern_insert_int(axis_lookup, SDL_GameControllerGetStringForAxis(i), i);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1824 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1825 //alternative Playstation-style names
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1826 axis_lookup = tern_insert_int(axis_lookup, "l2", SDL_CONTROLLER_AXIS_TRIGGERLEFT);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1827 axis_lookup = tern_insert_int(axis_lookup, "r2", SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1828 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1829 return (int)tern_find_int(axis_lookup, name, SDL_CONTROLLER_AXIS_INVALID);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1830 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1831
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1832 int32_t render_translate_input_name(int32_t controller, char *name, uint8_t is_axis)
1187
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1833 {
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1834 tern_node *button_lookup, *axis_lookup;
1187
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1835 if (controller > MAX_JOYSTICKS || !joysticks[controller]) {
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1836 return RENDER_NOT_PLUGGED_IN;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1837 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1838
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1839 if (!SDL_IsGameController(joystick_sdl_index[controller])) {
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1840 return RENDER_NOT_MAPPED;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1841 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1842 SDL_GameController *control = SDL_GameControllerOpen(joystick_sdl_index[controller]);
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1843 if (!control) {
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1844 warning("Failed to open game controller %d: %s\n", controller, SDL_GetError());
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1845 return RENDER_NOT_PLUGGED_IN;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1846 }
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1847
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1848 SDL_GameControllerButtonBind cbind;
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1849 if (is_axis) {
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1850
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1851 int sdl_axis = render_lookup_axis(name);
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1852 if (sdl_axis == SDL_CONTROLLER_AXIS_INVALID) {
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1853 SDL_GameControllerClose(control);
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1854 return RENDER_INVALID_NAME;
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1855 }
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1856 cbind = SDL_GameControllerGetBindForAxis(control, sdl_axis);
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1857 } else {
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
1858 int sdl_button = render_lookup_button(name);
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1859 if (sdl_button == SDL_CONTROLLER_BUTTON_INVALID) {
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1860 SDL_GameControllerClose(control);
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1861 return RENDER_INVALID_NAME;
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1862 }
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1863 cbind = SDL_GameControllerGetBindForButton(control, sdl_button);
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1864 }
1187
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1865 SDL_GameControllerClose(control);
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1866 switch (cbind.bindType)
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1867 {
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1868 case SDL_CONTROLLER_BINDTYPE_BUTTON:
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1869 return cbind.value.button;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1870 case SDL_CONTROLLER_BINDTYPE_AXIS:
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1871 return RENDER_AXIS_BIT | cbind.value.axis;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1872 case SDL_CONTROLLER_BINDTYPE_HAT:
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1873 return RENDER_DPAD_BIT | (cbind.value.hat.hat << 4) | cbind.value.hat.hat_mask;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1874 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1875 return RENDER_NOT_MAPPED;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1876 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1877
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1878 int32_t render_dpad_part(int32_t input)
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1879 {
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1880 return input >> 4 & 0xFFFFFF;
1187
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1881 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1882
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1883 uint8_t render_direction_part(int32_t input)
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1884 {
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1885 return input & 0xF;
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1886 }
6a4503fad67e Initial support for using SDL2 game controller mapping functionality
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1887
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1888 int32_t render_axis_part(int32_t input)
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1889 {
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1890 return input & 0xFFFFFFF;
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1891 }
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1205
diff changeset
1892
409
c1bddeadc566 Process events in vgm player so that quitting works
Mike Pavone <pavone@retrodev.com>
parents: 398
diff changeset
1893 void process_events()
c1bddeadc566 Process events in vgm player so that quitting works
Mike Pavone <pavone@retrodev.com>
parents: 398
diff changeset
1894 {
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1895 if (events_processed > MAX_EVENT_POLL_PER_FRAME) {
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1896 return;
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1074
diff changeset
1897 }
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1898 drain_events();
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1899 events_processed++;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1900 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1901
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1902 #define TOGGLE_MIN_DELAY 250
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1903 void render_toggle_fullscreen()
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1904 {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1905 //protect against event processing causing us to attempt to toggle while still toggling
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1906 if (in_toggle) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1907 return;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1908 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1909 in_toggle = 1;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1910
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1911 //toggling too fast seems to cause a deadlock
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1912 static uint32_t last_toggle;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1913 uint32_t cur = SDL_GetTicks();
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1914 if (last_toggle && cur - last_toggle < TOGGLE_MIN_DELAY) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1915 in_toggle = 0;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1916 return;
409
c1bddeadc566 Process events in vgm player so that quitting works
Mike Pavone <pavone@retrodev.com>
parents: 398
diff changeset
1917 }
1202
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1918 last_toggle = cur;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1919
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1920 drain_events();
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1921 is_fullscreen = !is_fullscreen;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1922 if (is_fullscreen) {
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1923 SDL_DisplayMode mode;
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1924 //TODO: Multiple monitor support
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1925 SDL_GetCurrentDisplayMode(0, &mode);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1926 //In theory, the SDL2 docs suggest this is unnecessary
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1927 //but without it the OpenGL context remains the original size
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1928 //This needs to happen before the fullscreen transition to have any effect
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1929 //because SDL does not apply window size changes in fullscreen
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1930 SDL_SetWindowSize(main_window, mode.w, mode.h);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1931 }
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1932 SDL_SetWindowFullscreen(main_window, is_fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1933 //Since we change the window size on transition to full screen
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1934 //we need to set it back to normal so we can also go back to windowed mode
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1935 //normally you would think that this should only be done when actually transitioning
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1936 //but something is screwy in the guts of SDL (at least on Linux) and setting it each time
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1937 //is the only thing that seems to work reliably
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1938 //when we've just switched to fullscreen mode this should be harmless though
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1939 SDL_SetWindowSize(main_window, windowed_width, windowed_height);
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1940 drain_events();
a6ae693974e0 Allow toggling full screen mode at runtime. Allow resizing the window in windowed mode. Allow specifying the aspect ratio in the config file.
Michael Pavone <pavone@retrodev.com>
parents: 1198
diff changeset
1941 in_toggle = 0;
409
c1bddeadc566 Process events in vgm player so that quitting works
Mike Pavone <pavone@retrodev.com>
parents: 398
diff changeset
1942 }
c1bddeadc566 Process events in vgm player so that quitting works
Mike Pavone <pavone@retrodev.com>
parents: 398
diff changeset
1943
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1944 uint32_t render_audio_buffer()
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1945 {
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1946 return buffer_samples;
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1947 }
342
13f994c88c34 Get frame time correct and frame rate sort of correct for EUR region
Mike Pavone <pavone@retrodev.com>
parents: 340
diff changeset
1948
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1949 uint32_t render_sample_rate()
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1950 {
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1951 return sample_rate;
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1952 }
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1953
792
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1954 void render_errorbox(char *title, char *message)
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1955 {
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1956 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, NULL);
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1957 }
354
15dd6418fe67 Initial PSG support. Mostly works, noise channel is borked though.
Mike Pavone <pavone@retrodev.com>
parents: 342
diff changeset
1958
792
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1959 void render_warnbox(char *title, char *message)
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1960 {
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1961 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, title, message, NULL);
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1962 }
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1963
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1964 void render_infobox(char *title, char *message)
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1965 {
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1966 SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, title, message, NULL);
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1967 }
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 766
diff changeset
1968
1482
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1969 uint32_t render_elapsed_ms(void)
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1970 {
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1971 return SDL_GetTicks();
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1972 }
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1973
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1974 void render_sleep_ms(uint32_t delay)
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1975 {
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1976 return SDL_Delay(delay);
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1977 }
2d203bf73dbd Avoid burning a huge amount of CPU in the menu when emulation is not running and vsync is disabled
Michael Pavone <pavone@retrodev.com>
parents: 1476
diff changeset
1978
1483
001120e91fed Skip loading menu ROM if Nuklear UI is enabled. Allow disabling Nuklear UI in favor of old menu ROM both at compile time and in config. Fall back to ROM UI if GL is unavailable
Michael Pavone <pavone@retrodev.com>
parents: 1482
diff changeset
1979 uint8_t render_has_gl(void)
001120e91fed Skip loading menu ROM if Nuklear UI is enabled. Allow disabling Nuklear UI in favor of old menu ROM both at compile time and in config. Fall back to ROM UI if GL is unavailable
Michael Pavone <pavone@retrodev.com>
parents: 1482
diff changeset
1980 {
001120e91fed Skip loading menu ROM if Nuklear UI is enabled. Allow disabling Nuklear UI in favor of old menu ROM both at compile time and in config. Fall back to ROM UI if GL is unavailable
Michael Pavone <pavone@retrodev.com>
parents: 1482
diff changeset
1981 return render_gl;
001120e91fed Skip loading menu ROM if Nuklear UI is enabled. Allow disabling Nuklear UI in favor of old menu ROM both at compile time and in config. Fall back to ROM UI if GL is unavailable
Michael Pavone <pavone@retrodev.com>
parents: 1482
diff changeset
1982 }
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1983
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1984 uint8_t render_get_active_framebuffer(void)
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1985 {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1986 if (SDL_GetWindowFlags(main_window) & SDL_WINDOW_INPUT_FOCUS) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1987 return FRAMEBUFFER_ODD;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1988 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1989 for (int i = 0; i < num_textures - 2; i++)
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1990 {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1991 if (extra_windows[i] && (SDL_GetWindowFlags(extra_windows[i]) & SDL_WINDOW_INPUT_FOCUS)) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1992 return FRAMEBUFFER_USER_START + i;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1993 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1994 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1995 return 0xFF;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
1996 }