]> git.tdb.fi Git - xinema.git/blobdiff - source/xinestream.cpp
Inform clients of stream title changes
[xinema.git] / source / xinestream.cpp
index fd2c6224fb9e6aea49551af343f829b4881d37fe..5614dd00838324e29a3483e70e16459792a02770 100644 (file)
@@ -5,16 +5,23 @@
 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);
@@ -37,6 +44,41 @@ void XineStream::tick()
                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)