(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;
return;
}
m_window = window;
+ m_windowCreated.Set();
if (getWakeLock() && m_wakeLock)
m_wakeLock->acquire();
if(!m_firstrun)
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
}
if (m_wakeLock)
m_wakeLock->release();
- m_window=NULL;
}
void CXBMCApp::onGainFocus()
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
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;
+}
#include "xbmc.h"
#include "android/jni/Context.h"
#include "android/jni/BroadcastReceiver.h"
+#include "threads/Event.h"
// forward delares
class CJNIWakeLock;
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, ...);
pthread_t m_thread;
static ANativeWindow* m_window;
-
+ static CEvent m_windowCreated;
+
void XBMC_Pause(bool pause);
void XBMC_Stop();
bool XBMC_DestroyDisplay();
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;
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()
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;
bool CEGLNativeTypeAndroid::ShowWindow(bool show)
{
return false;
-}
\ No newline at end of file
+}