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";
75 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++) {
83 if(a
.length() > 9 && a
.substr(0, 9) == "--prefix=")
85 if(a
.length() > 8 && a
.substr(0, 8) == "--level=")
87 level
= boost::lexical_cast
<unsigned>(a
.substr(8));
88 if(level
< 0 || level
> 18)
89 throw std::runtime_error("Level out of range (0-18)");
90 } catch(std::exception
& e
) {
91 std::cerr
<< "Bad --level: " << e
.what() << std::endl
;
94 if(a
.length() > 9 && a
.substr(0, 9) == "--length=")
96 length
= boost::lexical_cast
<uint64_t>(a
.substr(9));
98 throw std::runtime_error("Length out of range (1-)");
99 } catch(std::exception
& e
) {
100 std::cerr
<< "Bad --length: " << e
.what() << std::endl
;
105 std::cerr
<< "--length=<frames> has to be specified" << std::endl
;
109 std::cerr
<< "--jmd and --sdmp are mutually exclusive" << std::endl
;
112 std::cout
<< "Invoking dumper" << std::endl
;
113 std::ostringstream cmd
;
115 cmd
<< "dump-sdmpss " << prefix
;
117 cmd
<< "dump-sdmp " << prefix
;
119 cmd
<< "dump-jmd " << level
<< " " << prefix
;
121 cmd
<< "dump-avi " << level
<< " " << prefix
;
122 command::invokeC(cmd
.str());
123 if(av_snooper::dump_in_progress()) {
124 std::cout
<< "Dumper attach confirmed" << std::endl
;
126 std::cout
<< "Can't start dumper!" << std::endl
;
129 myavsnoop
* s
= new myavsnoop(length
);
132 void startup_lua_scripts(const std::vector
<std::string
>& cmdline
)
134 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++) {
136 if(a
.length() > 6 && a
.substr(0, 6) == "--lua=") {
137 command::invokeC("run-lua " + a
.substr(6));
143 class my_interfaced
: public SNES::Interface
145 string
path(SNES::Cartridge::Slot slot
, const string
&hint
)
152 int main(int argc
, char** argv
)
154 std::vector
<std::string
> cmdline
;
155 for(int i
= 1; i
< argc
; i
++)
156 cmdline
.push_back(argv
[i
]);
158 SNES::interface
= &intrf
;
163 std::ostringstream x
;
164 x
<< snes_library_id() << " (" << SNES::Info::Profile
<< " core)";
165 bsnes_core_version
= x
.str();
169 messages
<< "BSNES version: " << bsnes_core_version
<< std::endl
;
170 messages
<< "lsnes version: lsnes rr" << lsnes_version
<< std::endl
;
171 messages
<< "Command line is: ";
172 for(auto k
= cmdline
.begin(); k
!= cmdline
.end(); k
++)
173 messages
<< "\"" << *k
<< "\" ";
174 messages
<< std::endl
;
176 std::string cfgpath
= get_config_path();
178 messages
<< "--- Loading ROM ---" << std::endl
;
181 r
= load_rom_from_commandline(cmdline
);
183 } catch(std::bad_alloc
& e
) {
185 } catch(std::exception
& e
) {
186 messages
<< "FATAL: Can't load ROM: " << e
.what() << std::endl
;
190 messages
<< "Detected region: " << gtype::tostring(r
.rtype
, r
.region
) << std::endl
;
191 if(r
.region
== REGION_PAL
)
192 set_nominal_framerate(322445.0/6448.0);
193 else if(r
.region
== REGION_NTSC
)
194 set_nominal_framerate(10738636.0/178683.0);
196 messages
<< "--- Internal memory mappings ---" << std::endl
;
198 messages
<< "--- End of Startup --- " << std::endl
;
205 for(auto i
= cmdline
.begin(); i
!= cmdline
.end(); i
++)
206 if(i
->length() > 0 && (*i
)[0] != '-') {
209 movie
= moviefile(*i
);
211 } catch(std::bad_alloc
& e
) {
213 } catch(std::exception
& e
) {
214 messages
<< "Error loading '" << *i
<< "': " << e
.what() << std::endl
;
218 throw std::runtime_error("Specifying movie is required");
220 throw std::runtime_error("Can't load any of the movies specified");
221 //Load ROM before starting the dumper.
223 our_rom
->region
= gtype::toromregion(movie
.gametype
);
225 dumper_startup(cmdline
);
226 startup_lua_scripts(cmdline
);
227 main_loop(r
, movie
, true);
228 } catch(std::bad_alloc
& e
) {
230 } catch(std::exception
& e
) {
231 messages
<< "FATAL: " << e
.what() << std::endl
;