]> git.tdb.fi Git - xinema.git/blob - source/xinestream.h
Create an icon for the remote
[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         enum
24         {
25                 OFF = -1
26         };
27
28         sigc::signal<void, State> signal_state_changed;
29         sigc::signal<void, const std::string &> signal_title_changed;
30         sigc::signal<void, const Msp::Time::TimeDelta &> signal_duration_changed;
31         sigc::signal<void, const Msp::Time::TimeDelta &> signal_position_changed;
32         sigc::signal<void, unsigned, unsigned> signal_video_size_changed;
33         sigc::signal<void, float> signal_framerate_changed;
34         sigc::signal<void, const std::string &, const std::string &> signal_codecs_changed;
35         sigc::signal<void> signal_channels_changed;
36         sigc::signal<void, int> signal_current_audio_channel_changed;
37         sigc::signal<void, int> signal_current_spu_channel_changed;
38         sigc::signal<void> signal_finished;
39
40 private:
41         XineEngine &engine;
42         std::string filename;
43         xine_stream_t *stream;
44         xine_event_queue_t *queue;
45         Msp::Mutex mutex;
46         State state;
47         std::string title;
48         Msp::Time::TimeDelta duration;
49         Msp::Time::TimeDelta position;
50         unsigned video_width;
51         unsigned video_height;
52         float framerate;
53         std::string video_codec;
54         std::string audio_codec;
55         std::vector<std::string> audio_channels;
56         std::vector<std::string> spu_channels;
57         int current_audio;
58         int current_spu;
59         bool channels_changed;
60
61 public:
62         XineStream(XineEngine &, const std::string &);
63         ~XineStream();
64
65         Msp::Mutex &get_mutex() { return mutex; }
66         State get_state() const { return state; }
67         const Msp::Time::TimeDelta &get_duration() const { return duration; }
68         const Msp::Time::TimeDelta &get_position() const { return position; }
69         const std::string &get_title() const;
70         unsigned get_video_width() const { return video_width; }
71         unsigned get_video_height() const { return video_height; }
72         float get_framerate() const { return framerate; }
73         const std::string &get_video_codec() const { return video_codec; }
74         const std::string &get_audio_codec() const { return audio_codec; }
75
76         void play();
77         void seek(const Msp::Time::TimeDelta &);
78         void pause();
79         void stop();
80 private:
81         void set_state(State);
82
83 public:
84         const std::vector<std::string> &get_audio_channels() const { return audio_channels; }
85         const std::vector<std::string> &get_spu_channels() const { return spu_channels; }
86         void select_audio_channel(int);
87         void select_spu_channel(int);
88         int get_current_audio_channel() const { return current_audio; }
89         int get_current_spu_channel() const { return current_spu; }
90
91         void tick();
92 private:
93         static bool equals(const std::string &, const char *);
94         void update_info();
95         void update_channels();
96         void handle_event(const xine_event_t &);
97 };
98
99 void operator<<(Msp::LexicalConverter &, XineStream::State);
100 void operator>>(const Msp::LexicalConverter &, XineStream::State &);
101
102 #endif