forked from libretro/RetroArch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
driver.c
148 lines (127 loc) · 2.99 KB
/
driver.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "driver.h"
#include "config.h"
#include "general.h"
#include <stdio.h>
void init_drivers(void)
{
init_video_input();
init_audio();
}
void uninit_drivers(void)
{
uninit_video_input();
uninit_audio();
}
void init_audio(void)
{
if (!audio_enable)
{
audio_active = false;
return;
}
driver.audio_data = driver.audio->init(audio_device, out_rate, out_latency);
if ( driver.audio_data == NULL )
audio_active = false;
if (!audio_sync && audio_active)
driver.audio->set_nonblock_state(driver.audio_data, true);
int err;
source = src_new(SAMPLERATE_QUALITY, 2, &err);
if (!source)
audio_active = false;
}
void uninit_audio(void)
{
if (!audio_enable)
{
audio_active = false;
return;
}
if ( driver.audio_data && driver.audio )
driver.audio->free(driver.audio_data);
if ( source )
src_delete(source);
}
void init_video_input(void)
{
int scale;
// We multiply scales with 2 to allow for hi-res games.
#if VIDEO_FILTER == FILTER_NONE
scale = 2;
#elif VIDEO_FILTER == FILTER_HQ2X
scale = 4;
#elif VIDEO_FILTER == FILTER_HQ4X
scale = 8;
#elif VIDEO_FILTER == FILTER_NTSC
scale = 8;
#elif VIDEO_FILTER == FILTER_GRAYSCALE
scale = 2;
#elif VIDEO_FILTER == FILTER_BLEED
scale = 2;
#else
scale = 2;
#endif
video_info_t video = {
.width = (fullscreen) ? fullscreen_x : (296 * xscale),
.height = (fullscreen) ? fullscreen_y : (224 * yscale),
.fullscreen = fullscreen,
.vsync = vsync,
.force_aspect = force_aspect,
.smooth = video_smooth,
.input_scale = scale,
};
const input_driver_t *tmp = driver.input;
driver.video_data = driver.video->init(&video, &(driver.input));
if ( driver.video_data == NULL )
{
SSNES_ERR("Cannot open video driver... Exiting ...\n");
exit(1);
}
if ( driver.input != NULL )
{
driver.input_data = driver.video_data;
}
else
{
driver.input = tmp;
if (driver.input != NULL)
{
driver.input_data = driver.input->init();
if ( driver.input_data == NULL )
exit(1);
}
else
{
SSNES_ERR("Cannot find input driver. Exiting ...\n");
exit(1);
}
}
}
void uninit_video_input(void)
{
if ( driver.video_data && driver.video )
driver.video->free(driver.video_data);
if ( driver.input_data != driver.video_data && driver.input )
driver.input->free(driver.input_data);
}
bool video_active = true;
bool audio_active = true;
driver_t driver = {
#if VIDEO_DRIVER == VIDEO_GL
.video = &video_gl,
#else
#error "Define a valid video driver in config.h"
#endif
#if AUDIO_DRIVER == AUDIO_RSOUND
.audio = &audio_rsound,
#elif AUDIO_DRIVER == AUDIO_OSS
.audio = &audio_oss,
#elif AUDIO_DRIVER == AUDIO_ALSA
.audio = &audio_alsa,
#elif AUDIO_DRIVER == AUDIO_ROAR
.audio = &audio_roar,
#elif AUDIO_DRIVER == AUDIO_AL
.audio = &audio_openal,
#else
#error "Define a valid audio driver in config.h"
#endif
};