X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fxinestream.cpp;fp=source%2Fxinestream.cpp;h=49ed80c122d8fea3d50c11a55e995a8db3ff2004;hb=85d198e71b7d1d6279db4e2f22d9a1393b8369ff;hp=a702b28b335e66ce0ed840c1d11f68da83aa22aa;hpb=a4982bb4d3fd9908aa01c824ac6202ac8618ac24;p=xinema.git diff --git a/source/xinestream.cpp b/source/xinestream.cpp index a702b28..49ed80c 100644 --- a/source/xinestream.cpp +++ b/source/xinestream.cpp @@ -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(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(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()