#include <sigc++/bind.h>
-#include <msp/core/getopt.h>
#include <msp/fs/dir.h>
#include <msp/graphics/display_private.h>
-#include <msp/graphics/window_private.h>
-#include <msp/io/print.h>
+#include <msp/time/utils.h>
+#include "xineengine.h"
#include "xinema.h"
+#include "xinestream.h"
using namespace std;
using namespace Msp;
}
-Xinema::Xinema(int argc, char **argv):
- window(display, 1920, 1080)
+Xinema::Xinema(int, char **):
+ window(display, 1920, 1080),
+ network(*this),
+ engine(0),
+ stream(0)
{
- GetOpt getopt;
- getopt.add_argument("filename", filename, GetOpt::REQUIRED_ARG);
- getopt(argc, argv);
-
window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Xinema::exit), 0));
}
int Xinema::main()
{
- xine = xine_new();
-
- FS::Path config_fn = FS::get_home_dir()/".xine"/"config";
- xine_config_load(xine, config_fn.c_str());
-
- xine_init(xine);
-
- xine_audio = xine_open_audio_driver(xine, "auto", 0);
-
- XLockDisplay(display.get_private().display);
window.show();
- XSync(display.get_private().display, false);
- XUnlockDisplay(display.get_private().display);
-
- xine_visual.display = display.get_private().display;
- xine_visual.screen = 0;
- xine_visual.d = window.get_private().window;
- xine_visual.user_data = this;
- xine_visual.dest_size_cb = &dest_size_cb;
- xine_visual.frame_output_cb = &frame_output_cb;
-
- xine_video = xine_open_video_driver(xine, "auto", XINE_VISUAL_TYPE_X11, &xine_visual);
-
- xine_stream = xine_stream_new(xine, xine_audio, xine_video);
- xine_open(xine_stream, filename.c_str());
- xine_play(xine_stream, 0, 0);
+ display.tick();
- xine_queue = xine_event_new_queue(xine_stream);
+ engine = new XineEngine(window);
+ play_file(FS::get_sys_data_dir()/"xinema.png");
Application::main();
- xine_close(xine_stream);
- xine_event_dispose_queue(xine_queue);
- xine_dispose(xine_stream);
- xine_close_video_driver(xine, xine_video);
- xine_close_audio_driver(xine, xine_audio);
- xine_exit(xine);
+ if(stream)
+ delete stream;
+ delete engine;
return exit_code;
}
void Xinema::tick()
{
- XLockDisplay(display.get_private().display);
- display.tick();
- XUnlockDisplay(display.get_private().display);
+ bool new_stream = false;
- while(xine_event_t *event = xine_event_get(xine_queue))
{
- switch(event->type)
+ MutexLock lock(command_mutex);
+ if(!pending_mrl.empty())
{
- case XINE_EVENT_PROGRESS:
- {
- xine_progress_data_t *data = reinterpret_cast<xine_progress_data_t *>(event->data);
- IO::print("%s [%d%%]\n", data->description, data->percent);
- }
- break;
+ delete stream;
+ stream = new XineStream(*engine, pending_mrl);
+ stream->play();
+ pending_mrl.clear();
+ new_stream = true;
}
}
-}
-void Xinema::dest_size_cb(void *user_data, int, int, double, int *dest_width, int *dest_height, double *dest_pixel_aspect)
-{
- Xinema &xinema = *reinterpret_cast<Xinema *>(user_data);
- *dest_width = xinema.window.get_width();
- *dest_height = xinema.window.get_height();
- *dest_pixel_aspect = 1.0;
+ if(new_stream)
+ signal_stream_created.emit(*stream);
+
+ XLockDisplay(display.get_private().display);
+ display.tick();
+ XUnlockDisplay(display.get_private().display);
+
+ engine->tick();
+
+ Time::sleep(10*Time::msec);
}
-void Xinema::frame_output_cb(void *user_data, int, int, double, int *dest_x, int *dest_y, int *dest_width, int *dest_height, double *dest_pixel_aspect, int *win_x, int *win_y)
+void Xinema::play_file(const FS::Path &fn)
{
- Xinema &xinema = *reinterpret_cast<Xinema *>(user_data);
- *dest_x = 0;
- *dest_y = 0;
- *dest_width = xinema.window.get_width();
- *dest_height = xinema.window.get_height();
- *dest_pixel_aspect = 1.0;
- *win_x = 0;
- *win_y = 0;
+ MutexLock lock(command_mutex);
+ pending_mrl = "file://"+fn.str();
}