jni: add a wait for window in egl for android, and use a live copy
authorCory Fields <theuni-nospam-@xbmc.org>
Mon, 29 Apr 2013 21:50:00 +0000 (17:50 -0400)
committerTrent Nelson <trent.a.b.nelson@gmail.com>
Tue, 24 Sep 2013 02:24:30 +0000 (22:24 -0400)
xbmc/android/activity/XBMCApp.cpp
xbmc/android/activity/XBMCApp.h
xbmc/windowing/egl/EGLNativeTypeAndroid.cpp

index 9f8e8c1..f132fbd 100644 (file)
@@ -81,7 +81,7 @@ void* thread_run(void* obj)
   (static_cast<T*>(obj)->*fn)();
   return NULL;
 }
-
+CEvent CXBMCApp::m_windowCreated;
 ANativeActivity *CXBMCApp::m_activity = NULL;
 ANativeWindow* CXBMCApp::m_window = NULL;
 int CXBMCApp::m_batteryLevel = 0;
@@ -187,6 +187,7 @@ void CXBMCApp::onCreateWindow(ANativeWindow* window)
     return;
   }
   m_window = window;
+  m_windowCreated.Set();
   if (getWakeLock() &&  m_wakeLock)
     m_wakeLock->acquire();
   if(!m_firstrun)
@@ -199,6 +200,8 @@ void CXBMCApp::onCreateWindow(ANativeWindow* window)
 void CXBMCApp::onResizeWindow()
 {
   android_printf("%s: ", __PRETTY_FUNCTION__);
+  m_window=NULL;
+  m_windowCreated.Reset();
   // no need to do anything because we are fixed in fullscreen landscape mode
 }
 
@@ -216,7 +219,6 @@ void CXBMCApp::onDestroyWindow()
   if (m_wakeLock)
     m_wakeLock->release();
 
-  m_window=NULL;
 }
 
 void CXBMCApp::onGainFocus()
@@ -264,12 +266,6 @@ void CXBMCApp::run()
     free(argv);
   }
 
-  android_printf(" => waiting for a window");
-  // Hack!
-  // TODO: Change EGL startup so that we can start headless, then create the
-  // window once android gives us a surface to play with.
-  while(!m_window)
-    usleep(1000);
   m_firstrun=false;
   android_printf(" => running XBMC_Run...");
   try
@@ -598,3 +594,12 @@ std::string CXBMCApp::GetFilenameFromIntent(const CJNIIntent &intent)
       ret = data.toString();
   return ret;
 }
+
+const ANativeWindow** CXBMCApp::GetNativeWindow(int timeout)
+{
+  if (m_window)
+    return (const ANativeWindow**)&m_window;
+
+  m_windowCreated.WaitMSec(timeout);
+  return (const ANativeWindow**)&m_window;
+}
index 7f23a67..8259c23 100644 (file)
@@ -32,6 +32,7 @@
 #include "xbmc.h"
 #include "android/jni/Context.h"
 #include "android/jni/BroadcastReceiver.h"
+#include "threads/Event.h"
 
 // forward delares
 class CJNIWakeLock;
@@ -79,7 +80,7 @@ public:
   void onLostFocus();
 
 
-  static ANativeWindow* GetNativeWindow() { return m_window; };
+  static const ANativeWindow** GetNativeWindow(int timeout);
   static int SetBuffersGeometry(int width, int height, int format);
   static int android_printf(const char *format, ...);
   
@@ -122,7 +123,8 @@ private:
   pthread_t m_thread;
   
   static ANativeWindow* m_window;
-  
+  static CEvent m_windowCreated;
+
   void XBMC_Pause(bool pause);
   void XBMC_Stop();
   bool XBMC_DestroyDisplay();
index 8b81866..cd513a8 100644 (file)
@@ -59,7 +59,7 @@ bool CEGLNativeTypeAndroid::CreateNativeDisplay()
 bool CEGLNativeTypeAndroid::CreateNativeWindow()
 {
 #if defined(TARGET_ANDROID)
-  m_nativeWindow = CXBMCApp::GetNativeWindow();
+  // Android hands us a window, we don't have to create it
   return true;
 #else
   return false;
@@ -76,10 +76,10 @@ bool CEGLNativeTypeAndroid::GetNativeDisplay(XBNativeDisplayType **nativeDisplay
 
 bool CEGLNativeTypeAndroid::GetNativeWindow(XBNativeWindowType **nativeWindow) const
 {
-  if (!nativeWindow || !m_nativeWindow)
+  if (!nativeWindow)
     return false;
-  *nativeWindow = (XBNativeWindowType*) &m_nativeWindow;
-  return true;
+  *nativeWindow = (XBNativeWindowType*) CXBMCApp::GetNativeWindow(30000);
+  return (*nativeWindow != NULL);
 }
 
 bool CEGLNativeTypeAndroid::DestroyNativeDisplay()
@@ -89,17 +89,20 @@ bool CEGLNativeTypeAndroid::DestroyNativeDisplay()
 
 bool CEGLNativeTypeAndroid::DestroyNativeWindow()
 {
-  m_nativeWindow = NULL;
   return true;
 }
 
 bool CEGLNativeTypeAndroid::GetNativeResolution(RESOLUTION_INFO *res) const
 {
 #if defined(TARGET_ANDROID)
-  ANativeWindow_acquire((EGLNativeWindowType)m_nativeWindow);
-  res->iWidth = ANativeWindow_getWidth((EGLNativeWindowType)m_nativeWindow);
-  res->iHeight= ANativeWindow_getHeight((EGLNativeWindowType)m_nativeWindow);
-  ANativeWindow_release((EGLNativeWindowType)m_nativeWindow);
+  EGLNativeWindowType *nativeWindow = (EGLNativeWindowType*)CXBMCApp::GetNativeWindow(30000);
+  if (!nativeWindow)
+    return false;
+
+  ANativeWindow_acquire(*nativeWindow);
+  res->iWidth = ANativeWindow_getWidth(*nativeWindow);
+  res->iHeight= ANativeWindow_getHeight(*nativeWindow);
+  ANativeWindow_release(*nativeWindow);
 
   res->fRefreshRate = 60;
   res->dwFlags= D3DPRESENTFLAG_PROGRESSIVE;
@@ -144,4 +147,4 @@ bool CEGLNativeTypeAndroid::GetPreferredResolution(RESOLUTION_INFO *res) const
 bool CEGLNativeTypeAndroid::ShowWindow(bool show)
 {
   return false;
-}
\ No newline at end of file
+}