using namespace std;
using namespace Msp;
-XineStream::XineStream(XineEngine &engine, const string &mrl)
+XineStream::XineStream(XineEngine &e, const string &mrl):
+ engine(e)
{
stream = xine_stream_new(engine.get_engine(), engine.get_audio_driver(), engine.get_video_driver());
xine_open(stream, mrl.c_str());
queue = xine_event_new_queue(stream);
+
+ check_info();
+
+ engine.add_stream(*this);
}
XineStream::~XineStream()
{
+ engine.remove_stream(*this);
+
xine_close(stream);
xine_event_dispose_queue(queue);
xine_dispose(stream);
handle_event(*event);
xine_event_free(event);
}
+
+ check_info();
+}
+
+void XineStream::check_info()
+{
+ const char *xt = xine_get_meta_info(stream, XINE_META_INFO_TITLE);
+ if(xt)
+ {
+ if(title.compare(xt))
+ {
+ title = xt;
+ signal_title_changed.emit(title);
+ }
+ }
+ else if(!title.empty())
+ {
+ title.clear();
+ signal_title_changed.emit(title);
+ }
+
+ int dur_msec, pos_msec;
+ xine_get_pos_length(stream, 0, &pos_msec, &dur_msec);
+ Time::TimeDelta dur = dur_msec*Time::msec;
+ Time::TimeDelta pos = pos_msec*Time::msec;
+ if(dur!=duration)
+ {
+ duration = dur;
+ signal_duration_changed.emit(duration);
+ }
+ if(pos!=position)
+ {
+ position = pos;
+ signal_position_changed.emit(position);
+ }
}
void XineStream::handle_event(const xine_event_t &event)