annotate render_fbdev.c @ 1863:d60f2d7c02a5

Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
author Michael Pavone <pavone@retrodev.com>
date Tue, 14 May 2019 23:20:35 -0700
parents 2b661c1e431f
children 2fd0a8cb1c80
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 /*
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 Copyright 2013 Michael Pavone
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 This file is part of BlastEm.
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
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.
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 */
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include <stdlib.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdio.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <string.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include <math.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include <linux/fb.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include <linux/input.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #include <linux/kd.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #include <alsa/asoundlib.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 #include <sys/types.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 #include <sys/stat.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 #include <sys/ioctl.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 #include <sys/mman.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 #include <fcntl.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 #include <unistd.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 #include <pthread.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 #include <dirent.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 #include "render.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 #include "blastem.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 #include "genesis.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 #include "bindings.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 #include "util.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 #include "paths.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 #include "ppm.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 #include "png.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 #include "config.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 #include "controller_info.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 #include <EGL/egl.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 #include <GLES2/gl2.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 #ifdef USE_MALI
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 //Mali GLES headers don't seem to define GLchar for some reason
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 typedef char GLchar;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 #define MAX_EVENT_POLL_PER_FRAME 2
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 static EGLContext main_context;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 static int main_width, main_height, windowed_width, windowed_height, is_fullscreen;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 static uint8_t render_gl = 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 static uint8_t scanlines = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 static uint32_t last_frame = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 static snd_pcm_uframes_t buffer_samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 static unsigned int output_channels, sample_rate;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 static uint32_t missing_count;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 static uint8_t quitting = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 struct audio_source {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 int16_t *front;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 int16_t *back;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 double dt;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 uint64_t buffer_fraction;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 uint64_t buffer_inc;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 uint32_t buffer_pos;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 uint32_t read_start;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 uint32_t read_end;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 uint32_t lowpass_alpha;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 uint32_t mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 int16_t last_left;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 int16_t last_right;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 uint8_t num_channels;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 uint8_t front_populated;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 static audio_source *audio_sources[8];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 static audio_source *inactive_audio_sources[8];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 static uint8_t num_audio_sources;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 static uint8_t num_inactive_audio_sources;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 static uint32_t min_buffered;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 typedef int32_t (*mix_func)(audio_source *audio, void *vstream, int len);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 static int32_t mix_s16(audio_source *audio, void *vstream, int len)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 int samples = len/(sizeof(int16_t)*output_channels);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 int16_t *stream = vstream;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 int16_t *end = stream + output_channels*samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 int16_t *src = audio->front;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 uint32_t i = audio->read_start;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 uint32_t i_end = audio->read_end;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 int16_t *cur = stream;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 if (audio->num_channels == 1) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 while (cur < end && i != i_end)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 *cur += src[i];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 cur += first_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 *cur += src[i++];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 cur += second_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 i &= audio->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 while (cur < end && i != i_end)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 *cur += src[i++];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 cur += first_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 *cur += src[i++];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 cur += second_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 i &= audio->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 if (cur != end) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
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);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 if (cur != end) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 //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);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 return (cur-end)/2;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 return ((i_end - i) & audio->mask) / audio->num_channels;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 static int32_t mix_f32(audio_source *audio, void *vstream, int len)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 int samples = len/(sizeof(float)*output_channels);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 float *stream = vstream;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 float *end = stream + output_channels*samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 int16_t *src = audio->front;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 uint32_t i = audio->read_start;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 uint32_t i_end = audio->read_end;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 float *cur = stream;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 if (audio->num_channels == 1) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 while (cur < end && i != i_end)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 *cur += ((float)src[i]) / 0x7FFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 cur += first_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 *cur += ((float)src[i++]) / 0x7FFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 cur += second_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 i &= audio->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 while(cur < end && i != i_end)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 *cur += ((float)src[i++]) / 0x7FFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 cur += first_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 *cur += ((float)src[i++]) / 0x7FFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 cur += second_add;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 i &= audio->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 if (cur != end) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 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);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 return (cur-end)/2;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 return ((i_end - i) & audio->mask) / audio->num_channels;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 static int32_t mix_null(audio_source *audio, void *vstream, int len)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 static mix_func mix;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 static void render_close_audio()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 #define BUFFER_INC_RES 0x40000000UL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 src->buffer_inc = ((BUFFER_INC_RES * (uint64_t)sample_rate) / master_clock) * sample_divider;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 audio_source *render_audio_source(uint64_t master_clock, uint64_t sample_divider, uint8_t channels)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 audio_source *ret = NULL;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 uint32_t alloc_size = channels * buffer_samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 if (num_audio_sources < 8) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 ret = malloc(sizeof(audio_source));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 ret->back = malloc(alloc_size * sizeof(int16_t));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 ret->front = malloc(alloc_size * sizeof(int16_t));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 ret->front_populated = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 ret->num_channels = channels;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 audio_sources[num_audio_sources++] = ret;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 if (!ret) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 fatal_error("Too many audio sources!");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 render_audio_adjust_clock(ret, master_clock, sample_divider);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 double lowpass_cutoff = get_lowpass_cutoff(config);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 double rc = (1.0 / lowpass_cutoff) / (2.0 * M_PI);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 ret->dt = 1.0 / ((double)master_clock / (double)(sample_divider));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 double alpha = ret->dt / (ret->dt + rc);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 ret->lowpass_alpha = (int32_t)(((double)0x10000) * alpha);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 ret->buffer_pos = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 ret->buffer_fraction = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 ret->last_left = ret->last_right = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 ret->read_start = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 ret->read_end = buffer_samples * channels;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 ret->mask = 0xFFFFFFFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 return ret;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 void render_pause_source(audio_source *src)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 for (uint8_t i = 0; i < num_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 if (audio_sources[i] == src) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 audio_sources[i] = audio_sources[--num_audio_sources];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 inactive_audio_sources[num_inactive_audio_sources++] = src;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 void render_resume_source(audio_source *src)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 if (num_audio_sources < 8) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 audio_sources[num_audio_sources++] = src;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 for (uint8_t i = 0; i < num_inactive_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 if (inactive_audio_sources[i] == src) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 inactive_audio_sources[i] = inactive_audio_sources[--num_inactive_audio_sources];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 void render_free_source(audio_source *src)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 render_pause_source(src);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 free(src->front);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 free(src->back);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 free(src);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 snd_pcm_t *audio_handle;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 static void do_audio_ready(audio_source *src)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 if (src->front_populated) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249 fatal_error("Audio source filled up a buffer a second time before other sources finished their first\n");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 int16_t *tmp = src->front;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 src->front = src->back;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 src->back = tmp;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 src->front_populated = 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 src->buffer_pos = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 for (uint8_t i = 0; i < num_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 if (!audio_sources[i]->front_populated) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 //at least one audio source is not ready yet.
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 return;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 size_t bytes = (mix == mix_s16 ? sizeof(int16_t) : sizeof(float)) * output_channels * buffer_samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 void *buffer = malloc(bytes);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 for (uint8_t i = 0; i < num_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 mix(audio_sources[i], buffer, bytes);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 audio_sources[i]->front_populated = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 int frames = snd_pcm_writei(audio_handle, buffer, buffer_samples);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 if (frames < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 frames = snd_pcm_recover(audio_handle, frames, 0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 if (frames < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 fprintf(stderr, "Failed to write samples: %s\n", snd_strerror(frames));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 static int16_t lowpass_sample(audio_source *src, int16_t last, int16_t current)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 int32_t tmp = current * src->lowpass_alpha + last * (0x10000 - src->lowpass_alpha);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 current = tmp >> 16;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 return current;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 static void interp_sample(audio_source *src, int16_t last, int16_t current)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 int64_t tmp = last * ((src->buffer_fraction << 16) / src->buffer_inc);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 tmp += current * (0x10000 - ((src->buffer_fraction << 16) / src->buffer_inc));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 src->back[src->buffer_pos++] = tmp >> 16;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 void render_put_mono_sample(audio_source *src, int16_t value)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 value = lowpass_sample(src, src->last_left, value);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 src->buffer_fraction += src->buffer_inc;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 uint32_t base = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 while (src->buffer_fraction > BUFFER_INC_RES)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 src->buffer_fraction -= BUFFER_INC_RES;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 interp_sample(src, src->last_left, value);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 if (((src->buffer_pos - base) & src->mask) >= buffer_samples) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 do_audio_ready(src);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 src->buffer_pos &= src->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 src->last_left = value;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 void render_put_stereo_sample(audio_source *src, int16_t left, int16_t right)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 left = lowpass_sample(src, src->last_left, left);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 right = lowpass_sample(src, src->last_right, right);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 src->buffer_fraction += src->buffer_inc;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 uint32_t base = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 while (src->buffer_fraction > BUFFER_INC_RES)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 src->buffer_fraction -= BUFFER_INC_RES;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 interp_sample(src, src->last_left, left);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 interp_sample(src, src->last_right, right);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 if (((src->buffer_pos - base) & src->mask)/2 >= buffer_samples) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 do_audio_ready(src);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 src->buffer_pos &= src->mask;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 src->last_left = left;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 src->last_right = right;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 int render_width()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 return main_width;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 int render_height()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 return main_height;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 int render_fullscreen()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 return 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
349
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 uint32_t red_shift, blue_shift, green_shift;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 return r << red_shift | g << green_shift | b << blue_shift;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 static GLuint textures[3], buffers[2], vshader, fshader, program, un_textures[2], un_width, un_height, at_pos;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
359 static GLfloat vertex_data_default[] = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 -1.0f, -1.0f,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 1.0f, -1.0f,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 -1.0f, 1.0f,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 1.0f, 1.0f
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 static GLfloat vertex_data[8];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 static const GLushort element_data[] = {0, 1, 2, 3};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 static const GLchar shader_prefix[] =
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 #ifdef USE_GLES
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 "#version 100\n";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 #else
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 "#version 110\n"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 "#define lowp\n"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 "#define mediump\n"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 "#define highp\n";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 static GLuint load_shader(char * fname, GLenum shader_type)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 char const * parts[] = {get_home_dir(), "/.config/blastem/shaders/", fname};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 char * shader_path = alloc_concat_m(3, parts);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 FILE * f = fopen(shader_path, "rb");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 free(shader_path);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 GLchar * text;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387 long fsize;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 if (f) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 fsize = file_size(f);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 text = malloc(fsize);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 if (fread(text, 1, fsize, f) != fsize) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 warning("Error reading from shader file %s\n", fname);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 free(text);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 shader_path = path_append("shaders", fname);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 uint32_t fsize32;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 text = read_bundled_file(shader_path, &fsize32);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 free(shader_path);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 if (!text) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 warning("Failed to open shader file %s for reading\n", fname);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
405 fsize = fsize32;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 if (strncmp(text, "#version", strlen("#version"))) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 GLchar *tmp = text;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 text = alloc_concat(shader_prefix, tmp);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 free(tmp);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 fsize += strlen(shader_prefix);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 GLuint ret = glCreateShader(shader_type);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 glShaderSource(ret, 1, (const GLchar **)&text, (const GLint *)&fsize);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 free(text);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 glCompileShader(ret);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 GLint compile_status, loglen;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 glGetShaderiv(ret, GL_COMPILE_STATUS, &compile_status);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 if (!compile_status) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 glGetShaderiv(ret, GL_INFO_LOG_LENGTH, &loglen);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 text = malloc(loglen);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 glGetShaderInfoLog(ret, loglen, NULL, text);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 warning("Shader %s failed to compile:\n%s\n", fname, text);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 free(text);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 glDeleteShader(ret);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 return ret;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
433 #define MAX_FB_LINES 590
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
434 static uint32_t texture_buf[MAX_FB_LINES * LINEBUF_SIZE * 2];
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 #ifdef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 #define RENDER_FORMAT SDL_PIXELFORMAT_ARGB8888
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 #else
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 #ifdef USE_GLES
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 #define INTERNAL_FORMAT GL_RGBA
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 #define SRC_FORMAT GL_RGBA
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 #define RENDER_FORMAT SDL_PIXELFORMAT_ABGR8888
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 #else
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 #define INTERNAL_FORMAT GL_RGBA8
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 #define SRC_FORMAT GL_BGRA
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 #define RENDER_FORMAT SDL_PIXELFORMAT_ARGB8888
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 static void gl_setup()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 tern_val def = {.ptrval = "linear"};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 char *scaling = tern_find_path_default(config, "video\0scaling\0", def, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 GLint filter = strcmp(scaling, "linear") ? GL_NEAREST : GL_LINEAR;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 glGenTextures(3, textures);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 for (int i = 0; i < 3; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 glBindTexture(GL_TEXTURE_2D, textures[i]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 if (i < 2) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 //TODO: Fixme for PAL + invalid display mode
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, 512, 512, 0, SRC_FORMAT, GL_UNSIGNED_BYTE, texture_buf);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 uint32_t blank = 255 << 24;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, 1, 1, 0, SRC_FORMAT, GL_UNSIGNED_BYTE, &blank);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 glGenBuffers(2, buffers);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470 glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(element_data), element_data, GL_STATIC_DRAW);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 def.ptrval = "default.v.glsl";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 vshader = load_shader(tern_find_path_default(config, "video\0vertex_shader\0", def, TVAL_PTR).ptrval, GL_VERTEX_SHADER);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 def.ptrval = "default.f.glsl";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 fshader = load_shader(tern_find_path_default(config, "video\0fragment_shader\0", def, TVAL_PTR).ptrval, GL_FRAGMENT_SHADER);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 program = glCreateProgram();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 glAttachShader(program, vshader);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 glAttachShader(program, fshader);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 glLinkProgram(program);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 GLint link_status;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 glGetProgramiv(program, GL_LINK_STATUS, &link_status);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 if (!link_status) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 fputs("Failed to link shader program\n", stderr);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 exit(1);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 un_textures[0] = glGetUniformLocation(program, "textures[0]");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 un_textures[1] = glGetUniformLocation(program, "textures[1]");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 un_width = glGetUniformLocation(program, "width");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 un_height = glGetUniformLocation(program, "height");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 at_pos = glGetAttribLocation(program, "pos");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 static void gl_teardown()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 glDeleteProgram(program);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 glDeleteShader(vshader);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 glDeleteShader(fshader);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 glDeleteBuffers(2, buffers);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 glDeleteTextures(3, textures);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 static uint8_t texture_init;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 static void render_alloc_surfaces()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 if (texture_init) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 return;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 texture_init = 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 if (render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 gl_setup();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
516 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518 static void free_surfaces(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 texture_init = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523 static char * caption = NULL;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 static char * fps_caption = NULL;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 static void render_quit()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 render_close_audio();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 free_surfaces();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 if (render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 gl_teardown();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 //FIXME: replace with EGL equivalent
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 //SDL_GL_DeleteContext(main_context);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 static float config_aspect()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541 static float aspect = 0.0f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 if (aspect == 0.0f) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 char *config_aspect = tern_find_path_default(config, "video\0aspect\0", (tern_val){.ptrval = "4:3"}, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 if (strcmp("stretch", config_aspect)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 aspect = 4.0f/3.0f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 char *end;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 float aspect_numerator = strtof(config_aspect, &end);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 if (aspect_numerator > 0.0f && *end == ':') {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 float aspect_denominator = strtof(end+1, &end);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 if (aspect_denominator > 0.0f && !*end) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 aspect = aspect_numerator / aspect_denominator;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 aspect = -1.0f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
558 return aspect;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
559 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
560
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
561 static void update_aspect()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
562 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
563 //reset default values
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 memcpy(vertex_data, vertex_data_default, sizeof(vertex_data));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 if (config_aspect() > 0.0f) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
568 float aspect = (float)main_width / main_height;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 if (fabs(aspect - config_aspect()) < 0.01f) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 //close enough for government work
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
571 return;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574 if (render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575 for (int i = 0; i < 4; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
576 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 if (aspect > config_aspect()) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 vertex_data[i*2] *= config_aspect()/aspect;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
579 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580 vertex_data[i*2+1] *= aspect/config_aspect();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
584 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
585 //TODO: Maybe do some stuff for non-integer scaling in raw fbdev copy
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
588 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 static uint8_t scancode_map[128] = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593 [KEY_A] = 0x1C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 [KEY_B] = 0x32,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 [KEY_C] = 0x21,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 [KEY_D] = 0x23,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
597 [KEY_E] = 0x24,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
598 [KEY_F] = 0x2B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 [KEY_G] = 0x34,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
600 [KEY_H] = 0x33,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
601 [KEY_I] = 0x43,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
602 [KEY_J] = 0x3B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 [KEY_K] = 0x42,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
604 [KEY_L] = 0x4B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605 [KEY_M] = 0x3A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
606 [KEY_N] = 0x31,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
607 [KEY_O] = 0x44,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 [KEY_P] = 0x4D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
609 [KEY_Q] = 0x15,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
610 [KEY_R] = 0x2D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
611 [KEY_S] = 0x1B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
612 [KEY_T] = 0x2C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
613 [KEY_U] = 0x3C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
614 [KEY_V] = 0x2A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 [KEY_W] = 0x1D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
616 [KEY_X] = 0x22,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617 [KEY_Y] = 0x35,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
618 [KEY_Z] = 0x1A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
619 [KEY_1] = 0x16,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 [KEY_2] = 0x1E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 [KEY_3] = 0x26,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
622 [KEY_4] = 0x25,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
623 [KEY_5] = 0x2E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 [KEY_6] = 0x36,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 [KEY_7] = 0x3D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 [KEY_8] = 0x3E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627 [KEY_9] = 0x46,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
628 [KEY_0] = 0x45,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
629 [KEY_ENTER] = 0x5A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
630 [KEY_ESC] = 0x76,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
631 [KEY_SPACE] = 0x29,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
632 [KEY_TAB] = 0x0D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
633 [KEY_BACKSPACE] = 0x66,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
634 [KEY_MINUS] = 0x4E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
635 [KEY_EQUAL] = 0x55,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
636 [KEY_LEFTBRACE] = 0x54,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
637 [KEY_RIGHTBRACE] = 0x5B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
638 [KEY_BACKSLASH] = 0x5D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
639 [KEY_SEMICOLON] = 0x4C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
640 [KEY_APOSTROPHE] = 0x52,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
641 [KEY_GRAVE] = 0x0E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
642 [KEY_COMMA] = 0x41,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
643 [KEY_DOT] = 0x49,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
644 [KEY_SLASH] = 0x4A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
645 [KEY_CAPSLOCK] = 0x58,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 [KEY_F1] = 0x05,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
647 [KEY_F2] = 0x06,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 [KEY_F3] = 0x04,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 [KEY_F4] = 0x0C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
650 [KEY_F5] = 0x03,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
651 [KEY_F6] = 0x0B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 [KEY_F7] = 0x83,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
653 [KEY_F8] = 0x0A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
654 [KEY_F9] = 0x01,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
655 [KEY_F10] = 0x09,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656 [KEY_F11] = 0x78,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
657 [KEY_F12] = 0x07,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
658 [KEY_LEFTCTRL] = 0x14,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
659 [KEY_LEFTSHIFT] = 0x12,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
660 [KEY_LEFTALT] = 0x11,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
661 [KEY_RIGHTCTRL] = 0x18,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
662 [KEY_RIGHTSHIFT] = 0x59,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
663 [KEY_RIGHTALT] = 0x17,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
664 [KEY_INSERT] = 0x81,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
665 [KEY_PAUSE] = 0x82,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
666 [KEY_SYSRQ] = 0x84,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
667 [KEY_SCROLLLOCK] = 0x7E,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
668 [KEY_DELETE] = 0x85,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
669 [KEY_LEFT] = 0x86,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
670 [KEY_HOME] = 0x87,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
671 [KEY_END] = 0x88,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 [KEY_UP] = 0x89,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 [KEY_DOWN] = 0x8A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
674 [KEY_PAGEUP] = 0x8B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
675 [KEY_PAGEDOWN] = 0x8C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
676 [KEY_RIGHT] = 0x8D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
677 [KEY_NUMLOCK] = 0x77,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
678 [KEY_KPSLASH] = 0x80,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
679 [KEY_KPASTERISK] = 0x7C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
680 [KEY_KPMINUS] = 0x7B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
681 [KEY_KPPLUS] = 0x79,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
682 [KEY_KPENTER] = 0x19,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
683 [KEY_KP1] = 0x69,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
684 [KEY_KP2] = 0x72,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
685 [KEY_KP3] = 0x7A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
686 [KEY_KP4] = 0x6B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
687 [KEY_KP5] = 0x73,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
688 [KEY_KP6] = 0x74,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 [KEY_KP7] = 0x6C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690 [KEY_KP8] = 0x75,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
691 [KEY_KP9] = 0x7D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692 [KEY_KP0] = 0x70,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 [KEY_KPDOT] = 0x71,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
696 #include "special_keys_evdev.h"
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
697 static uint8_t sym_map[128] = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
698 [KEY_A] = 'a',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
699 [KEY_B] = 'b',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 [KEY_C] = 'c',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 [KEY_D] = 'd',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
702 [KEY_E] = 'e',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
703 [KEY_F] = 'f',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
704 [KEY_G] = 'g',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
705 [KEY_H] = 'h',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
706 [KEY_I] = 'i',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
707 [KEY_J] = 'j',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
708 [KEY_K] = 'k',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
709 [KEY_L] = 'l',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
710 [KEY_M] = 'm',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
711 [KEY_N] = 'n',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 [KEY_O] = 'o',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713 [KEY_P] = 'p',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
714 [KEY_Q] = 'q',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
715 [KEY_R] = 'r',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716 [KEY_S] = 's',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 [KEY_T] = 't',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
718 [KEY_U] = 'u',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
719 [KEY_V] = 'v',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 [KEY_W] = 'w',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 [KEY_X] = 'x',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 [KEY_Y] = 'y',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
723 [KEY_Z] = 'z',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
724 [KEY_1] = '1',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
725 [KEY_2] = '2',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 [KEY_3] = '3',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
727 [KEY_4] = '4',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 [KEY_5] = '5',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 [KEY_6] = '6',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730 [KEY_7] = '7',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 [KEY_8] = '8',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
732 [KEY_9] = '9',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 [KEY_0] = '0',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 [KEY_ENTER] = '\r',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735 [KEY_SPACE] = ' ',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 [KEY_TAB] = '\t',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737 [KEY_BACKSPACE] = '\b',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 [KEY_MINUS] = '-',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 [KEY_EQUAL] = '=',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 [KEY_LEFTBRACE] = '[',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
741 [KEY_RIGHTBRACE] = ']',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742 [KEY_BACKSLASH] = '\\',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 [KEY_SEMICOLON] = ';',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 [KEY_APOSTROPHE] = '\'',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 [KEY_GRAVE] = '`',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
746 [KEY_COMMA] = ',',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 [KEY_DOT] = '.',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 [KEY_SLASH] = '/',
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749 [KEY_ESC] = RENDERKEY_ESC,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
750 [KEY_F1] = RENDERKEY_F1,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 [KEY_F2] = RENDERKEY_F2,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
752 [KEY_F3] = RENDERKEY_F3,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
753 [KEY_F4] = RENDERKEY_F4,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
754 [KEY_F5] = RENDERKEY_F5,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
755 [KEY_F6] = RENDERKEY_F6,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
756 [KEY_F7] = RENDERKEY_F7,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
757 [KEY_F8] = RENDERKEY_F8,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
758 [KEY_F9] = RENDERKEY_F9,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 [KEY_F10] = RENDERKEY_F10,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 [KEY_F11] = RENDERKEY_F11,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 [KEY_F12] = RENDERKEY_F12,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
762 [KEY_LEFTCTRL] = RENDERKEY_LCTRL,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 [KEY_LEFTSHIFT] = RENDERKEY_LSHIFT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 [KEY_LEFTALT] = RENDERKEY_LALT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 [KEY_RIGHTCTRL] = RENDERKEY_RCTRL,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
766 [KEY_RIGHTSHIFT] = RENDERKEY_RSHIFT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
767 [KEY_RIGHTALT] = RENDERKEY_RALT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
768 [KEY_DELETE] = RENDERKEY_DEL,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
769 [KEY_LEFT] = RENDERKEY_LEFT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
770 [KEY_HOME] = RENDERKEY_HOME,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
771 [KEY_END] = RENDERKEY_END,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
772 [KEY_UP] = RENDERKEY_UP,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773 [KEY_DOWN] = RENDERKEY_DOWN,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
774 [KEY_PAGEUP] = RENDERKEY_PAGEUP,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
775 [KEY_PAGEDOWN] = RENDERKEY_PAGEDOWN,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
776 [KEY_RIGHT] = RENDERKEY_RIGHT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
777 [KEY_KPSLASH] = 0x80,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 [KEY_KPASTERISK] = 0x7C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
779 [KEY_KPMINUS] = 0x7B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
780 [KEY_KPPLUS] = 0x79,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 [KEY_KPENTER] = 0x19,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 [KEY_KP1] = 0x69,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783 [KEY_KP2] = 0x72,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
784 [KEY_KP3] = 0x7A,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
785 [KEY_KP4] = 0x6B,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
786 [KEY_KP5] = 0x73,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
787 [KEY_KP6] = 0x74,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788 [KEY_KP7] = 0x6C,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 [KEY_KP8] = 0x75,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
790 [KEY_KP9] = 0x7D,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 [KEY_KP0] = 0x70,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 [KEY_KPDOT] = 0x71,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
794
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
795 static drop_handler drag_drop_handler;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 void render_set_drag_drop_handler(drop_handler handler)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 drag_drop_handler = handler;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
799 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
800
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
801 char* render_joystick_type_id(int index)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802 {
1786
2b661c1e431f Remove some commented out code in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1785
diff changeset
803 return strdup("");
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
804 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
805
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
806 static uint32_t overscan_top[NUM_VID_STD] = {2, 21};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 static uint32_t overscan_bot[NUM_VID_STD] = {1, 17};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
808 static uint32_t overscan_left[NUM_VID_STD] = {13, 13};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
809 static uint32_t overscan_right[NUM_VID_STD] = {14, 14};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
810 static vid_std video_standard = VID_NTSC;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
811
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
812 typedef enum {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
813 DEV_NONE,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814 DEV_KEYBOARD,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
815 DEV_MOUSE,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 DEV_GAMEPAD
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
817 } device_type;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
819 static int32_t mouse_x, mouse_y, mouse_accum_x, mouse_accum_y;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
820 static int32_t handle_event(device_type dtype, int device_index, struct input_event *event)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
821 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 switch (event->type) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 case EV_KEY:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 //code is key, value is 1 for keydown, 0 for keyup
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825 if (dtype == DEV_KEYBOARD && event->code < 128) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826 //keyboard key that we might have a mapping for
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827 if (event->value) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 handle_keydown(sym_map[event->code], scancode_map[event->code]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
829 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
830 handle_keyup(sym_map[event->code], scancode_map[event->code]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
831 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
832 } else if (dtype == DEV_MOUSE && event->code >= BTN_MOUSE && event->code < BTN_JOYSTICK) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
833 //mosue button
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
834 if (event->value) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
835 handle_mousedown(device_index, event->code - BTN_LEFT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
836 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
837 handle_mouseup(device_index, event->code - BTN_LEFT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
838 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
839 } else if (dtype == DEV_GAMEPAD && event->code >= BTN_GAMEPAD && event->code < BTN_DIGI) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
840 //gamepad button
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
841 if (event->value) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
842 handle_joydown(device_index, event->code - BTN_SOUTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
843 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
844 handle_joyup(device_index, event->code - BTN_SOUTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
845 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
846 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
847 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
848 case EV_REL:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
849 if (dtype == DEV_MOUSE) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
850 switch(event->code)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
851 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
852 case REL_X:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
853 mouse_accum_x += event->value;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
854 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
855 case REL_Y:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
856 mouse_accum_y += event->value;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
857 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
858 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
859 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
860 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
861 case EV_ABS:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
862 //TODO: Handle joystick axis/hat motion, absolute mouse movement
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
863 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
864 case EV_SYN:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
865 if (dtype == DEV_MOUSE && (mouse_accum_x || mouse_accum_y)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
866 mouse_x += mouse_accum_x;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
867 mouse_y += mouse_accum_y;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
868 if (mouse_x < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
869 mouse_x = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
870 } else if (mouse_x >= main_width) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
871 mouse_x = main_width - 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
872 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
873 if (mouse_y < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
874 mouse_y = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
875 } else if (mouse_y >= main_height) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
876 mouse_y = main_height - 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
877 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
878 handle_mouse_moved(device_index, mouse_x, mouse_y, mouse_accum_x, mouse_accum_y);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
879 mouse_accum_x = mouse_accum_y = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
880 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
881 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
882 /*
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
883 case SDL_JOYHATMOTION:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
884 handle_joy_dpad(find_joystick_index(event->jhat.which), event->jhat.hat, event->jhat.value);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
885 break;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
886 case SDL_JOYAXISMOTION:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
887 handle_joy_axis(find_joystick_index(event->jaxis.which), event->jaxis.axis, event->jaxis.value);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
888 break;*/
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
889 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
890 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
891 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
892
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
893 #define MAX_DEVICES 16
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
894 static int device_fds[MAX_DEVICES];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
895 static device_type device_types[MAX_DEVICES];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
896 static int cur_devices;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
897
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
898 static void drain_events()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
899 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
900 struct input_event events[64];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
901 int index_by_type[3] = {0,0,0};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
902 for (int i = 0; i < cur_devices; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
903 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
904 int bytes = sizeof(events);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
905 int device_index = index_by_type[device_types[i]-1]++;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
906 while (bytes == sizeof(events))
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
907 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
908 bytes = read(device_fds[i], events, sizeof(events));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
909 if (bytes > 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
910 int num_events = bytes / sizeof(events[0]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
911 for (int j = 0; j < num_events; j++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
912 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
913 handle_event(device_types[i], device_index, events + j);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
914 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
915 } else if (bytes < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
916 perror("Failed to read evdev events");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
917 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
918 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
919 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
920 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
921
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
922 static char *vid_std_names[NUM_VID_STD] = {"ntsc", "pal"};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
923
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
924 static void init_audio()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
925 {
1780
fc9bea5ee079 Fix off-by-one error in evdev init code and allow ALSA device to be specified in config
Michael Pavone <pavone@retrodev.com>
parents: 1779
diff changeset
926 char *device_name = tern_find_path_default(config, "audio\0alsa_device\0", (tern_val){.ptrval="default"}, TVAL_PTR).ptrval;
fc9bea5ee079 Fix off-by-one error in evdev init code and allow ALSA device to be specified in config
Michael Pavone <pavone@retrodev.com>
parents: 1779
diff changeset
927 int res = snd_pcm_open(&audio_handle, device_name, SND_PCM_STREAM_PLAYBACK, 0);
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
928 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
929 fatal_error("Failed to open ALSA device: %s\n", snd_strerror(res));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
930 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
931
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
932 snd_pcm_hw_params_t *params;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
933 snd_pcm_hw_params_alloca(&params);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
934 res = snd_pcm_hw_params_any(audio_handle, params);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
935 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
936 fatal_error("No playback configurations available: %s\n", snd_strerror(res));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
937 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
938 res = snd_pcm_hw_params_set_access(audio_handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
939 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
940 fatal_error("Failed to set access type: %s\n", snd_strerror(res));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
941 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
942 res = snd_pcm_hw_params_set_format(audio_handle, params, SND_PCM_FORMAT_S16_LE);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
943 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
944 //failed to set, signed 16-bit integer, try floating point
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
945 res = snd_pcm_hw_params_set_format(audio_handle, params, SND_PCM_FORMAT_FLOAT_LE);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
946 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
947 fatal_error("Failed to set an acceptable format: %s\n", snd_strerror(res));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
948 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
949 mix = mix_f32;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
950 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
951 mix = mix_s16;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
952 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
953
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
954 char * rate_str = tern_find_path(config, "audio\0rate\0", TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
955 sample_rate = rate_str ? atoi(rate_str) : 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
956 if (!sample_rate) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
957 sample_rate = 48000;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
958 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
959 snd_pcm_hw_params_set_rate_near(audio_handle, params, &sample_rate, NULL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
960 output_channels = 2;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
961 snd_pcm_hw_params_set_channels_near(audio_handle, params, &output_channels);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
962
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
963 char * samples_str = tern_find_path(config, "audio\0buffer\0", TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
964 buffer_samples = samples_str ? atoi(samples_str) : 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
965 if (!buffer_samples) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
966 buffer_samples = 512;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
967 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
968 snd_pcm_hw_params_set_period_size_near(audio_handle, params, &buffer_samples, NULL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
969
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
970 int dir = 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
971 unsigned int periods = 2;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
972 snd_pcm_hw_params_set_periods_near(audio_handle, params, &periods, &dir);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
973
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
974 res = snd_pcm_hw_params(audio_handle, params);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
975 if (res < 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
976 fatal_error("Failed to set ALSA hardware params: %s\n", snd_strerror(res));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
977 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
978
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
979 printf("Initialized audio at frequency %d with a %d sample buffer, ", (int)sample_rate, (int)buffer_samples);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
980 if (mix == mix_s16) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
981 puts("signed 16-bit int format");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
982 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
983 puts("32-bit float format");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
984 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
985 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
986
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
987 int fbfd;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
988 uint32_t *framebuffer;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
989 uint32_t fb_stride;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
990 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
991 EGLDisplay egl_display;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
992 EGLSurface main_surface;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
993 uint8_t egl_setup(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
994 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
995 //Mesa wants the fbdev file descriptor as the display
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
996 egl_display = eglGetDisplay((EGLNativeDisplayType)fbfd);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
997 if (egl_display == EGL_NO_DISPLAY) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
998 //Mali (and possibly others) seems to just want EGL_DEFAULT_DISPLAY
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
999 egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 if (egl_display == EGL_NO_DISPLAY) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1001 warning("eglGetDisplay failed with error %X\n", eglGetError());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1005 EGLint major, minor;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1006 if (!eglInitialize(egl_display, &major, &minor)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1007 warning("eglInitialize failed with error %X\n", eglGetError());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1008 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1009 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 printf("EGL version %d.%d\n", major, minor);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1011 EGLint num_configs;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1012 EGLConfig config;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1013 EGLint const config_attribs[] = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1014 EGL_RED_SIZE, 5,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1015 EGL_GREEN_SIZE, 5,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1016 EGL_BLUE_SIZE, 5,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1017 EGL_CONFORMANT, EGL_OPENGL_ES2_BIT,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1018 EGL_NONE
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1019 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 if (!eglChooseConfig(egl_display, config_attribs, &config, 1, &num_configs)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1021 num_configs = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1022 warning("eglChooseConfig failed with error %X\n", eglGetError());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1023 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1024 if (!num_configs) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1025 warning("Failed to choose an EGL config\n");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1026 goto error;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1027 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1028 EGLint const context_attribs[] = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1029 #ifdef EGL_CONTEXT_MAJOR_VERSION
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1030 EGL_CONTEXT_MAJOR_VERSION, 2,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1031 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1032 EGL_NONE
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1034 main_context = eglCreateContext(egl_display, config, EGL_NO_CONTEXT, context_attribs);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1035 if (main_context == EGL_NO_CONTEXT) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 warning("Failed to create EGL context %X\n", eglGetError());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 goto error;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1038 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 #ifdef USE_MALI
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 struct mali_native_window native_window = {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 .width = main_width,
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1042 .height = main_height
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1043 };
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1044 main_surface = eglCreateWindowSurface(egl_display, config, &native_window, NULL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1045 #else
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1046 main_surface = eglCreateWindowSurface(egl_display, config, (EGLNativeWindowType)NULL, NULL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1047 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1048 if (main_surface == EGL_NO_SURFACE) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1049 warning("Failed to create EGL surface %X\n", eglGetError());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1050 goto post_context_error;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1051 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1052 if (eglMakeCurrent(egl_display, main_surface, main_surface, main_context)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1053 return 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1054 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1055 eglDestroySurface(egl_display, main_surface);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1056 post_context_error:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1057 eglDestroyContext(egl_display, main_context);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1058 error:
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1059 eglTerminate(egl_display);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1060 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1061 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1062 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1063 static pthread_mutex_t buffer_lock = PTHREAD_MUTEX_INITIALIZER;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1064 static pthread_cond_t buffer_cond = PTHREAD_COND_INITIALIZER;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1065 static uint8_t buffer_ready;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1066 static uint32_t *copy_buffer;
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1067 static uint32_t last_width, last_width_scale, last_height, last_height_scale;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1068 static uint32_t max_multiple;
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1069
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1070 static uint32_t mix_pixel(uint32_t last, uint32_t cur, float ratio)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1071 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1072 float a,b,c,d;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1073 a = (last & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1074 b = (last >> 8 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1075 c = (last >> 16 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1076 d = (last >> 24 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1077 ratio = 1.0f - ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1078 a += (cur & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1079 b += (cur >> 8 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1080 c += (cur >> 16 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1081 d += (cur >> 24 & 255) * ratio;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1082 return ((int)d) << 24 | ((int)c) << 16 | ((int)b) << 8 | ((int)a);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1083 }
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1084 static void do_buffer_copy(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1085 {
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1086 uint32_t width_multiple = main_width / last_width_scale;
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1087 uint32_t height_multiple = main_height / last_height_scale;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1088 uint32_t multiple = width_multiple < height_multiple ? width_multiple : height_multiple;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1089 if (max_multiple && multiple > max_multiple) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1090 multiple = max_multiple;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1091 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1092 height_multiple = last_height_scale * multiple / last_height;
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1093 uint32_t *cur_line = framebuffer + (main_width - last_width_scale * multiple)/2;
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1094 cur_line += fb_stride * (main_height - last_height_scale * multiple) / (2 * sizeof(uint32_t));
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1095 uint32_t *src_line = copy_buffer;
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1096 if (height_multiple * last_height == multiple * last_height_scale) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1097 if (last_width == last_width_scale) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1098 for (uint32_t y = 0; y < last_height; y++)
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1099 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1100 for (uint32_t i = 0; i < height_multiple; i++)
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1101 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1102 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1103 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1104 for (uint32_t x = 0; x < last_width ; x++)
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1105 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1106 uint32_t pixel = *(src++);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1107 for (uint32_t j = 0; j < multiple; j++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1108 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1109 *(cur++) = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1110 }
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1111 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1112
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1113 cur_line += fb_stride / sizeof(uint32_t);
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1114 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1115 src_line += LINEBUF_SIZE;
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1116 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1117 } else {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1118 float scale_multiple = ((float)(last_width_scale * multiple)) / (float)last_width;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1119 float remaining = 0.0f;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1120 uint32_t last_pixel = 0;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1121 for (uint32_t y = 0; y < last_height; y++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1122 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1123 for (uint32_t i = 0; i < height_multiple; i++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1124 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1125 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1126 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1127 for (uint32_t x = 0; x < last_width ; x++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1128 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1129 uint32_t pixel = *(src++);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1130 float count = scale_multiple;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1131 if (remaining > 0.0f) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1132 *(cur++) = mix_pixel(last_pixel, pixel, remaining);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1133 count -= 1.0f - remaining;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1134 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1135 for (; count >= 1; count -= 1.0f)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1136 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1137 *(cur++) = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1138 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1139 remaining = count;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1140 last_pixel = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1141 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1142
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1143 cur_line += fb_stride / sizeof(uint32_t);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1144 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1145 src_line += LINEBUF_SIZE;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1146 }
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1147 }
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1148 } else {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1149 float height_scale = ((float)(last_height_scale * multiple)) / (float)last_height;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1150 float height_remaining = 0.0f;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1151 uint32_t *last_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1152 if (last_width == last_width_scale) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1153 for (uint32_t y = 0; y < last_height; y++)
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1154 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1155 float hcount = height_scale;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1156 if (height_remaining > 0.0f) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1157 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1158 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1159 uint32_t *last = last_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1160 for (uint32_t x = 0; x < last_width ; x++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1161 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1162 uint32_t mixed = mix_pixel(*(last++), *(src++), height_remaining);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1163 for (uint32_t j = 0; j < multiple; j++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1164 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1165 *(cur++) = mixed;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1166 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1167 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1168 hcount -= 1.0f - height_remaining;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1169 cur_line += fb_stride / sizeof(uint32_t);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1170 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1171 for(; hcount >= 1; hcount -= 1.0f)
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1172 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1173 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1174 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1175 for (uint32_t x = 0; x < last_width ; x++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1176 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1177 uint32_t pixel = *(src++);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1178 for (uint32_t j = 0; j < multiple; j++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1179 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1180 *(cur++) = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1181 }
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1182 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1183
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1184 cur_line += fb_stride / sizeof(uint32_t);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1185 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1186 height_remaining = hcount;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1187 last_line = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1188 src_line += LINEBUF_SIZE;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1189 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1190 } else {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1191 float scale_multiple = ((float)(last_width_scale * multiple)) / (float)last_width;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1192 float remaining = 0.0f;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1193 uint32_t last_pixel = 0;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1194 for (uint32_t y = 0; y < last_height; y++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1195 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1196 float hcount = height_scale;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1197 if (height_remaining > 0.0f) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1198 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1199 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1200 uint32_t *last = last_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1201
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1202 for (uint32_t x = 0; x < last_width; x++)
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1203 {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1204 uint32_t pixel = mix_pixel(*(last++), *(src++), height_remaining);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1205 float count = scale_multiple;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1206 if (remaining > 0.0f) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1207 *(cur++) = mix_pixel(last_pixel, pixel, remaining);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1208 count -= 1.0f - remaining;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1209 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1210 for (; count >= 1.0f; count -= 1.0f)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1211 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1212 *(cur++) = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1213 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1214 remaining = count;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1215 last_pixel = pixel;
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1216 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1217 hcount -= 1.0f - height_remaining;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1218 cur_line += fb_stride / sizeof(uint32_t);
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1219 }
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1220
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1221 for (; hcount >= 1.0f; hcount -= 1.0f)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1222 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1223 uint32_t *cur = cur_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1224 uint32_t *src = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1225 for (uint32_t x = 0; x < last_width ; x++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1226 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1227 uint32_t pixel = *(src++);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1228 float count = scale_multiple;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1229 if (remaining > 0.0f) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1230 *(cur++) = mix_pixel(last_pixel, pixel, remaining);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1231 count -= 1.0f - remaining;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1232 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1233 for (; count >= 1; count -= 1.0f)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1234 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1235 *(cur++) = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1236 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1237 remaining = count;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1238 last_pixel = pixel;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1239 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1240
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1241 cur_line += fb_stride / sizeof(uint32_t);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1242 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1243 height_remaining = hcount;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1244 last_line = src_line;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1245 src_line += LINEBUF_SIZE;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1246 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1247 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1248 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1249 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1250 static void *buffer_copy(void *data)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1251 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1252 pthread_mutex_lock(&buffer_lock);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1253 for(;;)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1254 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1255 while (!buffer_ready)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1256 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1257 pthread_cond_wait(&buffer_cond, &buffer_lock);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1258 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1259 buffer_ready = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1260 do_buffer_copy();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1261 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1262 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1263 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1264
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1265 static pthread_t buffer_copy_handle;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1266 static uint8_t copy_use_thread;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1267 void window_setup(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1268 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1269 fbfd = open("/dev/fb0", O_RDWR);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1270 struct fb_fix_screeninfo fixInfo;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1271 struct fb_var_screeninfo varInfo;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1272 ioctl(fbfd, FBIOGET_FSCREENINFO, &fixInfo);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1273 ioctl(fbfd, FBIOGET_VSCREENINFO, &varInfo);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1274 printf("Resolution: %d x %d\n", varInfo.xres, varInfo.yres);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1275 printf("Framebuffer size: %d, line stride: %d\n", fixInfo.smem_len, fixInfo.line_length);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1276 main_width = varInfo.xres;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1277 main_height = varInfo.yres;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1278 fb_stride = fixInfo.line_length;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1279 tern_val def = {.ptrval = "audio"};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1280 char *sync_src = tern_find_path_default(config, "system\0sync_source\0", def, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1281
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1282 const char *vsync;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1283 def.ptrval = "off";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1284 vsync = tern_find_path_default(config, "video\0vsync\0", def, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1285
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1286
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1287 tern_node *video = tern_find_node(config, "video");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1288 if (video)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1289 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1290 for (int i = 0; i < NUM_VID_STD; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1291 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1292 tern_node *std_settings = tern_find_node(video, vid_std_names[i]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1293 if (std_settings) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1294 char *val = tern_find_path_default(std_settings, "overscan\0top\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1295 if (val) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1296 overscan_top[i] = atoi(val);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1297 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1298 val = tern_find_path_default(std_settings, "overscan\0bottom\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1299 if (val) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1300 overscan_bot[i] = atoi(val);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1301 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1302 val = tern_find_path_default(std_settings, "overscan\0left\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1303 if (val) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1304 overscan_left[i] = atoi(val);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1305 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1306 val = tern_find_path_default(std_settings, "overscan\0right\0", (tern_val){.ptrval = NULL}, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1307 if (val) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1308 overscan_right[i] = atoi(val);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1309 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1310 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1311 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1312 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1313 render_gl = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1314 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1315 char *gl_enabled_str = tern_find_path_default(config, "video\0gl\0", def, TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1316 uint8_t gl_enabled = strcmp(gl_enabled_str, "off") != 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1317 if (gl_enabled)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1318 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1319 render_gl = egl_setup();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1320 blue_shift = 16;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1321 green_shift = 8;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1322 red_shift = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1323 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1324 if (!render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1325 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1326 framebuffer = mmap(NULL, fixInfo.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fbfd, 0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1327 red_shift = varInfo.red.offset;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1328 green_shift = varInfo.green.offset;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1329 blue_shift = varInfo.blue.offset;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1330 def.ptrval = "0";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1331 max_multiple = atoi(tern_find_path_default(config, "video\0fbdev\0max_multiple\0", def, TVAL_PTR).ptrval);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1332 def.ptrval = "true";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1333 copy_use_thread = strcmp(tern_find_path_default(config, "video\0fbdev\0use_thread\0", def, TVAL_PTR).ptrval, "false");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1334 if (copy_use_thread) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1335 pthread_create(&buffer_copy_handle, NULL, buffer_copy, NULL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1336 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1337 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1338 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1339 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1340
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1341 update_aspect();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1342 render_alloc_surfaces();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1343 def.ptrval = "off";
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1344 scanlines = !strcmp(tern_find_path_default(config, "video\0scanlines\0", def, TVAL_PTR).ptrval, "on");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1345 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1346
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1347 void restore_tty(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1348 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1349 ioctl(STDIN_FILENO, KDSETMODE, KD_TEXT);
1781
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1350 for (int i = 0; i < cur_devices; i++)
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1351 {
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1352 if (device_types[i] == DEV_KEYBOARD) {
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1353 ioctl(device_fds[i], EVIOCGRAB, 0);
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1354 }
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1355 }
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1356 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1357
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1358 void render_init(int width, int height, char * title, uint8_t fullscreen)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1359 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1360 if (height <= 0) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1361 float aspect = config_aspect() > 0.0f ? config_aspect() : 4.0f/3.0f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1362 height = ((float)width / aspect) + 0.5f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1363 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1364 printf("width: %d, height: %d\n", width, height);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1365 windowed_width = width;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1366 windowed_height = height;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1367
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1368 main_width = width;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1369 main_height = height;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1370
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1371 caption = title;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1372
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1373 if (isatty(STDIN_FILENO)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1374 ioctl(STDIN_FILENO, KDSETMODE, KD_GRAPHICS);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1375 atexit(restore_tty);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1376 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1377
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1378 window_setup();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1379
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1380 init_audio();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1381
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1382 render_set_video_standard(VID_NTSC);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1383
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1384 DIR *d = opendir("/dev/input");
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1385 struct dirent* entry;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1386 int joystick_counter = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1387 while ((entry = readdir(d)) && cur_devices < MAX_DEVICES)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1388 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1389 if (!strncmp("event", entry->d_name, strlen("event"))) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1390 char *filename = alloc_concat("/dev/input/", entry->d_name);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1391 int fd = open(filename, O_RDONLY);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1392 if (fd == -1) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1393 int errnum = errno;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1394 warning("Failed to open evdev device %s for reading: %s\n", filename, strerror(errnum));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1395 free(filename);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1396 continue;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1397 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1398
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1399 unsigned long bits;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1400 if (-1 == ioctl(fd, EVIOCGBIT(0, sizeof(bits)), &bits)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1401 int errnum = errno;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1402 warning("Failed get capability bits from evdev device %s: %s\n", filename, strerror(errnum));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1403 free(filename);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1404 close(fd);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1405 continue;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1406 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1407 if (!(1 & bits >> EV_KEY)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1408 //if it doesn't support key events we don't care about it
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1409 free(filename);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1410 close(fd);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1411 continue;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1412 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1413 unsigned long button_bits[(BTN_THUMBR+8*sizeof(long))/(8*sizeof(long))];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1414 int res = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(button_bits)), button_bits);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1415 if (-1 == res) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1416 int errnum = errno;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1417 warning("Failed get capability bits from evdev device %s: %s\n", filename, strerror(errnum));
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1418 free(filename);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1419 close(fd);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1420 continue;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1421 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1422 int to_check[] = {KEY_ENTER, BTN_MOUSE, BTN_GAMEPAD};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1423 device_type dtype = DEV_NONE;
1780
fc9bea5ee079 Fix off-by-one error in evdev init code and allow ALSA device to be specified in config
Michael Pavone <pavone@retrodev.com>
parents: 1779
diff changeset
1424 for (int i = 0; i < 3; i++)
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1425 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1426 if (1 & button_bits[to_check[i]/(8*sizeof(button_bits[0]))] >> to_check[i]%(8*sizeof(button_bits[0]))) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1427 dtype = i + 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1428 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1429 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1430 if (dtype == DEV_NONE) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1431 close(fd);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1432 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1433 device_fds[cur_devices] = fd;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1434 device_types[cur_devices] = dtype;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1435 char name[1024];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1436 char *names[] = {"Keyboard", "Mouse", "Gamepad"};
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1437 ioctl(fd, EVIOCGNAME(sizeof(name)), name);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1438 printf("%s is a %s\n%s\n", filename, names[dtype - 1], name);
1781
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1439
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1440 if (dtype == DEV_GAMEPAD) {
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1441 handle_joy_added(joystick_counter++);
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1442 } else if (dtype == DEV_KEYBOARD && isatty(STDIN_FILENO)) {
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1443 ioctl(fd, EVIOCGRAB, 1);
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1444 }
2b4d5cfec6d9 Grab keyboard devices at startup so keyboard input stops going to terminal while running
Michael Pavone <pavone@retrodev.com>
parents: 1780
diff changeset
1445
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1446 //set FD to non-blocking mode for event polling
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1447 fcntl(fd, F_SETFL, O_NONBLOCK);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1448 cur_devices++;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1449 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1450 free(filename);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1451 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1452 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1453
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1454 atexit(render_quit);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1455 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1456 #include<unistd.h>
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1457 static int in_toggle;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1458 static void update_source(audio_source *src, double rc, uint8_t sync_changed)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1459 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1460 double alpha = src->dt / (src->dt + rc);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1461 int32_t lowpass_alpha = (int32_t)(((double)0x10000) * alpha);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1462 src->lowpass_alpha = lowpass_alpha;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1463 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1464
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1465 void render_config_updated(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1466 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1467
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1468 free_surfaces();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1469 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1470 if (render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1471 /*if (on_context_destroyed) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1472 on_context_destroyed();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1473 }*/
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1474 gl_teardown();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1475 //FIXME: EGL equivalent
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1476 //SDL_GL_DeleteContext(main_context);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1477 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1478 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1479 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1480 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1481 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1482 //FIXME: EGL equivalent
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1483 //SDL_DestroyWindow(main_window);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1484 drain_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1485
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1486 char *config_width = tern_find_path(config, "video\0width\0", TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1487 if (config_width) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1488 windowed_width = atoi(config_width);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1489 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1490 char *config_height = tern_find_path(config, "video\0height\0", TVAL_PTR).ptrval;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1491 if (config_height) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1492 windowed_height = atoi(config_height);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1493 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1494 float aspect = config_aspect() > 0.0f ? config_aspect() : 4.0f/3.0f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1495 windowed_height = ((float)windowed_width / aspect) + 0.5f;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1496 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1497
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1498 window_setup();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1499 update_aspect();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1500 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1501 //need to check render_gl again after window_setup as render option could have changed
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1502 /*if (render_gl && on_context_created) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1503 on_context_created();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1504 }*/
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1505 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1506
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1507 render_close_audio();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1508 quitting = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1509 init_audio();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1510 render_set_video_standard(video_standard);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1511
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1512 double lowpass_cutoff = get_lowpass_cutoff(config);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1513 double rc = (1.0 / lowpass_cutoff) / (2.0 * M_PI);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1514 for (uint8_t i = 0; i < num_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1515 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1516 update_source(audio_sources[i], rc, 0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1517 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1518 for (uint8_t i = 0; i < num_inactive_audio_sources; i++)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1519 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1520 update_source(inactive_audio_sources[i], rc, 0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1521 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1522 drain_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1523 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1524
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1525 void render_set_video_standard(vid_std std)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1526 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1527 video_standard = std;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1528 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1529
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1530 void render_update_caption(char *title)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1531 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1532 caption = title;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1533 free(fps_caption);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1534 fps_caption = NULL;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1535 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1536
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1537 static char *screenshot_path;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1538 void render_save_screenshot(char *path)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1539 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1540 if (screenshot_path) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1541 free(screenshot_path);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1542 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1543 screenshot_path = path;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1544 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1545
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1546 uint8_t render_create_window(char *caption, uint32_t width, uint32_t height, window_close_handler close_handler)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1547 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1548 //not supported under fbdev
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1549 return 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1550 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1551
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1552 void render_destroy_window(uint8_t which)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1553 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1554 //not supported under fbdev
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1555 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1556
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1557 static uint8_t last_fb;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1558 static uint32_t texture_off;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1559 uint32_t *render_get_framebuffer(uint8_t which, int *pitch)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1560 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1561 if (max_multiple == 1 && !render_gl) {
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1562 if (last_fb != which) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1563 *pitch = fb_stride * 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1564 return framebuffer + (which == FRAMEBUFFER_EVEN ? fb_stride / sizeof(uint32_t) : 0);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1565 }
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1566 *pitch = fb_stride;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1567 return framebuffer;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1568 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1569 if (!render_gl && last_fb != which) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1570 *pitch = LINEBUF_SIZE * sizeof(uint32_t) * 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1571 return texture_buf + texture_off + (which == FRAMEBUFFER_EVEN ? LINEBUF_SIZE : 0);
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1572 }
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1573 *pitch = LINEBUF_SIZE * sizeof(uint32_t);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1574 return texture_buf + texture_off;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1575 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1576
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1577 uint8_t events_processed;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1578 #ifdef __ANDROID__
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1579 #define FPS_INTERVAL 10000
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1580 #else
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1581 #define FPS_INTERVAL 1000
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1582 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1583
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1584 static uint8_t interlaced;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1585 void render_update_display();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1586 void render_framebuffer_updated(uint8_t which, int width)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1587 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1588 uint32_t height = which <= FRAMEBUFFER_EVEN
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1589 ? (video_standard == VID_NTSC ? 243 : 294) - (overscan_top[video_standard] + overscan_bot[video_standard])
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1590 : 240;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1591 width -= overscan_left[video_standard] + overscan_right[video_standard];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1592 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1593 if (render_gl && which <= FRAMEBUFFER_EVEN) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1594 last_width = width;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1595 glBindTexture(GL_TEXTURE_2D, textures[which]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1596 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]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1597 render_update_display();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1598 last_height = height;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1599 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1600 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1601 if (max_multiple != 1) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1602 if (copy_use_thread) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1603 pthread_mutex_lock(&buffer_lock);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1604 buffer_ready = 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1605 last_width = width;
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1606 last_width_scale = LINEBUF_SIZE - (overscan_left[video_standard] + overscan_right[video_standard]);
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1607 last_height = last_height_scale = height;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1608 copy_buffer = texture_buf + texture_off + overscan_left[video_standard] + LINEBUF_SIZE * overscan_top[video_standard];
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1609 if (which != last_fb) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1610 last_height *= 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1611 copy_buffer += LINEBUF_SIZE * overscan_top[video_standard];
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1612 uint32_t *src = texture_buf + (texture_off ? 0 : LINEBUF_SIZE * MAX_FB_LINES) + overscan_left[video_standard] + LINEBUF_SIZE * overscan_top[video_standard] + LINEBUF_SIZE * overscan_top[video_standard];
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1613 uint32_t *dst = copy_buffer;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1614 if (which == FRAMEBUFFER_ODD) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1615 src += LINEBUF_SIZE;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1616 dst += LINEBUF_SIZE;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1617 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1618 for (int i = 0; i < height; i++)
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1619 {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1620 memcpy(dst, src, width * sizeof(uint32_t));
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1621 src += LINEBUF_SIZE * 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1622 dst += LINEBUF_SIZE * 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1623 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1624 }
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1625 texture_off = texture_off ? 0 : LINEBUF_SIZE * MAX_FB_LINES;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1626 pthread_cond_signal(&buffer_cond);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1627 pthread_mutex_unlock(&buffer_lock);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1628 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1629 last_width = width;
1782
b2bffd98063d Scale H32 horizontally in fbdev backend so it has the correct aspect ratio
Michael Pavone <pavone@retrodev.com>
parents: 1781
diff changeset
1630 last_width_scale = LINEBUF_SIZE - (overscan_left[video_standard] + overscan_right[video_standard]);
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1631 last_height = last_height_scale = height;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1632 copy_buffer = texture_buf + texture_off + overscan_left[video_standard] + LINEBUF_SIZE * overscan_top[video_standard];
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1633 if (which != last_fb) {
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1634 last_height *= 2;
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1635 copy_buffer += LINEBUF_SIZE * overscan_top[video_standard];
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1636 }
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1637 do_buffer_copy();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1638 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1639 }
1785
8f2e78db0872 Handle interlaced mode in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1782
diff changeset
1640 last_fb = which;
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1641 if (!events_processed) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1642 process_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1643 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1644 events_processed = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1645 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1646 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1647 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1648 }
1786
2b661c1e431f Remove some commented out code in fbdev backend
Michael Pavone <pavone@retrodev.com>
parents: 1785
diff changeset
1649
1779
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1650 void render_update_display()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1651 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1652 #ifndef DISABLE_OPENGL
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1653 if (render_gl) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1654 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1655 glClear(GL_COLOR_BUFFER_BIT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1656
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1657 glUseProgram(program);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1658 glActiveTexture(GL_TEXTURE0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1659 glBindTexture(GL_TEXTURE_2D, textures[0]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1660 glUniform1i(un_textures[0], 0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1661
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1662 glActiveTexture(GL_TEXTURE1);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1663 glBindTexture(GL_TEXTURE_2D, textures[interlaced ? 1 : scanlines ? 2 : 0]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1664 glUniform1i(un_textures[1], 1);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1665
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1666 glUniform1f(un_width, render_emulated_width());
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1667 glUniform1f(un_height, last_height);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1668
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1669 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1670 glVertexAttribPointer(at_pos, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat[2]), (void *)0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1671 glEnableVertexAttribArray(at_pos);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1672
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1673 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1674 glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void *)0);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1675
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1676 glDisableVertexAttribArray(at_pos);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1677
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1678 /*if (render_ui) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1679 render_ui();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1680 }*/
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1681
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1682 eglSwapBuffers(egl_display, main_surface);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1683 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1684 #endif
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1685 if (!events_processed) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1686 process_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1687 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1688 events_processed = 0;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1689 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1690
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1691 uint32_t render_emulated_width()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1692 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1693 return last_width - overscan_left[video_standard] - overscan_right[video_standard];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1694 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1695
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1696 uint32_t render_emulated_height()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1697 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1698 return (video_standard == VID_NTSC ? 243 : 294) - overscan_top[video_standard] - overscan_bot[video_standard];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1699 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1700
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1701 uint32_t render_overscan_left()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1702 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1703 return overscan_left[video_standard];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1704 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1705
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1706 uint32_t render_overscan_top()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1707 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1708 return overscan_top[video_standard];
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1709 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1710
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1711 void render_wait_quit(vdp_context * context)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1712 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1713 for(;;)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1714 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1715 drain_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1716 sleep(1);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1717 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1718 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1719
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1720 int render_lookup_button(char *name)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1721 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1722 static tern_node *button_lookup;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1723 if (!button_lookup) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1724 //xbox/sdl style names
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1725 button_lookup = tern_insert_int(button_lookup, "a", BTN_SOUTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1726 button_lookup = tern_insert_int(button_lookup, "b", BTN_EAST);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1727 button_lookup = tern_insert_int(button_lookup, "x", BTN_WEST);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1728 button_lookup = tern_insert_int(button_lookup, "y", BTN_NORTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1729 button_lookup = tern_insert_int(button_lookup, "back", BTN_SELECT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1730 button_lookup = tern_insert_int(button_lookup, "start", BTN_START);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1731 button_lookup = tern_insert_int(button_lookup, "guid", BTN_MODE);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1732 button_lookup = tern_insert_int(button_lookup, "leftshoulder", BTN_TL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1733 button_lookup = tern_insert_int(button_lookup, "rightshoulder", BTN_TR);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1734 button_lookup = tern_insert_int(button_lookup, "leftstick", BTN_THUMBL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1735 button_lookup = tern_insert_int(button_lookup, "rightstick", BTN_THUMBR);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1736 //alternative Playstation-style names
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1737 button_lookup = tern_insert_int(button_lookup, "cross", BTN_SOUTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1738 button_lookup = tern_insert_int(button_lookup, "circle", BTN_EAST);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1739 button_lookup = tern_insert_int(button_lookup, "square", BTN_WEST);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1740 button_lookup = tern_insert_int(button_lookup, "triangle", BTN_NORTH);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1741 button_lookup = tern_insert_int(button_lookup, "share", BTN_SELECT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1742 button_lookup = tern_insert_int(button_lookup, "select", BTN_SELECT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1743 button_lookup = tern_insert_int(button_lookup, "options", BTN_START);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1744 button_lookup = tern_insert_int(button_lookup, "l1", BTN_TL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1745 button_lookup = tern_insert_int(button_lookup, "r1", BTN_TR);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1746 button_lookup = tern_insert_int(button_lookup, "l3", BTN_THUMBL);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1747 button_lookup = tern_insert_int(button_lookup, "r3", BTN_THUMBR);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1748 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1749 return (int)tern_find_int(button_lookup, name, KEY_CNT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1750 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1751
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1752 int render_lookup_axis(char *name)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1753 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1754 static tern_node *axis_lookup;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1755 if (!axis_lookup) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1756 //xbox/sdl style names
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1757 axis_lookup = tern_insert_int(axis_lookup, "leftx", ABS_X);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1758 axis_lookup = tern_insert_int(axis_lookup, "lefty", ABS_Y);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1759 axis_lookup = tern_insert_int(axis_lookup, "lefttrigger", ABS_Z);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1760 axis_lookup = tern_insert_int(axis_lookup, "rightx", ABS_RX);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1761 axis_lookup = tern_insert_int(axis_lookup, "righty", ABS_RY);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1762 axis_lookup = tern_insert_int(axis_lookup, "righttrigger", ABS_RZ);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1763 //alternative Playstation-style names
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1764 axis_lookup = tern_insert_int(axis_lookup, "l2", ABS_Z);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1765 axis_lookup = tern_insert_int(axis_lookup, "r2", ABS_RZ);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1766 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1767 return (int)tern_find_int(axis_lookup, name, ABS_CNT);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1768 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1769
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1770 int32_t render_translate_input_name(int32_t controller, char *name, uint8_t is_axis)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1771 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1772 tern_node *button_lookup, *axis_lookup;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1773 if (is_axis) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1774 int axis = render_lookup_axis(name);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1775 if (axis == ABS_CNT) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1776 return RENDER_INVALID_NAME;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1777 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1778 return RENDER_AXIS_BIT | axis;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1779 } else {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1780 int button = render_lookup_button(name);
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1781 if (button != KEY_CNT) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1782 return button;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1783 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1784 if (!strcmp("dpup", name)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1785 return RENDER_DPAD_BIT | 1;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1786 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1787 if (!strcmp("dpdown", name)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1788 return RENDER_DPAD_BIT | 4;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1789 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1790 if (!strcmp("dpdleft", name)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1791 return RENDER_DPAD_BIT | 8;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1792 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1793 if (!strcmp("dpright", name)) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1794 return RENDER_DPAD_BIT | 2;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1795 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1796 return RENDER_INVALID_NAME;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1797 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1798 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1799
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1800 int32_t render_dpad_part(int32_t input)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1801 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1802 return input >> 4 & 0xFFFFFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1803 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1804
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1805 uint8_t render_direction_part(int32_t input)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1806 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1807 return input & 0xF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1808 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1809
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1810 int32_t render_axis_part(int32_t input)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1811 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1812 return input & 0xFFFFFFF;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1813 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1814
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1815 void process_events()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1816 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1817 if (events_processed > MAX_EVENT_POLL_PER_FRAME) {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1818 return;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1819 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1820 drain_events();
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1821 events_processed++;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1822 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1823
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1824 #define TOGGLE_MIN_DELAY 250
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1825 void render_toggle_fullscreen()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1826 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1827 //always fullscreen in fbdev
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1828 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1829
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1830 uint32_t render_audio_buffer()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1831 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1832 return buffer_samples;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1833 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1834
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1835 uint32_t render_sample_rate()
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1836 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1837 return sample_rate;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1838 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1839
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1840 void render_errorbox(char *title, char *message)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1841 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1842
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1843 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1844
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1845 void render_warnbox(char *title, char *message)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1846 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1847
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1848 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1849
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1850 void render_infobox(char *title, char *message)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1851 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1852
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1853 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1854
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1855 uint8_t render_has_gl(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1856 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1857 return render_gl;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1858 }
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1859
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1860 uint8_t render_get_active_framebuffer(void)
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1861 {
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1862 return FRAMEBUFFER_ODD;
3a8c4ee68568 Added raw fbdev/evdev/ALSA render backend
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1863 }