]> git.tdb.fi Git - xinema.git/blobdiff - source/xinestream.cpp
Substitute "unknown" if channel language can't be determined
[xinema.git] / source / xinestream.cpp
index 49ed80c122d8fea3d50c11a55e995a8db3ff2004..7317f7c8838449e8e901676ea4b8ebce4799760a 100644 (file)
@@ -13,9 +13,8 @@ XineStream::XineStream(XineEngine &e, const string &mrl):
        channels_changed(false)
 {
        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);
+       xine_open(stream, mrl.c_str());
 
        update_channels();
        update_info();
@@ -32,26 +31,6 @@ XineStream::~XineStream()
        xine_dispose(stream);
 }
 
-void XineStream::select_audio_channel(int i)
-{
-       if(i>=0 && static_cast<unsigned>(i)>=audio_channels.size())
-               throw out_of_range("XineStream::set_audio_channel");
-
-       if(i<0)
-               i = OFF;
-       xine_set_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, (i==OFF ? -2 : i));
-}
-
-void XineStream::select_spu_channel(int i)
-{
-       if(i>=0 && static_cast<unsigned>(i)>=spu_channels.size())
-               throw out_of_range("XineStream::set_spu_channel");
-
-       if(i<0)
-               i = OFF;
-       xine_set_param(stream, XINE_PARAM_SPU_CHANNEL, (i==OFF ? -2 : i));
-}
-
 void XineStream::play()
 {
        if(state==STOPPED)
@@ -97,6 +76,26 @@ void XineStream::set_state(State s)
        signal_state_changed.emit(state);
 }
 
+void XineStream::select_audio_channel(int i)
+{
+       if(i>=0 && static_cast<unsigned>(i)>=audio_channels.size())
+               throw out_of_range("XineStream::set_audio_channel");
+
+       if(i<0)
+               i = OFF;
+       xine_set_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, (i==OFF ? -2 : i));
+}
+
+void XineStream::select_spu_channel(int i)
+{
+       if(i>=0 && static_cast<unsigned>(i)>=spu_channels.size())
+               throw out_of_range("XineStream::set_spu_channel");
+
+       if(i<0)
+               i = OFF;
+       xine_set_param(stream, XINE_PARAM_SPU_CHANNEL, (i==OFF ? -2 : i));
+}
+
 void XineStream::tick()
 {
        while(xine_event_t *event = xine_event_get(queue))
@@ -173,16 +172,20 @@ void XineStream::update_channels()
        audio_channels.resize(n_audio);
        for(unsigned i=0; i<n_audio; ++i)
        {
-               xine_get_audio_lang(stream, i, langbuf);
-               audio_channels[i].assign(langbuf);
+               if(xine_get_audio_lang(stream, i, langbuf))
+                       audio_channels[i].assign(langbuf);
+               else
+                       audio_channels[i].assign("unknown");
        }
 
        unsigned n_spu = xine_get_stream_info(stream, XINE_STREAM_INFO_MAX_SPU_CHANNEL);
        spu_channels.resize(n_spu);
        for(unsigned i=0; i<n_spu; ++i)
        {
-               xine_get_spu_lang(stream, i, langbuf);
-               spu_channels[i].assign(langbuf);
+               if(xine_get_spu_lang(stream, i, langbuf))
+                       spu_channels[i].assign(langbuf);
+               else
+                       spu_channels[i].assign("unknown");
        }
 
        signal_channels_changed.emit();