1 #include <msp/io/print.h>
2 #include "xineengine.h"
3 #include "xinestream.h"
8 XineStream::XineStream(XineEngine &e, const string &mrl):
12 stream = xine_stream_new(engine.get_engine(), engine.get_audio_driver(), engine.get_video_driver());
13 xine_open(stream, mrl.c_str());
15 queue = xine_event_new_queue(stream);
19 engine.add_stream(*this);
22 XineStream::~XineStream()
24 engine.remove_stream(*this);
27 xine_event_dispose_queue(queue);
31 void XineStream::play()
34 xine_play(stream, 0, 0);
35 else if(state==PAUSED)
36 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
41 void XineStream::seek(const Time::TimeDelta &time)
43 xine_play(stream, 0, time/Time::msec);
46 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
51 void XineStream::pause()
55 xine_set_param(stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
60 void XineStream::stop()
66 void XineStream::set_state(State s)
72 signal_state_changed.emit(state);
75 void XineStream::tick()
77 while(xine_event_t *event = xine_event_get(queue))
80 xine_event_free(event);
86 void XineStream::check_info()
88 const char *xt = xine_get_meta_info(stream, XINE_META_INFO_TITLE);
94 signal_title_changed.emit(title);
97 else if(!title.empty())
100 signal_title_changed.emit(title);
103 int dur_msec, pos_msec;
104 xine_get_pos_length(stream, 0, &pos_msec, &dur_msec);
105 Time::TimeDelta dur = dur_msec*Time::msec;
106 Time::TimeDelta pos = pos_msec*Time::msec;
110 signal_duration_changed.emit(duration);
115 signal_position_changed.emit(position);
119 void XineStream::handle_event(const xine_event_t &event)
123 case XINE_EVENT_UI_PLAYBACK_FINISHED:
126 case XINE_EVENT_PROGRESS:
128 xine_progress_data_t *data = reinterpret_cast<xine_progress_data_t *>(event.data);
129 IO::print("%s [%d%%]\n", data->description, data->percent);
136 void operator<<(LexicalConverter &conv, XineStream::State state)
140 case XineStream::STOPPED: conv.result("STOPPED"); return;
141 case XineStream::PAUSED: conv.result("PAUSED"); return;
142 case XineStream::PLAYING: conv.result("PLAYING"); return;
143 default: conv.result(format("State(%d)", static_cast<int>(state))); return;
147 void operator>>(const LexicalConverter &conv, XineStream::State &state)
149 const string &str = conv.get();
151 state = XineStream::STOPPED;
152 else if(str=="PAUSED")
153 state = XineStream::PAUSED;
154 else if(str=="PLAYING")
155 state = XineStream::PLAYING;
157 throw lexical_error(format("Conversion of '%s' to XineStream::State", str));