X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fxinestream.cpp;h=4fc2e88fa1f569bcf2ef811117d2a02eb8bbef11;hb=afa557f5c0b0debaaaf6c4c777ccc2ba10965c50;hp=0e038a77974fb5da2ee997922654ae0308e18d84;hpb=dac7d0bfd1ec77eba70da440add4bb95e03228e1;p=xinema.git diff --git a/source/xinestream.cpp b/source/xinestream.cpp index 0e038a7..4fc2e88 100644 --- a/source/xinestream.cpp +++ b/source/xinestream.cpp @@ -7,18 +7,28 @@ using namespace Msp; XineStream::XineStream(XineEngine &e, const string &mrl): engine(e), - state(STOPPED) + filename(mrl.substr(mrl.rfind('/')+1)), + state(STOPPED), + title(filename), + current_audio(0), + current_spu(OFF), + 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()); - check_info(); + update_channels(); + update_info(); engine.add_stream(*this); } +const string &XineStream::get_title() const +{ + return title.empty() ? filename : title; +} + XineStream::~XineStream() { engine.remove_stream(*this); @@ -73,6 +83,26 @@ void XineStream::set_state(State s) signal_state_changed.emit(state); } +void XineStream::select_audio_channel(int i) +{ + if(i>=0 && static_cast(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(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)) @@ -81,17 +111,23 @@ void XineStream::tick() xine_event_free(event); } - check_info(); + if(channels_changed) + { + channels_changed = false; + update_channels(); + } + + update_info(); } -void XineStream::check_info() +void XineStream::update_info() { const char *xt = xine_get_meta_info(stream, XINE_META_INFO_TITLE); if((xt && title.compare(xt)) || (!xt && !title.empty())) { MutexLock lock(mutex); title = (xt ? xt : string()); - signal_title_changed.emit(title); + signal_title_changed.emit(get_title()); } int dur_msec, pos_msec; @@ -110,6 +146,56 @@ void XineStream::check_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() +{ + 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