demosys
[andemo] / src / android / main.c
index 2ec85b6..4921087 100644 (file)
@@ -1,25 +1,33 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/time.h>
 #include <EGL/egl.h>
 #include <GLES2/gl2.h>
-
 #include "demo.h"
 #include "android_native_app_glue.h"
+#include "logger.h"
+#include "demosys.h"
 
 static void handle_command(struct android_app *app, int32_t cmd);
 static int handle_input(struct android_app *app, AInputEvent *ev);
 static int handle_touch_input(struct android_app *app, AInputEvent *ev);
 static int init_gl(void);
 static void destroy_gl(void);
+static unsigned long get_time_msec(void);
+
+struct android_app *app;
 
-static struct android_app *app;
 static EGLDisplay dpy;
 static EGLSurface surf;
 static EGLContext ctx;
-static int running;
+static int init_done, paused;
 
 static int width, height;
 
+static long start_time;
+
 
 void android_main(struct android_app *app_ptr)
 {
@@ -28,6 +36,8 @@ void android_main(struct android_app *app_ptr)
        app->onAppCmd = handle_command;
        app->onInputEvent = handle_input;
 
+       start_logger();
+
        for(;;) {
                int num_events;
                struct android_poll_source *pollsrc;
@@ -41,23 +51,31 @@ void android_main(struct android_app *app_ptr)
                if(app->destroyRequested) {
                        return;
                }
-               if(running) {
+               if(init_done && !paused) {
+                       time_msec = (long)get_time_msec() - start_time;
                        demo_display();
                        eglSwapBuffers(dpy, surf);
                }
        }
 }
 
+void swap_buffers(void)
+{
+       eglSwapBuffers(dpy, surf);
+}
+
 static void handle_command(struct android_app *app, int32_t cmd)
 {
        int xsz, ysz;
 
        switch(cmd) {
        case APP_CMD_PAUSE:
-               running = 0;    /* TODO: handle timers */
+               paused = 1;     /* TODO: handle timers */
+               dsys_stop();
                break;
        case APP_CMD_RESUME:
-               running = 1;
+               paused = 0;
+               dsys_run();
                break;
 
        case APP_CMD_INIT_WINDOW:
@@ -68,11 +86,13 @@ static void handle_command(struct android_app *app, int32_t cmd)
                        exit(1);
                }
                demo_reshape(width, height);
-               running = 1;
+               start_time = (long)get_time_msec();
+               init_done = 1;
+               dsys_run();
                break;
 
        case APP_CMD_TERM_WINDOW:
-               running = 0;
+               init_done = 0;
                demo_cleanup();
                destroy_gl();
                break;
@@ -233,3 +253,16 @@ static void destroy_gl(void)
        eglTerminate(dpy);
        dpy = 0;
 }
+
+static unsigned long get_time_msec(void)
+{
+       struct timespec ts;
+       static struct timespec ts0;
+
+       clock_gettime(CLOCK_MONOTONIC, &ts);
+       if(ts0.tv_sec == 0 && ts0.tv_nsec == 0) {
+               ts0 = ts;
+               return 0;
+       }
+       return (ts.tv_sec - ts0.tv_sec) * 1000 + (ts.tv_nsec - ts0.tv_nsec) / 1000000;
+}