#define XINESTREAM_H_
#include <string>
+#include <vector>
#include <xine.h>
+#include <msp/core/mutex.h>
+#include <msp/strings/lexicalcast.h>
+#include <msp/time/timedelta.h>
class XineEngine;
class XineStream
{
+public:
+ enum State
+ {
+ STOPPED,
+ PAUSED,
+ PLAYING
+ };
+
+ enum
+ {
+ OFF = -1
+ };
+
+ sigc::signal<void, State> signal_state_changed;
+ sigc::signal<void, const std::string &> signal_title_changed;
+ sigc::signal<void, const Msp::Time::TimeDelta &> signal_duration_changed;
+ sigc::signal<void, const Msp::Time::TimeDelta &> signal_position_changed;
+ sigc::signal<void, unsigned, unsigned> signal_video_size_changed;
+ sigc::signal<void, float> signal_framerate_changed;
+ sigc::signal<void, const std::string &, const std::string &> signal_codecs_changed;
+ sigc::signal<void> signal_channels_changed;
+ sigc::signal<void, int> signal_current_audio_channel_changed;
+ sigc::signal<void, int> signal_current_spu_channel_changed;
+ sigc::signal<void> signal_finished;
+
private:
+ XineEngine &engine;
+ std::string filename;
xine_stream_t *stream;
xine_event_queue_t *queue;
+ Msp::Mutex mutex;
+ State state;
+ std::string title;
+ Msp::Time::TimeDelta duration;
+ Msp::Time::TimeDelta position;
+ unsigned video_width;
+ unsigned video_height;
+ float framerate;
+ std::string video_codec;
+ std::string audio_codec;
+ std::vector<std::string> audio_channels;
+ std::vector<std::string> spu_channels;
+ int current_audio;
+ int current_spu;
+ bool channels_changed;
public:
XineStream(XineEngine &, const std::string &);
~XineStream();
+ Msp::Mutex &get_mutex() { return mutex; }
+ State get_state() const { return state; }
+ const Msp::Time::TimeDelta &get_duration() const { return duration; }
+ const Msp::Time::TimeDelta &get_position() const { return position; }
+ const std::string &get_title() const;
+ unsigned get_video_width() const { return video_width; }
+ unsigned get_video_height() const { return video_height; }
+ float get_framerate() const { return framerate; }
+ const std::string &get_video_codec() const { return video_codec; }
+ const std::string &get_audio_codec() const { return audio_codec; }
+
void play();
+ void seek(const Msp::Time::TimeDelta &);
+ void pause();
void stop();
+private:
+ void set_state(State);
+
+public:
+ const std::vector<std::string> &get_audio_channels() const { return audio_channels; }
+ const std::vector<std::string> &get_spu_channels() const { return spu_channels; }
+ void select_audio_channel(int);
+ void select_spu_channel(int);
+ int get_current_audio_channel() const { return current_audio; }
+ int get_current_spu_channel() const { return current_spu; }
void tick();
private:
+ static bool equals(const std::string &, const char *);
+ void update_info();
+ void update_channels();
void handle_event(const xine_event_t &);
};
+void operator<<(Msp::LexicalConverter &, XineStream::State);
+void operator>>(const Msp::LexicalConverter &, XineStream::State &);
+
#endif