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