]> git.tdb.fi Git - xinema.git/blob - source/xinestream.cpp
Export some simple playback information to clients
[xinema.git] / source / xinestream.cpp
1 #include <msp/io/print.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 {
11         stream = xine_stream_new(engine.get_engine(), engine.get_audio_driver(), engine.get_video_driver());
12         xine_open(stream, mrl.c_str());
13
14         queue = xine_event_new_queue(stream);
15
16         engine.add_stream(*this);
17 }
18
19 XineStream::~XineStream()
20 {
21         engine.remove_stream(*this);
22
23         xine_close(stream);
24         xine_event_dispose_queue(queue);
25         xine_dispose(stream);
26 }
27
28 string XineStream::get_title() const
29 {
30         const char *title = xine_get_meta_info(stream, XINE_META_INFO_TITLE);
31         return (title ? title : string());
32 }
33
34 void XineStream::play()
35 {
36         xine_play(stream, 0, 0);
37 }
38
39 void XineStream::stop()
40 {
41         xine_stop(stream);
42 }
43
44 void XineStream::tick()
45 {
46         while(xine_event_t *event = xine_event_get(queue))
47         {
48                 handle_event(*event);
49                 xine_event_free(event);
50         }
51
52         int dur_msec, pos_msec;
53         xine_get_pos_length(stream, 0, &pos_msec, &dur_msec);
54         Time::TimeDelta dur = dur_msec*Time::msec;
55         Time::TimeDelta pos = pos_msec*Time::msec;
56         if(dur!=duration)
57         {
58                 duration = dur;
59                 signal_duration_changed.emit(duration);
60         }
61         if(pos!=position)
62         {
63                 position = pos;
64                 signal_position_changed.emit(position);
65         }
66 }
67
68 void XineStream::handle_event(const xine_event_t &event)
69 {
70         switch(event.type)
71         {
72         case XINE_EVENT_PROGRESS:
73                 {
74                         xine_progress_data_t *data = reinterpret_cast<xine_progress_data_t *>(event.data);
75                         IO::print("%s [%d%%]\n", data->description, data->percent);
76                 }
77                 break;
78         }
79 }