2 #include "mainloop.hpp"
5 #include "moviedata.hpp"
9 #include "keymapper.hpp"
13 #include <snes/snes.hpp>
14 #include <ui-libsnes/libsnes.hpp>
15 #include "framerate.hpp"
16 #include "avsnoop.hpp"
20 class myavsnoop
: public av_snooper
23 myavsnoop(uint64_t frames_to_dump
)
26 total
= frames_to_dump
;
33 void frame(struct lcscreen
& _frame
, uint32_t fps_n
, uint32_t fps_d
) throw(std::bad_alloc
,
37 if(frames_dumped
% 100 == 0) {
38 std::cout
<< "Dumping frame " << frames_dumped
<< "/" << total
<< " ("
39 << (100 * frames_dumped
/ total
) << "%)" << std::endl
;
41 if(frames_dumped
== total
) {
42 //Rough way to end it.
43 av_snooper::end(true);
48 void sample(short l
, short r
) throw(std::bad_alloc
, std::runtime_error
)
52 void end() throw(std::bad_alloc
, std::runtime_error
)
54 std::cout
<< "Finished!" << std::endl
;
57 void gameinfo(const std::string
& gamename
, const std::list
<std::pair
<std::string
, std::string
>>&
58 authors
, double gametime
, const std::string
& rerecords
) throw(std::bad_alloc
,
63 uint64_t frames_dumped
;
67 void dumper_startup(const std::vector
<std::string
>& cmdline
)
70 std::string prefix
= "avidump";
72 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++) {
74 if(a
.length() > 9 && a
.substr(0, 9) == "--prefix=")
76 if(a
.length() > 8 && a
.substr(0, 8) == "--level=")
78 level
= boost::lexical_cast
<unsigned>(a
.substr(8));
79 if(level
< 0 || level
> 18)
80 throw std::runtime_error("Level out of range (0-18)");
81 } catch(std::exception
& e
) {
82 std::cerr
<< "Bad --level: " << e
.what() << std::endl
;
85 if(a
.length() > 9 && a
.substr(0, 9) == "--length=")
87 length
= boost::lexical_cast
<uint64_t>(a
.substr(9));
89 throw std::runtime_error("Length out of range (1-)");
90 } catch(std::exception
& e
) {
91 std::cerr
<< "Bad --length: " << e
.what() << std::endl
;
96 std::cerr
<< "--length=<frames> has to be specified" << std::endl
;
99 std::cout
<< "Invoking dumper" << std::endl
;
100 std::ostringstream cmd
;
101 cmd
<< "dump-avi " << level
<< " " << prefix
;
102 command::invokeC(cmd
.str());
103 if(av_snooper::dump_in_progress()) {
104 std::cout
<< "Dumper attach confirmed" << std::endl
;
106 std::cout
<< "Can't start dumper!" << std::endl
;
109 myavsnoop
* s
= new myavsnoop(length
);
112 void startup_lua_scripts(const std::vector
<std::string
>& cmdline
)
114 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++) {
116 if(a
.length() > 6 && a
.substr(0, 6) == "--lua=") {
117 command::invokeC("run-lua " + a
.substr(6));
123 class my_interfaced
: public SNES::Interface
125 string
path(SNES::Cartridge::Slot slot
, const string
&hint
)
132 int main(int argc
, char** argv
)
134 std::vector
<std::string
> cmdline
;
135 for(int i
= 1; i
< argc
; i
++)
136 cmdline
.push_back(argv
[i
]);
138 SNES::system
.interface
= &intrf
;
143 std::ostringstream x
;
144 x
<< snes_library_id() << " (" << SNES::Info::Profile
<< " core)";
145 bsnes_core_version
= x
.str();
149 messages
<< "BSNES version: " << bsnes_core_version
<< std::endl
;
150 messages
<< "lsnes version: lsnes rr" << lsnes_version
<< std::endl
;
151 messages
<< "Command line is: ";
152 for(auto k
= cmdline
.begin(); k
!= cmdline
.end(); k
++)
153 messages
<< "\"" << *k
<< "\" ";
154 messages
<< std::endl
;
156 std::string cfgpath
= get_config_path();
158 messages
<< "--- Loading ROM ---" << std::endl
;
161 r
= load_rom_from_commandline(cmdline
);
163 } catch(std::bad_alloc
& e
) {
165 } catch(std::exception
& e
) {
166 messages
<< "FATAL: Can't load ROM: " << e
.what() << std::endl
;
170 messages
<< "Detected region: " << gtype::tostring(r
.rtype
, r
.region
) << std::endl
;
171 if(r
.region
== REGION_PAL
)
172 set_nominal_framerate(322445.0/6448.0);
173 else if(r
.region
== REGION_NTSC
)
174 set_nominal_framerate(10738636.0/178683.0);
176 messages
<< "--- Internal memory mappings ---" << std::endl
;
178 messages
<< "--- End of Startup --- " << std::endl
;
180 dumper_startup(cmdline
);
181 startup_lua_scripts(cmdline
);
187 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++)
188 if(i
->length() > 0 && (*i
)[0] != '-') {
191 movie
= moviefile(*i
);
193 } catch(std::bad_alloc
& e
) {
195 } catch(std::exception
& e
) {
196 messages
<< "Error loading '" << *i
<< "': " << e
.what() << std::endl
;
200 throw std::runtime_error("Specifying movie is required");
202 throw std::runtime_error("Can't load any of the movies specified");
203 main_loop(r
, movie
, true);
204 } catch(std::bad_alloc
& e
) {
206 } catch(std::exception
& e
) {
207 messages
<< "FATAL: " << e
.what() << std::endl
;