]> git.tdb.fi Git - libs/demoscene.git/blob - source/demo.cpp
Initial files lifted from the Skrolliparty 2 demo
[libs/demoscene.git] / source / demo.cpp
1 #include <msp/time/utils.h>
2 #include "demo.h"
3
4 using namespace std;
5 using namespace Msp;
6
7 Demo::Demo(Graphics::Window &window, Graphics::GLContext &gl_ctx, DataFile::Collection &r):
8         resources(r),
9         view(window, gl_ctx),
10         music_source(0),
11         streamer(0),
12         music_io(0),
13         music_decoder(0)
14 {
15         sequencer.signal_finished.connect(signal_finished);
16 }
17
18 Demo::~Demo()
19 {
20         delete streamer;
21         delete music_decoder;
22         delete music_io;
23         delete music_source;
24 }
25
26 void Demo::set_fixed_framerate(float fps)
27 {
28         frame_interval = Time::sec/fps;
29 }
30
31 void Demo::enable_music()
32 {
33         if(!music_source)
34                 music_source = new AL::Source;
35         if(!streamer)
36                 streamer = new AL::Streamer(*music_source);
37 }
38
39 void Demo::play_music(const string &fn)
40 {
41         if(!streamer)
42                 return;
43
44         streamer->stop();
45         delete music_decoder;
46         delete music_io;
47         music_io = resources.open_raw(fn);
48         music_decoder = AL::SoundDecoder::open_io(*music_io);
49         float beat = sequencer.get_current_beat();
50         if(beat)
51         {
52                 float time = beat*60/sequencer.get_beats_per_minute();
53                 unsigned bytes_per_sec = music_decoder->get_frequency()*get_unit_size(music_decoder->get_format());
54                 music_decoder->seek(time*bytes_per_sec);
55         }
56         streamer->play(*music_decoder);
57 }
58
59 void Demo::tick()
60 {
61         Time::TimeStamp t = Time::now();
62         Time::TimeDelta dt = (last_tick ? frame_interval ? frame_interval : t-last_tick : Time::zero);
63         last_tick = t;
64
65         if(frame_interval)
66                 next_frame = t+frame_interval;
67
68         sequencer.tick(dt);
69         if(streamer)
70                 streamer->tick();
71         view.render();
72 }
73
74 void Demo::seek(const Time::TimeDelta &pos)
75 {
76         sequencer.seek(pos*sequencer.get_beats_per_minute()/Time::min);
77 }