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());
queue = xine_event_new_queue(stream);
- update_info();
update_channels();
+ update_info();
engine.add_stream(*this);
}
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()
xine_event_free(event);
}
- update_info();
-
if(channels_changed)
{
channels_changed = false;
update_channels();
}
+
+ update_info();
}
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()