XineStream::XineStream(XineEngine &e, const string &mrl):
engine(e),
- state(STOPPED)
+ state(STOPPED),
+ 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);
update_info();
+ update_channels();
engine.add_stream(*this);
}
xine_dispose(stream);
}
+void XineStream::set_audio_channel(unsigned i)
+{
+ if(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);
+}
+
+void XineStream::set_spu_channel(unsigned i)
+{
+ if(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);
+}
+
void XineStream::play()
{
if(state==STOPPED)
}
update_info();
+
+ if(channels_changed)
+ {
+ channels_changed = false;
+ update_channels();
+ }
}
void XineStream::update_info()
}
}
+void XineStream::update_channels()
+{
+ MutexLock lock(mutex);
+ char langbuf[XINE_LANG_MAX];
+
+ unsigned n_audio = xine_get_stream_info(stream, XINE_STREAM_INFO_MAX_AUDIO_CHANNEL);
+ 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);
+ }
+
+ 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);
+ }
+
+ signal_channels_changed.emit();
+}
+
void XineStream::handle_event(const xine_event_t &event)
{
switch(event.type)
set_state(STOPPED);
signal_finished.emit();
break;
+ case XINE_EVENT_UI_CHANNELS_CHANGED:
+ channels_changed = true;
+ break;
}
}