]> git.tdb.fi Git - xinema.git/blob - source/xinestream.h
Locking fix
[xinema.git] / source / xinestream.h
1 #ifndef XINESTREAM_H_
2 #define XINESTREAM_H_
3
4 #include <string>
5 #include <xine.h>
6 #include <msp/core/mutex.h>
7 #include <msp/strings/lexicalcast.h>
8 #include <msp/time/timedelta.h>
9
10 class XineEngine;
11
12 class XineStream
13 {
14 public:
15         enum State
16         {
17                 STOPPED,
18                 PAUSED,
19                 PLAYING
20         };
21
22         sigc::signal<void, State> signal_state_changed;
23         sigc::signal<void, const std::string &> signal_title_changed;
24         sigc::signal<void, const Msp::Time::TimeDelta &> signal_duration_changed;
25         sigc::signal<void, const Msp::Time::TimeDelta &> signal_position_changed;
26
27 private:
28         XineEngine &engine;
29         xine_stream_t *stream;
30         xine_event_queue_t *queue;
31         Msp::Mutex mutex;
32         State state;
33         std::string title;
34         Msp::Time::TimeDelta duration;
35         Msp::Time::TimeDelta position;
36
37 public:
38         XineStream(XineEngine &, const std::string &);
39         ~XineStream();
40
41         Msp::Mutex &get_mutex() { return mutex; }
42         State get_state() const { return state; }
43         const Msp::Time::TimeDelta &get_duration() const { return duration; }
44         const Msp::Time::TimeDelta &get_position() const { return position; }
45         const std::string &get_title() const { return title; }
46
47         void play();
48         void seek(const Msp::Time::TimeDelta &);
49         void pause();
50         void stop();
51 private:
52         void set_state(State);
53
54 public:
55         void tick();
56 private:
57         void update_info();
58         void handle_event(const xine_event_t &);
59 };
60
61 void operator<<(Msp::LexicalConverter &, XineStream::State);
62 void operator>>(const Msp::LexicalConverter &, XineStream::State &);
63
64 #endif