]> git.tdb.fi Git - xinema.git/blobdiff - source/xinestream.cpp
Revise the channel interface
[xinema.git] / source / xinestream.cpp
index a702b28b335e66ce0ed840c1d11f68da83aa22aa..49ed80c122d8fea3d50c11a55e995a8db3ff2004 100644 (file)
@@ -8,6 +8,8 @@ using namespace Msp;
 XineStream::XineStream(XineEngine &e, const string &mrl):
        engine(e),
        state(STOPPED),
+       current_audio(0),
+       current_spu(OFF),
        channels_changed(false)
 {
        stream = xine_stream_new(engine.get_engine(), engine.get_audio_driver(), engine.get_video_driver());
@@ -15,8 +17,8 @@ XineStream::XineStream(XineEngine &e, const string &mrl):
 
        queue = xine_event_new_queue(stream);
 
-       update_info();
        update_channels();
+       update_info();
 
        engine.add_stream(*this);
 }
@@ -30,30 +32,24 @@ XineStream::~XineStream()
        xine_dispose(stream);
 }
 
-void XineStream::set_audio_channel(unsigned i)
+void XineStream::select_audio_channel(int i)
 {
-       if(i>=audio_channels.size())
+       if(i>=0 && static_cast<unsigned>(i)>=audio_channels.size())
                throw out_of_range("XineStream::set_audio_channel");
 
-       xine_set_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, i);
-}
-
-void XineStream::set_audio_off()
-{
-       xine_set_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, -2);
+       if(i<0)
+               i = OFF;
+       xine_set_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, (i==OFF ? -2 : i));
 }
 
-void XineStream::set_spu_channel(unsigned i)
+void XineStream::select_spu_channel(int i)
 {
-       if(i>=spu_channels.size())
+       if(i>=0 && static_cast<unsigned>(i)>=spu_channels.size())
                throw out_of_range("XineStream::set_spu_channel");
 
-       xine_set_param(stream, XINE_PARAM_SPU_CHANNEL, i);
-}
-
-void XineStream::set_spu_off()
-{
-       xine_set_param(stream, XINE_PARAM_SPU_CHANNEL, -2);
+       if(i<0)
+               i = OFF;
+       xine_set_param(stream, XINE_PARAM_SPU_CHANNEL, (i==OFF ? -2 : i));
 }
 
 void XineStream::play()
@@ -109,13 +105,13 @@ void XineStream::tick()
                xine_event_free(event);
        }
 
-       update_info();
-
        if(channels_changed)
        {
                channels_changed = false;
                update_channels();
        }
+
+       update_info();
 }
 
 void XineStream::update_info()
@@ -144,6 +140,28 @@ void XineStream::update_info()
                position = pos;
                signal_position_changed.emit(position);
        }
+
+       int audio = xine_get_param(stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL);
+       if(audio==-1 && !audio_channels.empty())
+               audio = 0;
+       else if(audio<0)
+               audio = OFF;
+       if(audio!=current_audio)
+       {
+               MutexLock lock(mutex);
+               current_audio = audio;
+               signal_current_audio_channel_changed.emit(current_audio);
+       }
+
+       int spu = xine_get_param(stream, XINE_PARAM_SPU_CHANNEL);
+       if(spu<0)
+               spu = OFF;
+       if(spu!=current_spu)
+       {
+               MutexLock lock(mutex);
+               current_spu = spu;
+               signal_current_spu_channel_changed.emit(current_spu);
+       }
 }
 
 void XineStream::update_channels()