]> git.tdb.fi Git - libs/demoscene.git/blob - source/demo.cpp
Make some simple actions loadable
[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         things["window"] = static_cast<GL::View *>(&view);
16
17         sequencer.signal_finished.connect(signal_finished);
18 }
19
20 Demo::~Demo()
21 {
22         delete streamer;
23         delete music_decoder;
24         delete music_io;
25         delete music_source;
26 }
27
28 void Demo::set_fixed_framerate(float fps)
29 {
30         frame_interval = Time::sec/fps;
31 }
32
33 void Demo::enable_music()
34 {
35         if(!music_source)
36                 music_source = new AL::Source;
37         if(!streamer)
38                 streamer = new AL::Streamer(*music_source);
39 }
40
41 void Demo::play_music(const string &fn)
42 {
43         if(!streamer)
44                 return;
45
46         streamer->stop();
47         delete music_decoder;
48         delete music_io;
49         music_io = resources.open_raw(fn);
50         music_decoder = AL::SoundDecoder::open_io(*music_io);
51         float beat = sequencer.get_current_beat();
52         if(beat)
53         {
54                 float time = beat*60/sequencer.get_beats_per_minute();
55                 unsigned bytes_per_sec = music_decoder->get_frequency()*get_unit_size(music_decoder->get_format());
56                 music_decoder->seek(time*bytes_per_sec);
57         }
58         streamer->play(*music_decoder);
59 }
60
61 void Demo::tick()
62 {
63         Time::TimeStamp t = Time::now();
64         Time::TimeDelta dt = (last_tick ? frame_interval ? frame_interval : t-last_tick : Time::zero);
65         last_tick = t;
66
67         if(frame_interval)
68                 next_frame = t+frame_interval;
69
70         sequencer.tick(dt);
71         if(streamer)
72                 streamer->tick();
73         view.render();
74 }
75
76 void Demo::seek(const Time::TimeDelta &pos)
77 {
78         sequencer.seek(pos*sequencer.get_beats_per_minute()/Time::min);
79 }