]> git.tdb.fi Git - xinema.git/blob - source/xinestream.cpp
Rename check_info to update_info
[xinema.git] / source / xinestream.cpp
1 #include <msp/strings/format.h>
2 #include "xineengine.h"
3 #include "xinestream.h"
4
5 using namespace std;
6 using namespace Msp;
7
8 XineStream::XineStream(XineEngine &e, const string &mrl):
9         engine(e),
10         state(STOPPED)
11 {
12         stream = xine_stream_new(engine.get_engine(), engine.get_audio_driver(), engine.get_video_driver());
13         xine_open(stream, mrl.c_str());
14
15         queue = xine_event_new_queue(stream);
16
17         update_info();
18
19         engine.add_stream(*this);
20 }
21
22 XineStream::~XineStream()
23 {
24         engine.remove_stream(*this);
25
26         xine_close(stream);
27         xine_event_dispose_queue(queue);
28         xine_dispose(stream);
29 }
30
31 void XineStream::play()
32 {
33         if(state==STOPPED)
34                 xine_play(stream, 0, 0);
35         else if(state==PAUSED)
36                 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
37
38         set_state(PLAYING);
39 }
40
41 void XineStream::seek(const Time::TimeDelta &time)
42 {
43         xine_play(stream, 0, time/Time::msec);
44         if(state!=PLAYING)
45         {
46                 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
47                 set_state(PAUSED);
48         }
49 }
50
51 void XineStream::pause()
52 {
53         if(state==PLAYING)
54         {
55                 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
56                 set_state(PAUSED);
57         }
58 }
59
60 void XineStream::stop()
61 {
62         xine_stop(stream);
63         set_state(STOPPED);
64 }
65
66 void XineStream::set_state(State s)
67 {
68         if(s==state)
69                 return;
70
71         MutexLock lock(mutex);
72         state = s;
73         signal_state_changed.emit(state);
74 }
75
76 void XineStream::tick()
77 {
78         while(xine_event_t *event = xine_event_get(queue))
79         {
80                 handle_event(*event);
81                 xine_event_free(event);
82         }
83
84         update_info();
85 }
86
87 void XineStream::update_info()
88 {
89         const char *xt = xine_get_meta_info(stream, XINE_META_INFO_TITLE);
90         if((xt && title.compare(xt)) || (!xt && !title.empty()))
91         {
92                 MutexLock lock(mutex);
93                 title = (xt ? xt : string());
94                 signal_title_changed.emit(title);
95         }
96
97         int dur_msec, pos_msec;
98         xine_get_pos_length(stream, 0, &pos_msec, &dur_msec);
99         Time::TimeDelta dur = dur_msec*Time::msec;
100         Time::TimeDelta pos = pos_msec*Time::msec;
101         if(dur!=duration)
102         {
103                 MutexLock lock(mutex);
104                 duration = dur;
105                 signal_duration_changed.emit(duration);
106         }
107         if(pos!=position)
108         {
109                 MutexLock lock(mutex);
110                 position = pos;
111                 signal_position_changed.emit(position);
112         }
113 }
114
115 void XineStream::handle_event(const xine_event_t &event)
116 {
117         switch(event.type)
118         {
119         case XINE_EVENT_UI_PLAYBACK_FINISHED:
120                 set_state(STOPPED);
121                 signal_finished.emit();
122                 break;
123         }
124 }
125
126
127 void operator<<(LexicalConverter &conv, XineStream::State state)
128 {
129         switch(state)
130         {
131         case XineStream::STOPPED: conv.result("STOPPED"); return;
132         case XineStream::PAUSED: conv.result("PAUSED"); return;
133         case XineStream::PLAYING: conv.result("PLAYING"); return;
134         default: conv.result(format("State(%d)", static_cast<int>(state))); return;
135         }
136 }
137
138 void operator>>(const LexicalConverter &conv, XineStream::State &state)
139 {
140         const string &str = conv.get();
141         if(str=="STOPPED")
142                 state = XineStream::STOPPED;
143         else if(str=="PAUSED")
144                 state = XineStream::PAUSED;
145         else if(str=="PLAYING")
146                 state = XineStream::PLAYING;
147         else
148                 throw lexical_error(format("Conversion of '%s' to XineStream::State", str));
149 }