c6ff9375db02a6dc3f10f7c28cd698d4d6cfcf5e
[drnoksnes] / platform / hgw.cpp
1 #include <stdio.h>
2 #include <hgw/hgw.h>
3
4 #include "platform.h"
5 #include "hgw.h"
6 #include "snes9x.h"
7
8 #define DIE(format, ...) do { \
9                 fprintf(stderr, "Died at %s:%d: ", __FILE__, __LINE__ ); \
10                 fprintf(stderr, format "\n", ## __VA_ARGS__); \
11                 abort(); \
12         } while (0);
13
14
15
16 bool hgwLaunched;
17 static HgwContext *hgw;
18
19 void HgwInit()
20 {
21         // hildon-games-wrapper sets this env variable for itself.
22         char* service = getenv("HGW_EXEC_SERVICE");
23         
24         if (!service) {
25                 // Not launched from hildon-games-wrapper
26                 hgwLaunched = false;
27                 return;
28         }
29         
30         hgw = hgw_context_init();
31         
32         if (!hgw) {
33                 fprintf(stderr, "Error opening hgw context\n");
34                 hgwLaunched = false;
35         }
36         
37         hgwLaunched = true;
38         printf("Loading in HGW mode\n");
39 }
40
41 void HgwDeinit()
42 {
43         if (!hgwLaunched) return;
44
45         hgw_context_destroy(hgw,
46                 (Config.snapshotSave ? HGW_BYE_PAUSED : HGW_BYE_INACTIVE));
47
48         hgw = 0;
49 }
50
51 void HgwConfig()
52 {
53         if (!hgwLaunched) return;
54         
55         Config.fullscreen = true;
56         
57         char romFile[PATH_MAX + 1];
58         if (hgw_conf_request_string(hgw, kGConfRomFile, romFile) == HGW_ERR_NONE) {
59                 S9xSetRomFile(romFile);
60         } else {
61                 hgw_context_destroy(hgw, HGW_BYE_INACTIVE);
62                 DIE("No Rom in Gconf!");
63         }
64
65         char no_audio = FALSE;
66         if (hgw_conf_request_bool(hgw, kGConfDisableAudio, &no_audio) == HGW_ERR_NONE) {
67                 Config.enableAudio = no_audio ? true : false;
68         }
69
70         char turbo = FALSE;
71         if (hgw_conf_request_bool(hgw, kGConfTurboMode, &turbo) == HGW_ERR_NONE) {
72                 Settings.TurboMode = turbo ? TRUE : FALSE;
73         }
74
75         int frameskip = 0;
76         if (hgw_conf_request_int(hgw, kGConfFrameskip, &frameskip) == HGW_ERR_NONE) {
77                 Settings.SkipFrames = (frameskip > 0 ? frameskip : AUTO_FRAMERATE);
78         }
79
80         char transparency = FALSE;
81         if (hgw_conf_request_bool(hgw, kGConfTransparency, &transparency) == HGW_ERR_NONE) {
82                 Settings.Transparency = transparency ? TRUE : FALSE;
83         }
84
85         int speedhacks = 0;
86         if (hgw_conf_request_int(hgw, kGConfFrameskip, &speedhacks) == HGW_ERR_NONE) {
87                 if (speedhacks <= 0) {
88                         Settings.HacksEnabled = FALSE;
89                         Settings.HacksFilter = FALSE;
90                 } else if (speedhacks == 1) {
91                         Settings.HacksEnabled = TRUE;
92                         Settings.HacksFilter = TRUE;
93                 } else {
94                         Settings.HacksEnabled = TRUE;
95                         Settings.HacksFilter = FALSE;
96                 }
97         }
98
99         HgwStartCommand cmd = hgw_context_get_start_command(hgw);
100         switch (cmd) {
101                 default:
102                 case HGW_COMM_NONE:     // called from libosso
103                 case HGW_COMM_CONT:
104                         Config.snapshotLoad = true;
105                         Config.snapshotSave = true;
106                         break;
107                 case HGW_COMM_RESTART:
108                         Config.snapshotLoad = false;
109                         Config.snapshotSave = true;
110                         break;
111                 case HGW_COMM_QUIT:
112                         // hum, what?
113                         Config.snapshotLoad = false;
114                         Config.snapshotSave = false;
115                         Config.quitting = true;
116                         break;
117         }
118 }
119
120 void HgwPollEvents()
121 {
122         if (!hgwLaunched) return;
123         
124         HgwMessage msg;
125         HgwMessageFlags flags = HGW_MSG_FLAG_NONE;
126         
127         if ( hgw_msg_check_incoming(hgw, &msg, flags) == HGW_ERR_COMMUNICATION ) {
128                 // Message Incoming, process msg
129                 
130                 switch (msg.type) {
131                         case HGW_MSG_TYPE_CBREQ:
132                                 switch (msg.e_val) {
133                                         case HGW_CB_QUIT:
134                                         case HGW_CB_EXIT:
135                                                 Config.quitting = true;
136                                                 break;
137                                 }
138                                 break;
139                         case HGW_MSG_TYPE_DEVSTATE:
140                                 switch (msg.e_val) {
141                                         case HGW_DEVICE_STATE_SHUTDOWN:
142                                                 Config.quitting = true; // try to quit gracefully
143                                                 break;
144                                 }
145                                 break;
146                         default:
147                                 // do nothing
148                                 break;
149                 }
150                 
151                 hgw_msg_free_data(&msg);
152         }
153 }
154
155