@@ -1041,6 +1041,10 @@ | |||
RelativePath="..\..\..\src\core\juce_SystemStats.h" | |||
> | |||
</File> | |||
<File | |||
RelativePath="..\..\..\src\core\juce_TargetPlatform.h" | |||
> | |||
</File> | |||
<File | |||
RelativePath="..\..\..\src\core\juce_Time.cpp" | |||
> | |||
@@ -120,10 +120,10 @@ NPError NP_GetValue (void* future, NPPVariable variable, void* value) | |||
return NPP_GetValue ((NPP_t*) future, variable, value); | |||
} | |||
#if JUCE_WIN32 || JUCE_MAC | |||
#if JUCE_WINDOWS || JUCE_MAC | |||
NPError OSCALL NP_GetEntryPoints (NPPluginFuncs* funcs) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
@@ -162,7 +162,7 @@ NPError OSCALL NP_Initialize (NPNetscapeFuncs* funcs | |||
#endif | |||
) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
@@ -201,7 +201,7 @@ NPError OSCALL NP_Initialize (NPNetscapeFuncs* funcs | |||
NPError OSCALL NP_Shutdown() | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
@@ -269,7 +269,7 @@ public: | |||
child (0) | |||
{ | |||
log ("BrowserPluginHolderComponent created"); | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
parentHWND = 0; | |||
oldWinProc = 0; | |||
#else | |||
@@ -314,7 +314,7 @@ public: | |||
private: | |||
//============================================================================== | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
HWND parentHWND; | |||
WNDPROC oldWinProc; | |||
@@ -1160,7 +1160,7 @@ const String BrowserPluginComponent::getBrowserVersion() const | |||
} | |||
//============================================================================== | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
extern const String getActiveXBrowserURL (const BrowserPluginComponent* comp); | |||
#endif | |||
@@ -1168,7 +1168,7 @@ const String BrowserPluginComponent::getBrowserURL() const | |||
{ | |||
String result; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
result = getActiveXBrowserURL (this); | |||
if (result.isNotEmpty()) | |||
@@ -321,9 +321,9 @@ | |||
GCC_VERSION = 4.0; | |||
GCC_WARN_ABOUT_RETURN_TYPE = YES; | |||
GCC_WARN_UNUSED_VARIABLE = YES; | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
ONLY_ACTIVE_ARCH = YES; | |||
PREBINDING = NO; | |||
SDKROOT = macosx10.4; | |||
}; | |||
name = Debug; | |||
}; | |||
@@ -26,7 +26,6 @@ | |||
#include "jucedemo_headers.h" | |||
#include "MainDemoWindow.h" | |||
//============================================================================== | |||
class JUCEDemoApplication : public JUCEApplication | |||
{ | |||
@@ -63,7 +62,13 @@ public: | |||
{ | |||
// just create the main window... | |||
theMainWindow = new MainDemoWindow(); | |||
#if JUCE_IPHONE | |||
theMainWindow->setVisible (true); | |||
theMainWindow->setBounds (0, 20, 320, 460); | |||
#else | |||
theMainWindow->centreWithSize (700, 600); | |||
#endif | |||
theMainWindow->setVisible (true); | |||
// this little function just demonstrates a few system info calls | |||
@@ -1262,6 +1262,8 @@ public: | |||
= AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, | |||
T("This is an ok/cancel AlertWindow"), | |||
T("And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.")); | |||
(void) userPickedOk; // (just avoids a compiler warning about unused variables) | |||
} | |||
else if (result == 111) | |||
{ | |||
@@ -1285,6 +1287,8 @@ public: | |||
{ | |||
// this is the item they chose in the drop-down list.. | |||
const int optionIndexChosen = w.getComboBoxComponent (T("option"))->getSelectedItemIndex(); | |||
(void) optionIndexChosen; // (just avoids a compiler warning about unused variables) | |||
// this is the text they entered.. | |||
String text = w.getTextEditorContents (T("text")); | |||
@@ -38,6 +38,8 @@ | |||
to an explicit 0 or 1 in here. | |||
*/ | |||
#include "../../../src/core/juce_TargetPlatform.h" | |||
//#define JUCE_ONLY_BUILD_CORE_LIBRARY 1 | |||
//#define JUCE_FORCE_DEBUG 1 | |||
//#define JUCE_LOG_ASSERTIONS 1 | |||
@@ -45,12 +47,17 @@ | |||
//#define JUCE_ASIO 1 | |||
//#define JUCE_ALSA 1 | |||
#ifdef _MSC_VER | |||
#if JUCE_WINDOWS || JUCE_IPHONE | |||
#define JUCE_QUICKTIME 0 // (This is disabled here by default because on windows it requires the QT SDK, | |||
// but you can turn it on again if you've got the SDK) | |||
#endif | |||
#define JUCE_OPENGL 1 | |||
#if JUCE_IPHONE | |||
#define JUCE_OPENGL 0 | |||
#else | |||
#define JUCE_OPENGL 1 | |||
#endif | |||
//#define JUCE_USE_FLAC 1 | |||
//#define JUCE_USE_OGGVORBIS 1 | |||
//#define JUCE_USE_CDBURNER 1 | |||
@@ -60,8 +67,8 @@ | |||
#define JUCE_PLUGINHOST_VST 0 | |||
#define JUCE_PLUGINHOST_AU 0 | |||
#ifndef LINUX | |||
#define JUCE_USE_CAMERA 1 | |||
#if JUCE_LINUX || JUCE_IPHONE | |||
#define JUCE_USE_CAMERA 0 | |||
#endif | |||
//#define JUCE_CHECK_MEMORY_LEAKS 1 | |||
@@ -45,7 +45,7 @@ BEGIN_JUCE_NAMESPACE | |||
#pragma warning (disable: 4786) // (old vc6 warning about long class names) | |||
#endif | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
#pragma align=natural | |||
#endif | |||
@@ -65,7 +65,7 @@ BEGIN_JUCE_NAMESPACE | |||
#pragma pack (pop) | |||
#endif | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
#pragma align=reset | |||
#endif | |||
@@ -102,7 +102,7 @@ END_JUCE_NAMESPACE | |||
files, you may need to use the juce_WithoutMacros.h file - see the comments in that | |||
file for more information. | |||
*/ | |||
#if JUCE_WIN32 && ! JUCE_DONT_DEFINE_MACROS | |||
#if JUCE_WINDOWS && ! JUCE_DONT_DEFINE_MACROS | |||
#define Rectangle JUCE_NAMESPACE::Rectangle | |||
#endif | |||
#endif | |||
@@ -176,7 +176,7 @@ END_JUCE_NAMESPACE | |||
return JUCE_NAMESPACE::JUCEApplication::main (argc, argv, new AppClass()); \ | |||
} | |||
#elif JUCE_WIN32 | |||
#elif JUCE_WINDOWS | |||
#ifdef _CONSOLE | |||
#define START_JUCE_APPLICATION(AppClass) \ | |||
@@ -101,7 +101,7 @@ | |||
On Windows, if you enable this, you'll need to have the QuickTime SDK | |||
installed, and its header files will need to be on your include path. | |||
*/ | |||
#if ! (defined (JUCE_QUICKTIME) || defined (LINUX) || defined (TARGET_OS_IPHONE) || defined (TARGET_IPHONE_SIMULATOR) || (defined (_WIN32) && ! defined (_MSC_VER))) | |||
#if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC)) | |||
#define JUCE_QUICKTIME 1 | |||
#endif | |||
@@ -133,7 +133,7 @@ | |||
/** This flag lets you enable support for CD-burning. You might want to disable | |||
it to build without the MS SDK under windows. | |||
*/ | |||
#if (! defined (JUCE_USE_CDBURNER)) && ! (defined (_WIN32) && ! defined (_MSC_VER)) | |||
#if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC) | |||
#define JUCE_USE_CDBURNER 1 | |||
#endif | |||
@@ -72,6 +72,147 @@ | |||
*/ | |||
#define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8)) | |||
/********* Start of inlined file: juce_TargetPlatform.h *********/ | |||
#ifndef __JUCE_TARGETPLATFORM_JUCEHEADER__ | |||
#define __JUCE_TARGETPLATFORM_JUCEHEADER__ | |||
/* This file figures out which platform is being built, and defines some macros | |||
that the rest of the code can use for OS-specific compilation. | |||
Macros that will be set here are: | |||
- One of JUCE_WINDOWS, JUCE_MAC or JUCE_LINUX. | |||
- Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | |||
- Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | |||
- Either JUCE_INTEL or JUCE_PPC | |||
- Either JUCE_GCC or JUCE_MSVC | |||
*/ | |||
#if (defined (_WIN32) || defined (_WIN64)) | |||
#define JUCE_WIN32 1 | |||
#define JUCE_WINDOWS 1 | |||
#elif defined (LINUX) || defined (__linux__) | |||
#define JUCE_LINUX 1 | |||
#elif defined(__APPLE_CPP__) || defined(__APPLE_CC__) | |||
#include <CoreFoundation/CoreFoundation.h> // (needed to find out what platform we're using) | |||
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR | |||
#define JUCE_IPHONE 1 | |||
#else | |||
#define JUCE_MAC 1 | |||
#endif | |||
#else | |||
#error "Unknown platform!" | |||
#endif | |||
#if JUCE_WINDOWS | |||
#ifdef _MSC_VER | |||
#ifdef _WIN64 | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#endif | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
/** If defined, this indicates that the processor is little-endian. */ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#if JUCE_MAC | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#if defined (__ppc__) || defined (__ppc64__) | |||
#define JUCE_PPC 1 | |||
#else | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#ifdef __LP64__ | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) | |||
#error "Building for OSX 10.2 is no longer supported!" | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_4)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4) | |||
#define MACOS_10_3_OR_EARLIER 1 | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_5)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) | |||
#define MACOS_10_4_OR_EARLIER 1 | |||
#endif | |||
#endif | |||
#if JUCE_IPHONE | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#endif | |||
#if JUCE_LINUX | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
// Allow override for big-endian Linux platforms | |||
#ifndef JUCE_BIG_ENDIAN | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#endif | |||
#if defined (__LP64__) || defined (_LP64) | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#define JUCE_INTEL 1 | |||
#endif | |||
// Compiler type macros. | |||
#ifdef __GNUC__ | |||
#define JUCE_GCC 1 | |||
#elif defined (_MSC_VER) | |||
#define JUCE_MSVC 1 | |||
#if _MSC_VER >= 1400 | |||
#define JUCE_USE_INTRINSICS 1 | |||
#endif | |||
#else | |||
#error unknown compiler | |||
#endif | |||
#endif // __JUCE_PLATFORMDEFS_JUCEHEADER__ | |||
/********* End of inlined file: juce_TargetPlatform.h *********/ | |||
// (sets up the various JUCE_WINDOWS, JUCE_MAC, etc flags) | |||
/********* Start of inlined file: juce_Config.h *********/ | |||
#ifndef __JUCE_CONFIG_JUCEHEADER__ | |||
#define __JUCE_CONFIG_JUCEHEADER__ | |||
@@ -145,7 +286,7 @@ | |||
On Windows, if you enable this, you'll need to have the QuickTime SDK | |||
installed, and its header files will need to be on your include path. | |||
*/ | |||
#if ! (defined (JUCE_QUICKTIME) || defined (LINUX) || defined (TARGET_OS_IPHONE) || defined (TARGET_IPHONE_SIMULATOR) || (defined (_WIN32) && ! defined (_MSC_VER))) | |||
#if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC)) | |||
#define JUCE_QUICKTIME 1 | |||
#endif | |||
@@ -173,7 +314,7 @@ | |||
/** This flag lets you enable support for CD-burning. You might want to disable | |||
it to build without the MS SDK under windows. | |||
*/ | |||
#if (! defined (JUCE_USE_CDBURNER)) && ! (defined (_WIN32) && ! defined (_MSC_VER)) | |||
#if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC) | |||
#define JUCE_USE_CDBURNER 1 | |||
#endif | |||
@@ -300,131 +441,13 @@ | |||
#define END_JUCE_NAMESPACE | |||
#endif | |||
// This sets up the JUCE_WIN32, JUCE_MAC, or JUCE_LINUX macros | |||
/********* Start of inlined file: juce_PlatformDefs.h *********/ | |||
#ifndef __JUCE_PLATFORMDEFS_JUCEHEADER__ | |||
#define __JUCE_PLATFORMDEFS_JUCEHEADER__ | |||
/* This file figures out which platform is being built, and defines some macros | |||
that the rest of the code can use for OS-specific compilation. | |||
Macros that will be set here are: | |||
- One of JUCE_WIN32, JUCE_MAC or JUCE_LINUX. | |||
- Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | |||
- Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | |||
- Either JUCE_INTEL or JUCE_PPC | |||
- Either JUCE_GCC or JUCE_MSVC | |||
It also includes a set of macros for debug console output and assertions. | |||
/* This file defines miscellaneous macros for debugging, assertions, etc. | |||
*/ | |||
#if (defined (_WIN32) || defined (_WIN64)) | |||
#define JUCE_WIN32 1 | |||
#else | |||
#if defined (LINUX) || defined (__linux__) | |||
#define JUCE_LINUX 1 | |||
#elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR | |||
#define JUCE_IPHONE 1 | |||
#else | |||
#define JUCE_MAC 1 | |||
#endif | |||
#endif | |||
#if JUCE_WIN32 | |||
#ifdef _MSC_VER | |||
#ifdef _WIN64 | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#endif | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
/** If defined, this indicates that the processor is little-endian. */ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#if JUCE_MAC | |||
#include <CoreFoundation/CoreFoundation.h> | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#if defined (__ppc__) || defined (__ppc64__) | |||
#define JUCE_PPC 1 | |||
#else | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#ifdef __LP64__ | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) | |||
#error "Building for OSX 10.2 is no longer supported!" | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_4)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4) | |||
#define MACOS_10_3_OR_EARLIER 1 | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_5)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) | |||
#define MACOS_10_4_OR_EARLIER 1 | |||
#endif | |||
#endif | |||
#if JUCE_IPHONE | |||
#include <CoreFoundation/CoreFoundation.h> | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#endif | |||
#if JUCE_LINUX | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
// Allow override for big-endian Linux platforms | |||
#ifndef JUCE_BIG_ENDIAN | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#endif | |||
#if defined (__LP64__) || defined (_LP64) | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#ifdef JUCE_FORCE_DEBUG | |||
#undef JUCE_DEBUG | |||
@@ -433,20 +456,6 @@ | |||
#endif | |||
#endif | |||
// Compiler type macros. | |||
#ifdef __GNUC__ | |||
#define JUCE_GCC 1 | |||
#elif defined (_MSC_VER) | |||
#define JUCE_MSVC 1 | |||
#if _MSC_VER >= 1400 | |||
#define JUCE_USE_INTRINSICS 1 | |||
#endif | |||
#else | |||
#error unknown compiler | |||
#endif | |||
/** This macro defines the C calling convention used as the standard for Juce calls. */ | |||
#if JUCE_MSVC | |||
#define JUCE_CALLTYPE __stdcall | |||
@@ -487,7 +496,7 @@ | |||
// Assertions.. | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
#if JUCE_USE_INTRINSICS | |||
#pragma intrinsic (__debugbreak) | |||
@@ -511,7 +520,7 @@ | |||
#elif JUCE_MAC | |||
#define juce_breakDebugger Debugger(); | |||
#elif JUCE_IPHONE | |||
#define juce_breakDebugger assert (false); | |||
#define juce_breakDebugger kill (0, SIGTRAP); | |||
#elif JUCE_LINUX | |||
#define juce_breakDebugger kill (0, SIGTRAP); | |||
#endif | |||
@@ -1027,7 +1036,7 @@ inline void swapVariables (Type& variable1, Type& variable2) throw() | |||
// Some useful maths functions that aren't always present with all compilers and build settings. | |||
#if JUCE_WIN32 || defined (DOXYGEN) | |||
#if JUCE_WINDOWS || defined (DOXYGEN) | |||
/** Using juce_hypot and juce_hypotf is easier than dealing with all the different | |||
versions of these functions of various platforms and compilers. */ | |||
forcedinline double juce_hypot (double a, double b) { return _hypot (a, b); } | |||
@@ -1075,7 +1084,7 @@ const float float_Pi = 3.14159265358979323846f; | |||
#else | |||
#define juce_isfinite(v) std::isfinite(v) | |||
#endif | |||
#elif JUCE_WIN32 && ! defined (isfinite) | |||
#elif JUCE_WINDOWS && ! defined (isfinite) | |||
#define juce_isfinite(v) _finite(v) | |||
#else | |||
#define juce_isfinite(v) isfinite(v) | |||
@@ -1094,12 +1103,20 @@ const float float_Pi = 3.14159265358979323846f; | |||
// Endianness conversions.. | |||
#if JUCE_IPHONE | |||
// a gcc compiler error seems to mean that these functions only work properly | |||
// on the iPhone if they are declared static.. | |||
static forcedinline uint32 swapByteOrder (uint32 n) throw(); | |||
static inline uint16 swapByteOrder (const uint16 n) throw(); | |||
static inline uint64 swapByteOrder (const uint64 value) throw(); | |||
#endif | |||
/** Swaps the byte-order in an integer from little to big-endianness or vice-versa. */ | |||
forcedinline uint32 swapByteOrder (uint32 n) throw() | |||
{ | |||
#if JUCE_MAC || JUCE_IPHONE | |||
// Mac version | |||
return CFSwapInt32 (n); | |||
return OSSwapInt32 (n); | |||
#elif JUCE_GCC | |||
// Inpenetrable GCC version.. | |||
asm("bswap %%eax" : "=a"(n) : "a"(n)); | |||
@@ -1132,7 +1149,7 @@ inline uint16 swapByteOrder (const uint16 n) throw() | |||
inline uint64 swapByteOrder (const uint64 value) throw() | |||
{ | |||
#if JUCE_MAC || JUCE_IPHONE | |||
return CFSwapInt64 (value); | |||
return OSSwapInt64 (value); | |||
#elif JUCE_USE_INTRINSICS | |||
return _byteswap_uint64 (value); | |||
#else | |||
@@ -2534,7 +2551,7 @@ BEGIN_JUCE_NAMESPACE | |||
#pragma warning (disable: 4786) // (old vc6 warning about long class names) | |||
#endif | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
#pragma align=natural | |||
#endif | |||
@@ -2558,10 +2575,11 @@ BEGIN_JUCE_NAMESPACE | |||
#if ! MACOS_10_3_OR_EARLIER | |||
forcedinline void atomicIncrement (int& variable) throw() { OSAtomicIncrement32 ((int32_t*) &variable); } | |||
forcedinline int atomicIncrementAndReturn (int& variable) throw() { return OSAtomicIncrement32 ((int32_t*) &variable); } | |||
forcedinline void atomicDecrement (int& variable) throw() { OSAtomicDecrement32 ((int32_t*) &variable); } | |||
forcedinline int atomicDecrementAndReturn (int& variable) throw() { return OSAtomicDecrement32 ((int32_t*) &variable); } | |||
#include <libkern/OSAtomic.h> | |||
static forcedinline void atomicIncrement (int& variable) throw() { OSAtomicIncrement32 ((int32_t*) &variable); } | |||
static forcedinline int atomicIncrementAndReturn (int& variable) throw() { return OSAtomicIncrement32 ((int32_t*) &variable); } | |||
static forcedinline void atomicDecrement (int& variable) throw() { OSAtomicDecrement32 ((int32_t*) &variable); } | |||
static forcedinline int atomicDecrementAndReturn (int& variable) throw() { return OSAtomicDecrement32 ((int32_t*) &variable); } | |||
#else | |||
forcedinline void atomicIncrement (int& variable) throw() { OTAtomicAdd32 (1, (SInt32*) &variable); } | |||
@@ -7194,7 +7212,7 @@ public: | |||
static void addItemToDock (const File& file); | |||
#endif | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
// Some registry helper functions: | |||
@@ -7272,7 +7290,7 @@ public: | |||
*/ | |||
static void fpuReset(); | |||
#if JUCE_LINUX || JUCE_WIN32 | |||
#if JUCE_LINUX || JUCE_WINDOWS | |||
/** Loads a dynamically-linked library into the process's address space. | |||
@@ -23872,7 +23890,12 @@ private: | |||
String commandLineParameters; | |||
int appReturnValue; | |||
bool stillInitialising; | |||
InterProcessLock* appLock; | |||
public: | |||
/** @internal */ | |||
bool initialiseApp (String& commandLine); | |||
/** @internal */ | |||
static int shutdownAppAndClearUp(); | |||
}; | |||
@@ -37075,7 +37098,7 @@ public: | |||
static int compareElements (const File* const, const File* const) throw(); | |||
private: | |||
#elif JUCE_WIN32 | |||
#elif JUCE_WINDOWS | |||
int numTracks; | |||
int trackStarts[100]; | |||
bool audioTracks [100]; | |||
@@ -51964,7 +51987,7 @@ private: | |||
#ifndef __JUCE_ACTIVEXCONTROLCOMPONENT_JUCEHEADER__ | |||
#define __JUCE_ACTIVEXCONTROLCOMPONENT_JUCEHEADER__ | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
/** | |||
A Windows-specific class that can create and embed an ActiveX control inside | |||
@@ -53629,7 +53652,7 @@ private: | |||
// this is used to disable QuickTime, and is defined in juce_Config.h | |||
#if JUCE_QUICKTIME || DOXYGEN | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
typedef ActiveXControlComponent QTCompBaseClass; | |||
#else | |||
@@ -53773,7 +53796,7 @@ private: | |||
File movieFile; | |||
bool movieLoaded, controllerVisible, looping; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
/** @internal */ | |||
void parentHierarchyChanged(); | |||
/** @internal */ | |||
@@ -53801,7 +53824,7 @@ private: | |||
#ifndef __JUCE_SYSTEMTRAYICONCOMPONENT_JUCEHEADER__ | |||
#define __JUCE_SYSTEMTRAYICONCOMPONENT_JUCEHEADER__ | |||
#if JUCE_WIN32 || JUCE_LINUX || DOXYGEN | |||
#if JUCE_WINDOWS || JUCE_LINUX || DOXYGEN | |||
/** | |||
On Windows only, this component sits in the taskbar tray as a small icon. | |||
@@ -55028,7 +55051,7 @@ public: | |||
#pragma pack (pop) | |||
#endif | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
#pragma align=reset | |||
#endif | |||
@@ -55063,7 +55086,7 @@ END_JUCE_NAMESPACE | |||
files, you may need to use the juce_WithoutMacros.h file - see the comments in that | |||
file for more information. | |||
*/ | |||
#if JUCE_WIN32 && ! JUCE_DONT_DEFINE_MACROS | |||
#if JUCE_WINDOWS && ! JUCE_DONT_DEFINE_MACROS | |||
#define Rectangle JUCE_NAMESPACE::Rectangle | |||
#endif | |||
#endif | |||
@@ -55164,7 +55187,7 @@ END_JUCE_NAMESPACE | |||
return JUCE_NAMESPACE::JUCEApplication::main (argc, argv, new AppClass()); \ | |||
} | |||
#elif JUCE_WIN32 | |||
#elif JUCE_WINDOWS | |||
#ifdef _CONSOLE | |||
#define START_JUCE_APPLICATION(AppClass) \ | |||
@@ -44,7 +44,6 @@ BEGIN_JUCE_NAMESPACE | |||
#include "../core/juce_Time.h" | |||
#include "../core/juce_Initialisation.h" | |||
#include "../threads/juce_Process.h" | |||
#include "../threads/juce_InterProcessLock.h" | |||
#include "../core/juce_PlatformUtilities.h" | |||
void juce_setCurrentThreadName (const String& name) throw(); | |||
@@ -55,12 +54,18 @@ static JUCEApplication* appInstance = 0; | |||
//============================================================================== | |||
JUCEApplication::JUCEApplication() | |||
: appReturnValue (0), | |||
stillInitialising (true) | |||
stillInitialising (true), | |||
appLock (0) | |||
{ | |||
} | |||
JUCEApplication::~JUCEApplication() | |||
{ | |||
if (appLock != 0) | |||
{ | |||
appLock->exit(); | |||
delete appLock; | |||
} | |||
} | |||
JUCEApplication* JUCEApplication::getInstance() throw() | |||
@@ -156,68 +161,65 @@ bool JUCEApplication::perform (const InvocationInfo& info) | |||
//============================================================================== | |||
int JUCEApplication::main (String& commandLine, JUCEApplication* const app) | |||
{ | |||
if (! app->initialiseApp (commandLine)) | |||
return 0; | |||
// now loop until a quit message is received.. | |||
JUCE_TRY | |||
{ | |||
MessageManager::getInstance()->runDispatchLoop(); | |||
} | |||
#if JUCE_CATCH_UNHANDLED_EXCEPTIONS | |||
catch (const std::exception& e) | |||
{ | |||
app->unhandledException (&e, __FILE__, __LINE__); | |||
} | |||
catch (...) | |||
{ | |||
app->unhandledException (0, __FILE__, __LINE__); | |||
} | |||
#endif | |||
return shutdownAppAndClearUp(); | |||
} | |||
bool JUCEApplication::initialiseApp (String& commandLine) | |||
{ | |||
jassert (appInstance == 0); | |||
appInstance = app; | |||
appInstance = this; | |||
app->commandLineParameters = commandLine.trim(); | |||
commandLineParameters = commandLine.trim(); | |||
commandLine = String::empty; | |||
initialiseJuce_GUI(); | |||
InterProcessLock* appLock = 0; | |||
if (! app->moreThanOneInstanceAllowed()) | |||
if (! moreThanOneInstanceAllowed()) | |||
{ | |||
appLock = new InterProcessLock ("juceAppLock_" + app->getApplicationName()); | |||
appLock = new InterProcessLock ("juceAppLock_" + getApplicationName()); | |||
if (! appLock->enter(0)) | |||
{ | |||
MessageManager::broadcastMessage (app->getApplicationName() + "/" + app->commandLineParameters); | |||
MessageManager::broadcastMessage (getApplicationName() + "/" + commandLineParameters); | |||
delete appInstance; | |||
appInstance = 0; | |||
DBG ("Another instance is running - quitting..."); | |||
return 0; | |||
return false; | |||
} | |||
} | |||
JUCE_TRY | |||
{ | |||
juce_setCurrentThreadName ("Juce Message Thread"); | |||
// let the app do its setting-up.. | |||
app->initialise (app->commandLineParameters); | |||
// register for broadcast new app messages | |||
MessageManager::getInstance()->registerBroadcastListener (app); | |||
// let the app do its setting-up.. | |||
initialise (commandLineParameters); | |||
app->stillInitialising = false; | |||
// register for broadcast new app messages | |||
MessageManager::getInstance()->registerBroadcastListener (this); | |||
// now loop until a quit message is received.. | |||
MessageManager::getInstance()->runDispatchLoop(); | |||
MessageManager::getInstance()->deregisterBroadcastListener (app); | |||
if (appLock != 0) | |||
{ | |||
appLock->exit(); | |||
delete appLock; | |||
} | |||
} | |||
#if JUCE_CATCH_UNHANDLED_EXCEPTIONS | |||
catch (const std::exception& e) | |||
{ | |||
app->unhandledException (&e, __FILE__, __LINE__); | |||
} | |||
catch (...) | |||
{ | |||
app->unhandledException (0, __FILE__, __LINE__); | |||
} | |||
#endif | |||
return shutdownAppAndClearUp(); | |||
stillInitialising = false; | |||
return true; | |||
} | |||
int JUCEApplication::shutdownAppAndClearUp() | |||
@@ -226,6 +228,8 @@ int JUCEApplication::shutdownAppAndClearUp() | |||
JUCEApplication* const app = appInstance; | |||
int returnValue = 0; | |||
MessageManager::getInstance()->deregisterBroadcastListener (app); | |||
static bool reentrancyCheck = false; | |||
if (! reentrancyCheck) | |||
@@ -265,9 +269,18 @@ int JUCEApplication::shutdownAppAndClearUp() | |||
return returnValue; | |||
} | |||
#if JUCE_IPHONE | |||
extern int juce_IPhoneMain (int argc, char* argv[], JUCEApplication* app); | |||
#endif | |||
int JUCEApplication::main (int argc, char* argv[], | |||
JUCEApplication* const newApp) | |||
{ | |||
#if JUCE_IPHONE | |||
const ScopedAutoReleasePool pool; | |||
return juce_IPhoneMain (argc, argv, newApp); | |||
#else | |||
#if JUCE_MAC | |||
const ScopedAutoReleasePool pool; | |||
#endif | |||
@@ -277,6 +290,7 @@ int JUCEApplication::main (int argc, char* argv[], | |||
cmd << String::fromUTF8 ((const uint8*) argv[i]) << T(' '); | |||
return JUCEApplication::main (cmd, newApp); | |||
#endif | |||
} | |||
void JUCEApplication::actionListenerCallback (const String& message) | |||
@@ -293,7 +307,7 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_GUI() | |||
{ | |||
if (! juceInitialisedGUI) | |||
{ | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
const ScopedAutoReleasePool pool; | |||
#endif | |||
juceInitialisedGUI = true; | |||
@@ -301,8 +315,9 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_GUI() | |||
initialiseJuce_NonGUI(); | |||
MessageManager::getInstance(); | |||
LookAndFeel::setDefaultLookAndFeel (0); | |||
juce_setCurrentThreadName ("Juce Message Thread"); | |||
#if JUCE_WIN32 && JUCE_DEBUG | |||
#if JUCE_WINDOWS && JUCE_DEBUG | |||
// This section is just for catching people who mess up their project settings and | |||
// turn RTTI off.. | |||
try | |||
@@ -28,6 +28,7 @@ | |||
#include "juce_ApplicationCommandTarget.h" | |||
#include "../events/juce_ActionListener.h" | |||
#include "../threads/juce_InterProcessLock.h" | |||
//============================================================================== | |||
@@ -288,7 +289,12 @@ private: | |||
String commandLineParameters; | |||
int appReturnValue; | |||
bool stillInitialising; | |||
InterProcessLock* appLock; | |||
public: | |||
/** @internal */ | |||
bool initialiseApp (String& commandLine); | |||
/** @internal */ | |||
static int shutdownAppAndClearUp(); | |||
}; | |||
@@ -26,17 +26,17 @@ | |||
// This file is included at the start of each FLAC .c file, just to do a few housekeeping | |||
// tasks.. | |||
#include "../../../../core/juce_TargetPlatform.h" | |||
#include "../../../../../juce_Config.h" | |||
#define VERSION "1.2.1" | |||
#define FLAC__NO_DLL 1 | |||
#ifdef _MSC_VER | |||
#if JUCE_MSVC | |||
#pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4312) | |||
#endif | |||
#if ! (defined (_WIN32) || defined (_WIN64) || defined (LINUX)) | |||
#if JUCE_MAC | |||
#define FLAC__SYS_DARWIN 1 | |||
#endif |
@@ -158,7 +158,7 @@ public: | |||
static int compareElements (const File* const, const File* const) throw(); | |||
private: | |||
#elif JUCE_WIN32 | |||
#elif JUCE_WINDOWS | |||
int numTracks; | |||
int trackStarts[100]; | |||
bool audioTracks [100]; | |||
@@ -23,13 +23,15 @@ | |||
============================================================================== | |||
*/ | |||
#include "../../core/juce_TargetPlatform.h" | |||
#include "../../../juce_Config.h" | |||
#ifdef _MSC_VER | |||
#include <windows.h> | |||
#endif | |||
#if JUCE_USE_FLAC | |||
#if JUCE_WINDOWS | |||
#include <windows.h> | |||
#endif | |||
#include "../../core/juce_StandardHeader.h" | |||
#ifdef _MSC_VER | |||
@@ -23,6 +23,7 @@ | |||
============================================================================== | |||
*/ | |||
#include "../../core/juce_TargetPlatform.h" | |||
#include "../../../juce_Config.h" | |||
#if JUCE_USE_OGGVORBIS | |||
@@ -23,18 +23,19 @@ | |||
============================================================================== | |||
*/ | |||
#include "../../core/juce_TargetPlatform.h" | |||
#include "../../../juce_Config.h" | |||
#if JUCE_QUICKTIME | |||
#if JUCE_QUICKTIME && ! (JUCE_64BIT || JUCE_IPHONE) | |||
#if ! defined (_WIN32) | |||
#if ! JUCE_WINDOWS | |||
#include <QuickTime/Movies.h> | |||
#include <QuickTime/QTML.h> | |||
#include <QuickTime/QuickTimeComponents.h> | |||
#include <QuickTime/MediaHandlers.h> | |||
#include <QuickTime/ImageCodec.h> | |||
#else | |||
#ifdef _MSC_VER | |||
#if JUCE_MSVC | |||
#pragma warning (push) | |||
#pragma warning (disable : 4100) | |||
#endif | |||
@@ -51,15 +52,13 @@ | |||
#include <MediaHandlers.h> | |||
#include <ImageCodec.h> | |||
#ifdef _MSC_VER | |||
#if JUCE_MSVC | |||
#pragma warning (pop) | |||
#endif | |||
#endif | |||
#include "../../core/juce_StandardHeader.h" | |||
#if ! (JUCE_MAC && JUCE_64BIT) | |||
BEGIN_JUCE_NAMESPACE | |||
#include "juce_QuickTimeAudioFormat.h" | |||
@@ -404,4 +403,3 @@ AudioFormatWriter* QuickTimeAudioFormat::createWriterFor (OutputStream* /*stream | |||
END_JUCE_NAMESPACE | |||
#endif | |||
#endif |
@@ -27,8 +27,9 @@ | |||
// tasks.. | |||
#include "../../../../src/core/juce_TargetPlatform.h" | |||
#include "../../../../juce_Config.h" | |||
#ifdef _MSC_VER | |||
#if JUCE_MSVC | |||
#pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706) | |||
#endif |
@@ -115,10 +115,10 @@ AudioIODeviceType* juce_createAudioIODeviceType_ALSA(); | |||
void AudioDeviceManager::createAudioDeviceTypes (OwnedArray <AudioIODeviceType>& list) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#if JUCE_WASAPI | |||
if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) | |||
list.add (juce_createAudioIODeviceType_WASAPI()); | |||
list.add (juce_createAudioIODeviceType_WASAPI()); | |||
#endif | |||
#if JUCE_DIRECTSOUND | |||
@@ -23,6 +23,7 @@ | |||
============================================================================== | |||
*/ | |||
#include "../../../core/juce_TargetPlatform.h" | |||
#include "../../../../juce_Config.h" | |||
#if JUCE_PLUGINHOST_AU && (! (defined (LINUX) || defined (_WIN32))) | |||
@@ -23,6 +23,7 @@ | |||
============================================================================== | |||
*/ | |||
#include "../../../core/juce_TargetPlatform.h" | |||
#include "../../../../juce_Config.h" | |||
#if JUCE_PLUGINHOST_VST | |||
@@ -35,10 +35,11 @@ | |||
#if ! MACOS_10_3_OR_EARLIER | |||
//============================================================================== | |||
forcedinline void atomicIncrement (int& variable) throw() { OSAtomicIncrement32 ((int32_t*) &variable); } | |||
forcedinline int atomicIncrementAndReturn (int& variable) throw() { return OSAtomicIncrement32 ((int32_t*) &variable); } | |||
forcedinline void atomicDecrement (int& variable) throw() { OSAtomicDecrement32 ((int32_t*) &variable); } | |||
forcedinline int atomicDecrementAndReturn (int& variable) throw() { return OSAtomicDecrement32 ((int32_t*) &variable); } | |||
#include <libkern/OSAtomic.h> | |||
static forcedinline void atomicIncrement (int& variable) throw() { OSAtomicIncrement32 ((int32_t*) &variable); } | |||
static forcedinline int atomicIncrementAndReturn (int& variable) throw() { return OSAtomicIncrement32 ((int32_t*) &variable); } | |||
static forcedinline void atomicDecrement (int& variable) throw() { OSAtomicDecrement32 ((int32_t*) &variable); } | |||
static forcedinline int atomicDecrementAndReturn (int& variable) throw() { return OSAtomicDecrement32 ((int32_t*) &variable); } | |||
#else | |||
//============================================================================== | |||
forcedinline void atomicIncrement (int& variable) throw() { OTAtomicAdd32 (1, (SInt32*) &variable); } | |||
@@ -26,8 +26,6 @@ | |||
#ifndef __JUCE_DATACONVERSIONS_JUCEHEADER__ | |||
#define __JUCE_DATACONVERSIONS_JUCEHEADER__ | |||
#include "juce_PlatformDefs.h" | |||
#if JUCE_USE_INTRINSICS | |||
#pragma intrinsic (_byteswap_ulong) | |||
#endif | |||
@@ -35,12 +33,20 @@ | |||
//============================================================================== | |||
// Endianness conversions.. | |||
#if JUCE_IPHONE | |||
// a gcc compiler error seems to mean that these functions only work properly | |||
// on the iPhone if they are declared static.. | |||
static forcedinline uint32 swapByteOrder (uint32 n) throw(); | |||
static inline uint16 swapByteOrder (const uint16 n) throw(); | |||
static inline uint64 swapByteOrder (const uint64 value) throw(); | |||
#endif | |||
/** Swaps the byte-order in an integer from little to big-endianness or vice-versa. */ | |||
forcedinline uint32 swapByteOrder (uint32 n) throw() | |||
{ | |||
#if JUCE_MAC || JUCE_IPHONE | |||
// Mac version | |||
return CFSwapInt32 (n); | |||
return OSSwapInt32 (n); | |||
#elif JUCE_GCC | |||
// Inpenetrable GCC version.. | |||
asm("bswap %%eax" : "=a"(n) : "a"(n)); | |||
@@ -73,7 +79,7 @@ inline uint16 swapByteOrder (const uint16 n) throw() | |||
inline uint64 swapByteOrder (const uint64 value) throw() | |||
{ | |||
#if JUCE_MAC || JUCE_IPHONE | |||
return CFSwapInt64 (value); | |||
return OSSwapInt64 (value); | |||
#elif JUCE_USE_INTRINSICS | |||
return _byteswap_uint64 (value); | |||
#else | |||
@@ -207,7 +207,7 @@ inline void swapVariables (Type& variable1, Type& variable2) throw() | |||
//============================================================================== | |||
// Some useful maths functions that aren't always present with all compilers and build settings. | |||
#if JUCE_WIN32 || defined (DOXYGEN) | |||
#if JUCE_WINDOWS || defined (DOXYGEN) | |||
/** Using juce_hypot and juce_hypotf is easier than dealing with all the different | |||
versions of these functions of various platforms and compilers. */ | |||
forcedinline double juce_hypot (double a, double b) { return _hypot (a, b); } | |||
@@ -259,7 +259,7 @@ const float float_Pi = 3.14159265358979323846f; | |||
#else | |||
#define juce_isfinite(v) std::isfinite(v) | |||
#endif | |||
#elif JUCE_WIN32 && ! defined (isfinite) | |||
#elif JUCE_WINDOWS && ! defined (isfinite) | |||
#define juce_isfinite(v) _finite(v) | |||
#else | |||
#define juce_isfinite(v) isfinite(v) | |||
@@ -27,130 +27,9 @@ | |||
#define __JUCE_PLATFORMDEFS_JUCEHEADER__ | |||
//============================================================================== | |||
/* This file figures out which platform is being built, and defines some macros | |||
that the rest of the code can use for OS-specific compilation. | |||
Macros that will be set here are: | |||
- One of JUCE_WIN32, JUCE_MAC or JUCE_LINUX. | |||
- Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | |||
- Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | |||
- Either JUCE_INTEL or JUCE_PPC | |||
- Either JUCE_GCC or JUCE_MSVC | |||
It also includes a set of macros for debug console output and assertions. | |||
/* This file defines miscellaneous macros for debugging, assertions, etc. | |||
*/ | |||
//============================================================================== | |||
#if (defined (_WIN32) || defined (_WIN64)) | |||
#define JUCE_WIN32 1 | |||
#else | |||
#if defined (LINUX) || defined (__linux__) | |||
#define JUCE_LINUX 1 | |||
#elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR | |||
#define JUCE_IPHONE 1 | |||
#else | |||
#define JUCE_MAC 1 | |||
#endif | |||
#endif | |||
//============================================================================== | |||
#if JUCE_WIN32 | |||
#ifdef _MSC_VER | |||
#ifdef _WIN64 | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#endif | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
/** If defined, this indicates that the processor is little-endian. */ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#define JUCE_INTEL 1 | |||
#endif | |||
//============================================================================== | |||
#if JUCE_MAC | |||
#include <CoreFoundation/CoreFoundation.h> | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#if defined (__ppc__) || defined (__ppc64__) | |||
#define JUCE_PPC 1 | |||
#else | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#ifdef __LP64__ | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) | |||
#error "Building for OSX 10.2 is no longer supported!" | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_4)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4) | |||
#define MACOS_10_3_OR_EARLIER 1 | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_5)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) | |||
#define MACOS_10_4_OR_EARLIER 1 | |||
#endif | |||
#endif | |||
//============================================================================== | |||
#if JUCE_IPHONE | |||
#include <CoreFoundation/CoreFoundation.h> | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#endif | |||
//============================================================================== | |||
#if JUCE_LINUX | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
// Allow override for big-endian Linux platforms | |||
#ifndef JUCE_BIG_ENDIAN | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#endif | |||
#if defined (__LP64__) || defined (_LP64) | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#define JUCE_INTEL 1 | |||
#endif | |||
//============================================================================== | |||
#ifdef JUCE_FORCE_DEBUG | |||
#undef JUCE_DEBUG | |||
@@ -160,21 +39,6 @@ | |||
#endif | |||
#endif | |||
//============================================================================== | |||
// Compiler type macros. | |||
#ifdef __GNUC__ | |||
#define JUCE_GCC 1 | |||
#elif defined (_MSC_VER) | |||
#define JUCE_MSVC 1 | |||
#if _MSC_VER >= 1400 | |||
#define JUCE_USE_INTRINSICS 1 | |||
#endif | |||
#else | |||
#error unknown compiler | |||
#endif | |||
/** This macro defines the C calling convention used as the standard for Juce calls. */ | |||
#if JUCE_MSVC | |||
#define JUCE_CALLTYPE __stdcall | |||
@@ -217,7 +81,7 @@ | |||
//============================================================================== | |||
// Assertions.. | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
#if JUCE_USE_INTRINSICS | |||
#pragma intrinsic (__debugbreak) | |||
@@ -241,7 +105,7 @@ | |||
#elif JUCE_MAC | |||
#define juce_breakDebugger Debugger(); | |||
#elif JUCE_IPHONE | |||
#define juce_breakDebugger assert (false); | |||
#define juce_breakDebugger kill (0, SIGTRAP); | |||
#elif JUCE_LINUX | |||
#define juce_breakDebugger kill (0, SIGTRAP); | |||
#endif | |||
@@ -76,7 +76,7 @@ public: | |||
#endif | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
//============================================================================== | |||
// Some registry helper functions: | |||
@@ -155,7 +155,7 @@ public: | |||
static void fpuReset(); | |||
#if JUCE_LINUX || JUCE_WIN32 | |||
#if JUCE_LINUX || JUCE_WINDOWS | |||
//============================================================================== | |||
/** Loads a dynamically-linked library into the process's address space. | |||
@@ -46,6 +46,8 @@ | |||
//============================================================================== | |||
#include "juce_TargetPlatform.h" // (sets up the various JUCE_WINDOWS, JUCE_MAC, etc flags) | |||
#include "../../juce_Config.h" | |||
//============================================================================== | |||
@@ -58,7 +60,6 @@ | |||
#endif | |||
//============================================================================== | |||
// This sets up the JUCE_WIN32, JUCE_MAC, or JUCE_LINUX macros | |||
#include "juce_PlatformDefs.h" | |||
// Now we'll include any OS headers we need.. (at this point we are outside the Juce namespace). | |||
@@ -52,7 +52,7 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_NonGUI() | |||
{ | |||
if (! juceInitialisedNonGUI) | |||
{ | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
const ScopedAutoReleasePool pool; | |||
#endif | |||
@@ -84,7 +84,7 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_NonGUI() | |||
} | |||
} | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
// This is imported from the sockets code.. | |||
typedef int (__stdcall juce_CloseWin32SocketLibCall) (void); | |||
extern juce_CloseWin32SocketLibCall* juce_CloseWin32SocketLib; | |||
@@ -98,11 +98,11 @@ void JUCE_PUBLIC_FUNCTION shutdownJuce_NonGUI() | |||
{ | |||
if (juceInitialisedNonGUI) | |||
{ | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
const ScopedAutoReleasePool pool; | |||
#endif | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
// need to shut down sockets if they were used.. | |||
if (juce_CloseWin32SocketLib != 0) | |||
(*juce_CloseWin32SocketLib)(); | |||
@@ -0,0 +1,169 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#ifndef __JUCE_TARGETPLATFORM_JUCEHEADER__ | |||
#define __JUCE_TARGETPLATFORM_JUCEHEADER__ | |||
//============================================================================== | |||
/* This file figures out which platform is being built, and defines some macros | |||
that the rest of the code can use for OS-specific compilation. | |||
Macros that will be set here are: | |||
- One of JUCE_WINDOWS, JUCE_MAC or JUCE_LINUX. | |||
- Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | |||
- Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | |||
- Either JUCE_INTEL or JUCE_PPC | |||
- Either JUCE_GCC or JUCE_MSVC | |||
*/ | |||
//============================================================================== | |||
#if (defined (_WIN32) || defined (_WIN64)) | |||
#define JUCE_WIN32 1 | |||
#define JUCE_WINDOWS 1 | |||
#elif defined (LINUX) || defined (__linux__) | |||
#define JUCE_LINUX 1 | |||
#elif defined(__APPLE_CPP__) || defined(__APPLE_CC__) | |||
#include <CoreFoundation/CoreFoundation.h> // (needed to find out what platform we're using) | |||
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR | |||
#define JUCE_IPHONE 1 | |||
#else | |||
#define JUCE_MAC 1 | |||
#endif | |||
#else | |||
#error "Unknown platform!" | |||
#endif | |||
//============================================================================== | |||
#if JUCE_WINDOWS | |||
#ifdef _MSC_VER | |||
#ifdef _WIN64 | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#endif | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
/** If defined, this indicates that the processor is little-endian. */ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#define JUCE_INTEL 1 | |||
#endif | |||
//============================================================================== | |||
#if JUCE_MAC | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#if defined (__ppc__) || defined (__ppc64__) | |||
#define JUCE_PPC 1 | |||
#else | |||
#define JUCE_INTEL 1 | |||
#endif | |||
#ifdef __LP64__ | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) | |||
#error "Building for OSX 10.2 is no longer supported!" | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_4)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4) | |||
#define MACOS_10_3_OR_EARLIER 1 | |||
#endif | |||
#if (! defined (MAC_OS_X_VERSION_10_5)) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) | |||
#define MACOS_10_4_OR_EARLIER 1 | |||
#endif | |||
#endif | |||
//============================================================================== | |||
#if JUCE_IPHONE | |||
#ifndef NDEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
#ifdef __LITTLE_ENDIAN__ | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#else | |||
#define JUCE_BIG_ENDIAN 1 | |||
#endif | |||
#endif | |||
//============================================================================== | |||
#if JUCE_LINUX | |||
#ifdef _DEBUG | |||
#define JUCE_DEBUG 1 | |||
#endif | |||
// Allow override for big-endian Linux platforms | |||
#ifndef JUCE_BIG_ENDIAN | |||
#define JUCE_LITTLE_ENDIAN 1 | |||
#endif | |||
#if defined (__LP64__) || defined (_LP64) | |||
#define JUCE_64BIT 1 | |||
#else | |||
#define JUCE_32BIT 1 | |||
#endif | |||
#define JUCE_INTEL 1 | |||
#endif | |||
//============================================================================== | |||
// Compiler type macros. | |||
#ifdef __GNUC__ | |||
#define JUCE_GCC 1 | |||
#elif defined (_MSC_VER) | |||
#define JUCE_MSVC 1 | |||
#if _MSC_VER >= 1400 | |||
#define JUCE_USE_INTRINSICS 1 | |||
#endif | |||
#else | |||
#error unknown compiler | |||
#endif | |||
#endif // __JUCE_PLATFORMDEFS_JUCEHEADER__ |
@@ -30,7 +30,7 @@ | |||
#include "juce_StandardHeader.h" | |||
#ifndef JUCE_WIN32 | |||
#ifndef JUCE_WINDOWS | |||
#include <sys/time.h> | |||
#else | |||
#include <ctime> | |||
@@ -90,7 +90,7 @@ static void millisToLocal (const int64 millis, struct tm& result) throw() | |||
{ | |||
time_t now = (time_t) (seconds); | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#ifdef USE_NEW_SECURE_TIME_FNS | |||
if (now >= 0 && now <= 0x793406fff) | |||
localtime_s (&result, &now); | |||
@@ -195,7 +195,7 @@ int64 Time::currentTimeMillis() throw() | |||
{ | |||
// get the time once using normal library calls, and store the difference needed to | |||
// turn the millisecond counter into a real time. | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
struct _timeb t; | |||
#ifdef USE_NEW_SECURE_TIME_FNS | |||
_ftime_s (&t); | |||
@@ -446,7 +446,7 @@ const String Time::getTimeZone() const throw() | |||
{ | |||
String zone[2]; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
_tzset(); | |||
#ifdef USE_NEW_SECURE_TIME_FNS | |||
@@ -129,7 +129,7 @@ void MessageManager::deliverMessage (void* message) | |||
} | |||
//============================================================================== | |||
#if ! JUCE_MAC | |||
#if ! (JUCE_MAC || JUCE_IPHONE) | |||
void MessageManager::runDispatchLoop() | |||
{ | |||
jassert (isThisTheMessageThread()); // must only be called by the message thread | |||
@@ -249,7 +249,7 @@ bool DirectoryContentsList::checkNextFile (bool& hasChanged) | |||
int DirectoryContentsList::compareElements (const DirectoryContentsList::FileInfo* const first, | |||
const DirectoryContentsList::FileInfo* const second) throw() | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
if (first->isDirectory != second->isDirectory) | |||
return first->isDirectory ? -1 : 1; | |||
#endif | |||
@@ -342,7 +342,7 @@ void FileBrowserComponent::fileDoubleClicked (const File& f) | |||
bool FileBrowserComponent::keyPressed (const KeyPress& key) | |||
{ | |||
#if JUCE_LINUX || JUCE_WIN32 | |||
#if JUCE_LINUX || JUCE_WINDOWS | |||
if (key.getModifiers().isCommandDown() | |||
&& (key.getKeyCode() == 'H' || key.getKeyCode() == 'h')) | |||
{ | |||
@@ -441,7 +441,7 @@ const BitArray FileBrowserComponent::getRoots (StringArray& rootNames, StringArr | |||
{ | |||
BitArray separators; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
OwnedArray<File> roots; | |||
File::findFileSystemRoots (roots); | |||
rootPaths.clear(); | |||
@@ -113,7 +113,7 @@ bool FileChooser::showDialog (const bool isDirectory, | |||
jassert (previewComponent == 0 || (previewComponent->getWidth() > 10 | |||
&& previewComponent->getHeight() > 10)); | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
if (useNativeDialogBox) | |||
#else | |||
if (useNativeDialogBox && (previewComponent == 0)) | |||
@@ -28,7 +28,7 @@ | |||
#include "../juce_Component.h" | |||
#if JUCE_WIN32 || DOXYGEN | |||
#if JUCE_WINDOWS || DOXYGEN | |||
//============================================================================== | |||
/** | |||
@@ -31,7 +31,7 @@ | |||
// this is used to disable QuickTime, and is defined in juce_Config.h | |||
#if JUCE_QUICKTIME || DOXYGEN | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#include "juce_ActiveXControlComponent.h" | |||
typedef ActiveXControlComponent QTCompBaseClass; | |||
#else | |||
@@ -179,7 +179,7 @@ private: | |||
File movieFile; | |||
bool movieLoaded, controllerVisible, looping; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
/** @internal */ | |||
void parentHierarchyChanged(); | |||
/** @internal */ | |||
@@ -25,7 +25,7 @@ | |||
#include "../../../core/juce_StandardHeader.h" | |||
#if JUCE_WIN32 || JUCE_LINUX | |||
#if JUCE_WINDOWS || JUCE_LINUX | |||
BEGIN_JUCE_NAMESPACE | |||
@@ -26,7 +26,7 @@ | |||
#ifndef __JUCE_SYSTEMTRAYICONCOMPONENT_JUCEHEADER__ | |||
#define __JUCE_SYSTEMTRAYICONCOMPONENT_JUCEHEADER__ | |||
#if JUCE_WIN32 || JUCE_LINUX || DOXYGEN | |||
#if JUCE_WINDOWS || JUCE_LINUX || DOXYGEN | |||
#include "../juce_Component.h" | |||
@@ -35,11 +35,11 @@ BEGIN_JUCE_NAMESPACE | |||
#include "../geometry/juce_Rectangle.h" | |||
#include "../../../core/juce_SystemStats.h" | |||
#if ! (defined (JUCE_MAC) || (defined (JUCE_WIN32) && defined (JUCE_64BIT))) | |||
#if (JUCE_WINDOWS || JUCE_LINUX) && ! JUCE_64BIT | |||
#define JUCE_USE_SSE_INSTRUCTIONS 1 | |||
#endif | |||
#if defined (JUCE_DEBUG) && JUCE_MSVC | |||
#if JUCE_DEBUG && JUCE_MSVC | |||
#pragma warning (disable: 4714) | |||
#endif | |||
@@ -163,7 +163,7 @@ static void blendRectRGB (uint8* pixels, const int w, int h, const int stride, c | |||
if (alpha <= 0) | |||
return; | |||
#if defined (JUCE_USE_SSE_INSTRUCTIONS) && ! JUCE_64BIT | |||
#if JUCE_USE_SSE_INSTRUCTIONS | |||
if (SystemStats::hasSSE()) | |||
{ | |||
int64 rgb0 = (((int64) blendColour.getRed()) << 32) | |||
@@ -30,7 +30,7 @@ | |||
#include "../../core/juce_StandardHeader.h" | |||
#ifndef JUCE_WIN32 | |||
#if ! JUCE_WINDOWS | |||
#include <pwd.h> | |||
#endif | |||
@@ -103,7 +103,7 @@ static const String parseAbsolutePath (String path) throw() | |||
if (path.isEmpty()) | |||
return String::empty; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
// Windows.. | |||
path = path.replaceCharacter (T('/'), T('\\')); | |||
@@ -271,7 +271,7 @@ bool File::hasWriteAccess() const throw() | |||
if (exists()) | |||
return juce_canWriteToFile (fullPath); | |||
#ifndef JUCE_WIN32 | |||
#if ! JUCE_WINDOWS | |||
else if ((! isDirectory()) && fullPath.containsChar (separator)) | |||
return getParentDirectory().hasWriteAccess(); | |||
else | |||
@@ -444,7 +444,7 @@ bool File::isAChildOf (const File& potentialParent) const throw() | |||
bool File::isAbsolutePath (const String& path) throw() | |||
{ | |||
return path.startsWithChar (T('/')) || path.startsWithChar (T('\\')) | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
|| (path.isNotEmpty() && ((const String&) path)[1] == T(':')); | |||
#else | |||
|| path.startsWithChar (T('~')); | |||
@@ -465,7 +465,7 @@ const File File::getChildFile (String relativePath) const throw() | |||
if (relativePath[0] == T('.')) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
relativePath = relativePath.replaceCharacter (T('/'), T('\\')).trimStart(); | |||
#else | |||
relativePath = relativePath.replaceCharacter (T('\\'), T('/')).trimStart(); | |||
@@ -1100,7 +1100,7 @@ const String File::getRelativePathFrom (const File& dir) const throw() | |||
while (dirPath.isNotEmpty()) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
thisPath = T("..\\") + thisPath; | |||
#else | |||
thisPath = T("../") + thisPath; | |||
@@ -23,7 +23,9 @@ | |||
============================================================================== | |||
*/ | |||
#ifdef _WIN32 | |||
#include "../../core/juce_TargetPlatform.h" | |||
#if JUCE_WINDOWS | |||
#include <winsock2.h> | |||
#ifdef _MSC_VER | |||
@@ -31,16 +33,14 @@ | |||
#endif | |||
#else | |||
#if defined (LINUX) || defined (__linux__) | |||
#if JUCE_LINUX | |||
#include <sys/types.h> | |||
#include <sys/socket.h> | |||
#include <sys/errno.h> | |||
#include <unistd.h> | |||
#include <netinet/in.h> | |||
#else | |||
#if (MACOSX_DEPLOYMENT_TARGET <= MAC_OS_X_VERSION_10_4) && ! (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) | |||
#include <CoreServices/CoreServices.h> | |||
#endif | |||
#elif (MACOSX_DEPLOYMENT_TARGET <= MAC_OS_X_VERSION_10_4) && ! JUCE_IPHONE | |||
#include <CoreServices/CoreServices.h> | |||
#endif | |||
#include <fcntl.h> | |||
@@ -65,7 +65,7 @@ BEGIN_JUCE_NAMESPACE | |||
//============================================================================== | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
typedef int (__stdcall juce_CloseWin32SocketLibCall) (void); | |||
juce_CloseWin32SocketLibCall* juce_CloseWin32SocketLib = 0; | |||
@@ -126,7 +126,7 @@ static int readSocket (const int handle, | |||
{ | |||
int bytesThisTime; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
bytesThisTime = recv (handle, ((char*) destBuffer) + bytesRead, maxBytesToRead - bytesRead, 0); | |||
#else | |||
while ((bytesThisTime = ::read (handle, ((char*) destBuffer) + bytesRead, maxBytesToRead - bytesRead)) < 0 | |||
@@ -179,7 +179,7 @@ static int waitForReadiness (const int handle, const bool forReading, | |||
fd_set* const prset = forReading ? &rset : 0; | |||
fd_set* const pwset = forReading ? 0 : &wset; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
if (select (handle + 1, prset, pwset, 0, timeoutp) < 0) | |||
return -1; | |||
#else | |||
@@ -213,7 +213,7 @@ static int waitForReadiness (const int handle, const bool forReading, | |||
static bool setSocketBlockingState (const int handle, const bool shouldBlock) throw() | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
u_long nonBlocking = shouldBlock ? 0 : 1; | |||
if (ioctlsocket (handle, FIONBIO, &nonBlocking) != 0) | |||
@@ -279,7 +279,7 @@ static bool connectSocket (int volatile& handle, | |||
if (result < 0) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
if (result == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) | |||
#else | |||
if (errno == EINPROGRESS) | |||
@@ -306,7 +306,7 @@ StreamingSocket::StreamingSocket() | |||
connected (false), | |||
isListener (false) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
initWin32Sockets(); | |||
#endif | |||
} | |||
@@ -320,7 +320,7 @@ StreamingSocket::StreamingSocket (const String& hostName_, | |||
connected (true), | |||
isListener (false) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
initWin32Sockets(); | |||
#endif | |||
@@ -344,7 +344,7 @@ int StreamingSocket::write (const void* sourceBuffer, const int numBytesToWrite) | |||
if (isListener || ! connected) | |||
return -1; | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
return send (handle, (const char*) sourceBuffer, numBytesToWrite, 0); | |||
#else | |||
int result; | |||
@@ -403,7 +403,7 @@ bool StreamingSocket::connect (const String& remoteHostName, | |||
void StreamingSocket::close() | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
closesocket (handle); | |||
connected = false; | |||
#else | |||
@@ -497,7 +497,7 @@ DatagramSocket::DatagramSocket (const int localPortNumber, const bool allowBroad | |||
allowBroadcast (allowBroadcast_), | |||
serverAddress (0) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
initWin32Sockets(); | |||
#endif | |||
@@ -514,7 +514,7 @@ DatagramSocket::DatagramSocket (const String& hostName_, const int portNumber_, | |||
allowBroadcast (false), | |||
serverAddress (0) | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
initWin32Sockets(); | |||
#endif | |||
@@ -532,7 +532,7 @@ DatagramSocket::~DatagramSocket() | |||
void DatagramSocket::close() | |||
{ | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
closesocket (handle); | |||
connected = false; | |||
#else | |||
@@ -38,17 +38,18 @@ | |||
#error | |||
#endif | |||
#include "core/juce_TargetPlatform.h" // FORCE_AMALGAMATOR_INCLUDE | |||
#include "../juce_Config.h" // FORCE_AMALGAMATOR_INCLUDE | |||
//============================================================================== | |||
#ifdef _WIN32 | |||
#if JUCE_WINDOWS | |||
#include "native/windows/juce_win32_NativeIncludes.h" | |||
#elif defined (LINUX) | |||
#elif JUCE_LINUX | |||
#include "native/linux/juce_linux_NativeIncludes.h" | |||
#elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR | |||
#include "native/mac/juce_iphone_NativeIncludes.h" | |||
#else | |||
#elif JUCE_MAC || JUCE_IPHONE | |||
#include "native/mac/juce_mac_NativeIncludes.h" | |||
#else | |||
#error "Unknown platform!" | |||
#endif | |||
//============================================================================== | |||
@@ -338,7 +339,7 @@ | |||
#endif | |||
//============================================================================== | |||
#if JUCE_WIN32 | |||
#if JUCE_WINDOWS | |||
#include "native/juce_win32_NativeCode.cpp" | |||
#endif | |||
@@ -346,10 +347,6 @@ | |||
#include "native/juce_linux_NativeCode.cpp" | |||
#endif | |||
#if JUCE_MAC | |||
#if JUCE_MAC || JUCE_IPHONE | |||
#include "native/juce_mac_NativeCode.mm" | |||
#endif | |||
#if JUCE_IPHONE | |||
#include "native/juce_iphone_NativeCode.mm" | |||
#endif |
@@ -1,111 +0,0 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
/* | |||
This file wraps together all the mac-specific code, so that | |||
we can include all the native headers just once, and compile all our | |||
platform-specific stuff in one big lump, keeping it out of the way of | |||
the rest of the codebase. | |||
*/ | |||
#include "mac/juce_iphone_NativeIncludes.h" | |||
BEGIN_JUCE_NAMESPACE | |||
//============================================================================== | |||
#include "../core/juce_Singleton.h" | |||
#include "../core/juce_Random.h" | |||
#include "../core/juce_SystemStats.h" | |||
#include "../threads/juce_Process.h" | |||
#include "../threads/juce_Thread.h" | |||
#include "../threads/juce_InterProcessLock.h" | |||
#include "../io/files/juce_FileInputStream.h" | |||
#include "../io/files/juce_NamedPipe.h" | |||
#include "../io/network/juce_URL.h" | |||
#include "../core/juce_PlatformUtilities.h" | |||
#include "../text/juce_LocalisedStrings.h" | |||
#include "../utilities/juce_DeletedAtShutdown.h" | |||
#include "../application/juce_Application.h" | |||
#include "../utilities/juce_SystemClipboard.h" | |||
#include "../events/juce_MessageManager.h" | |||
#include "../gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" | |||
#include "../gui/graphics/imaging/juce_ImageFileFormat.h" | |||
#include "../gui/graphics/imaging/juce_CameraDevice.h" | |||
#include "../gui/components/windows/juce_AlertWindow.h" | |||
#include "../gui/components/juce_Desktop.h" | |||
#include "../gui/components/menus/juce_MenuBarModel.h" | |||
#include "../gui/components/special/juce_OpenGLComponent.h" | |||
#include "../gui/components/special/juce_QuickTimeMovieComponent.h" | |||
#include "../gui/components/mouse/juce_DragAndDropContainer.h" | |||
#include "../gui/components/keyboard/juce_KeyPressMappingSet.h" | |||
#include "../gui/components/special/juce_NSViewComponent.h" | |||
#include "../gui/components/layout/juce_ComponentMovementWatcher.h" | |||
#include "../gui/components/special/juce_WebBrowserComponent.h" | |||
#include "../gui/components/filebrowser/juce_FileChooser.h" | |||
#include "../audio/audio_file_formats/juce_AudioCDBurner.h" | |||
#include "../audio/audio_file_formats/juce_AudioCDReader.h" | |||
#include "../audio/audio_sources/juce_AudioSource.h" | |||
#include "../audio/dsp/juce_AudioDataConverters.h" | |||
#include "../audio/devices/juce_AudioIODeviceType.h" | |||
#include "../audio/devices/juce_MidiOutput.h" | |||
#include "../audio/devices/juce_MidiInput.h" | |||
#undef Point | |||
//============================================================================== | |||
#define JUCE_INCLUDED_FILE 1 | |||
// Now include the actual code files.. | |||
#include "mac/juce_mac_ObjCSuffix.h" | |||
#include "mac/juce_mac_Strings.mm" | |||
#include "mac/juce_mac_SystemStats.mm" | |||
#include "mac/juce_mac_Network.mm" | |||
#include "common/juce_posix_NamedPipe.cpp" | |||
#include "mac/juce_mac_Threads.mm" | |||
#include "common/juce_posix_SharedCode.h" | |||
#include "mac/juce_mac_Files.mm" | |||
#include "mac/juce_iphone_MiscUtilities.mm" | |||
#include "mac/juce_mac_Debugging.mm" | |||
#if ! JUCE_ONLY_BUILD_CORE_LIBRARY | |||
/*#include "mac/juce_mac_NSViewComponentPeer.mm" | |||
#include "mac/juce_mac_MouseCursor.mm" | |||
#include "mac/juce_mac_NSViewComponent.mm" | |||
#include "mac/juce_mac_AppleRemote.mm" | |||
#include "mac/juce_mac_OpenGLComponent.mm" | |||
#include "mac/juce_mac_MainMenu.mm" | |||
#include "mac/juce_mac_FileChooser.mm" | |||
#include "mac/juce_mac_QuickTimeMovieComponent.mm" | |||
#include "mac/juce_mac_AudioCDBurner.mm" | |||
#include "mac/juce_mac_Fonts.mm" | |||
#include "mac/juce_mac_MessageManager.mm" | |||
#include "mac/juce_mac_WebBrowserComponent.mm" | |||
#include "mac/juce_mac_CoreAudio.cpp" | |||
#include "mac/juce_mac_CoreMidi.cpp" | |||
#include "mac/juce_mac_CameraDevice.mm"*/ | |||
#endif | |||
END_JUCE_NAMESPACE |
@@ -86,25 +86,44 @@ BEGIN_JUCE_NAMESPACE | |||
#include "mac/juce_mac_Threads.mm" | |||
#include "common/juce_posix_SharedCode.h" | |||
#include "mac/juce_mac_Files.mm" | |||
#include "mac/juce_mac_MiscUtilities.mm" | |||
#if JUCE_IPHONE | |||
#include "mac/juce_iphone_MiscUtilities.mm" | |||
#else | |||
#include "mac/juce_mac_MiscUtilities.mm" | |||
#endif | |||
#include "mac/juce_mac_Debugging.mm" | |||
#if ! JUCE_ONLY_BUILD_CORE_LIBRARY | |||
#include "mac/juce_mac_NSViewComponentPeer.mm" | |||
#include "mac/juce_mac_MouseCursor.mm" | |||
#include "mac/juce_mac_NSViewComponent.mm" | |||
#include "mac/juce_mac_AppleRemote.mm" | |||
#include "mac/juce_mac_OpenGLComponent.mm" | |||
#include "mac/juce_mac_MainMenu.mm" | |||
#include "mac/juce_mac_FileChooser.mm" | |||
#include "mac/juce_mac_QuickTimeMovieComponent.mm" | |||
#include "mac/juce_mac_AudioCDBurner.mm" | |||
#include "mac/juce_mac_Fonts.mm" | |||
#include "mac/juce_mac_MessageManager.mm" | |||
#include "mac/juce_mac_WebBrowserComponent.mm" | |||
#include "mac/juce_mac_CoreAudio.cpp" | |||
#include "mac/juce_mac_CoreMidi.cpp" | |||
#include "mac/juce_mac_CameraDevice.mm" | |||
#if JUCE_IPHONE | |||
#include "mac/juce_iphone_UIViewComponentPeer.mm" | |||
#include "mac/juce_iphone_Fonts.mm" | |||
#include "mac/juce_iphone_MessageManager.mm" | |||
#include "mac/juce_mac_FileChooser.mm" | |||
#include "mac/juce_mac_OpenGLComponent.mm" | |||
#include "mac/juce_mac_MouseCursor.mm" | |||
#include "mac/juce_mac_WebBrowserComponent.mm" | |||
//#include "mac/juce_mac_CoreAudio.cpp" | |||
//#include "mac/juce_mac_CameraDevice.mm" | |||
#include "mac/juce_mac_CoreMidi.cpp" | |||
#else | |||
#include "mac/juce_mac_NSViewComponentPeer.mm" | |||
#include "mac/juce_mac_MouseCursor.mm" | |||
#include "mac/juce_mac_NSViewComponent.mm" | |||
#include "mac/juce_mac_AppleRemote.mm" | |||
#include "mac/juce_mac_OpenGLComponent.mm" | |||
#include "mac/juce_mac_MainMenu.mm" | |||
#include "mac/juce_mac_FileChooser.mm" | |||
#include "mac/juce_mac_QuickTimeMovieComponent.mm" | |||
#include "mac/juce_mac_AudioCDBurner.mm" | |||
#include "mac/juce_mac_Fonts.mm" | |||
#include "mac/juce_mac_MessageManager.mm" | |||
#include "mac/juce_mac_WebBrowserComponent.mm" | |||
#include "mac/juce_mac_CoreAudio.cpp" | |||
#include "mac/juce_mac_CoreMidi.cpp" | |||
#include "mac/juce_mac_CameraDevice.mm" | |||
#endif | |||
#endif | |||
END_JUCE_NAMESPACE |
@@ -0,0 +1,449 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
// (This file gets included by juce_mac_NativeCode.mm, rather than being | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
@interface UIKitAUIOHost : UIViewController | |||
{ | |||
@public | |||
/** READONLY The audio format of the data stream. */ | |||
AudioStreamBasicDescription format; | |||
AURenderCallbackStruct inputProc; | |||
Float64 hwSampleRate; | |||
AudioUnit rioUnit; | |||
UGen rawInput; | |||
UGen postFadeOutput; | |||
UGen preFadeOutput; | |||
int bufferSize; | |||
float *floatBuffer; | |||
UInt32 audioInputIsAvailable; | |||
UInt32 numInputChannels; | |||
UInt32 numOutputChannels; | |||
bool isRunning; | |||
float fadeInTime; | |||
UGenArray others; | |||
NSLock* nsLock; | |||
} | |||
/** Initialises the AudioUnit framework and structures. | |||
Do not call this method, it is called automatically when the application launches. */ | |||
- (void)initAudio; | |||
/** Construct a UGen graph. | |||
You must implement this in your subclass. You should return a UGen which will be the UGen graph which is | |||
performed and rendered to the host. The input parameter may be ignored if only signal generation is required | |||
or may be used if a processing algorithm is being implemented (e.g., filtering incoming audio data). | |||
@param input The input UGen which will contain audio data from the host. | |||
@return the UGen graph which will be performed */ | |||
- (UGen)constructGraph:(UGen)input; | |||
- (void)addOther:(UGen)ugen; | |||
- (void)lock; | |||
- (void)unlock; | |||
- (BOOL)tryLock; | |||
@end | |||
#define NUM_CHANNELS 2 | |||
void SetFormat(AudioStreamBasicDescription& format) | |||
{ | |||
memset(&format, 0, sizeof(AudioStreamBasicDescription)); | |||
format.mFormatID = kAudioFormatLinearPCM; | |||
int sampleSize = sizeof(AudioSampleType); | |||
format.mFormatFlags = kAudioFormatFlagsCanonical; | |||
format.mBitsPerChannel = 8 * sampleSize; | |||
format.mChannelsPerFrame = NUM_CHANNELS; | |||
format.mFramesPerPacket = 1; | |||
format.mBytesPerPacket = format.mBytesPerFrame = sampleSize; | |||
format.mFormatFlags |= kAudioFormatFlagIsNonInterleaved; | |||
} | |||
int SetupRemoteIO (AudioUnit& inRemoteIOUnit, AURenderCallbackStruct inRenderProc, AudioStreamBasicDescription& outFormat) | |||
{ | |||
// Open the output unit | |||
AudioComponentDescription desc; | |||
desc.componentType = kAudioUnitType_Output; | |||
desc.componentSubType = kAudioUnitSubType_RemoteIO; | |||
desc.componentManufacturer = kAudioUnitManufacturer_Apple; | |||
desc.componentFlags = 0; | |||
desc.componentFlagsMask = 0; | |||
AudioComponent comp = AudioComponentFindNext (NULL, &desc); | |||
AudioComponentInstanceNew (comp, &inRemoteIOUnit); | |||
const UInt32 one = 1; | |||
AudioUnitSetProperty(inRemoteIOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &one, sizeof(one)); | |||
AudioUnitSetProperty(inRemoteIOUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &inRenderProc, sizeof(inRenderProc)); | |||
AudioUnitSetProperty(inRemoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, sizeof(outFormat)); | |||
AudioUnitSetProperty(inRemoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &outFormat, sizeof(outFormat)); | |||
AudioUnitInitialize(inRemoteIOUnit); | |||
return 0; | |||
} | |||
static const float FloatToFixed824_Factor = 16777216.f; | |||
static const float Fixed824ToFloat_Factor = 5.960464477539e-08f; | |||
static const float FloatToPCM16Bit_Factor = 32767.f; | |||
static const float PCM16BitToFloat_Factor = 3.051850947600e-05f; | |||
static OSStatus PerformThru(void *inRefCon, | |||
AudioUnitRenderActionFlags *ioActionFlags, | |||
const AudioTimeStamp *inTimeStamp, | |||
UInt32 inBusNumber, | |||
UInt32 inNumberFrames, | |||
AudioBufferList *ioData) | |||
{ | |||
OSStatus err = 0; | |||
UIKitAUIOHost *x = (UIKitAUIOHost *)inRefCon; | |||
[x lock]; | |||
if(x->audioInputIsAvailable) | |||
{ | |||
err = AudioUnitRender(x->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); | |||
if (err) { printf("PerformThru: error %d\n", (int)err); return err; } | |||
} | |||
if(inNumberFrames > x->bufferSize) | |||
{ | |||
delete [] x->floatBuffer; | |||
x->bufferSize = inNumberFrames; | |||
x->floatBuffer = new float[inNumberFrames * NUM_CHANNELS]; | |||
} | |||
long blockID = UGen::getNextBlockID(inNumberFrames); | |||
float *floatBufferData[2]; | |||
floatBufferData[0] = x->floatBuffer; | |||
floatBufferData[1] = floatBufferData[0] + inNumberFrames; | |||
if(x->audioInputIsAvailable) | |||
{ | |||
for (UInt32 channel = 0; channel < x->numInputChannels; channel++) | |||
{ | |||
AudioSampleType *audioUnitBuffer = (AudioSampleType*)ioData->mBuffers[0].mData; | |||
float *floatBuffer = floatBufferData[channel]; | |||
for(int sample = 0; sample < inNumberFrames; sample++) | |||
{ | |||
floatBuffer[sample] = (float)audioUnitBuffer[sample] * PCM16BitToFloat_Factor; | |||
} | |||
} | |||
x->rawInput.getSource().setInputs((const float**)floatBufferData, inNumberFrames, x->numInputChannels); | |||
} | |||
else | |||
{ | |||
memset(x->floatBuffer, 0, x->numInputChannels * inNumberFrames * sizeof(float)); | |||
} | |||
x->postFadeOutput.setOutputs(floatBufferData, inNumberFrames, 2); | |||
x->postFadeOutput.prepareAndProcessBlock(inNumberFrames, blockID); | |||
for (UInt32 channel = 0; channel < ioData->mNumberBuffers; channel++) | |||
{ | |||
AudioSampleType *audioUnitBuffer = (AudioSampleType*)ioData->mBuffers[channel].mData; | |||
float *floatBuffer = floatBufferData[channel]; | |||
for(int sample = 0; sample < inNumberFrames; sample++) | |||
{ | |||
audioUnitBuffer[sample] = (AudioSampleType)(floatBuffer[sample] * FloatToPCM16Bit_Factor); | |||
} | |||
} | |||
for(int i = 0; i < x->others.size(); i++) | |||
{ | |||
x->others[i].prepareAndProcessBlock(inNumberFrames, blockID); | |||
} | |||
[x unlock]; | |||
return err; | |||
} | |||
void propListener(void * inClientData, | |||
AudioSessionPropertyID inID, | |||
UInt32 inDataSize, | |||
const void * inPropertyValue) | |||
{ | |||
printf("Property changed!\n"); | |||
UIKitAUIOHost *x = (UIKitAUIOHost *)inClientData; | |||
if(!x->isRunning) return; | |||
if(inPropertyValue) | |||
{ | |||
CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue; | |||
CFNumberRef routeChangeReasonRef = | |||
(CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, | |||
CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); | |||
SInt32 routeChangeReason; | |||
CFNumberGetValue(routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); | |||
CFStringRef newAudioRoute; | |||
UInt32 propertySize = sizeof (CFStringRef); | |||
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &newAudioRoute); | |||
printf("route=%s\n", CFStringGetCStringPtr(newAudioRoute, CFStringGetSystemEncoding())); | |||
} | |||
UInt32 size = sizeof(UInt32); | |||
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels, &size, &x->numInputChannels); | |||
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputNumberChannels, &size, &x->numOutputChannels); | |||
AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &x->audioInputIsAvailable); | |||
printf("inputs=%d outputs=%d audioInputIsAvailable=%d\n", x->numInputChannels, x->numOutputChannels, x->audioInputIsAvailable); | |||
if(x->rioUnit) | |||
{ | |||
AudioComponentInstanceDispose(x->rioUnit); | |||
} | |||
SetFormat(x->format); | |||
SetupRemoteIO(x->rioUnit, x->inputProc, x->format); | |||
x->rawInput.setSource(AudioIn::AR(x->numInputChannels), true); | |||
x->postFadeOutput = Plug::AR(UGen::emptyChannels(x->preFadeOutput.getNumChannels())); | |||
x->postFadeOutput.fadeSourceAndRelease(x->preFadeOutput, x->fadeInTime); | |||
AudioSessionSetActive(true); | |||
AudioOutputUnitStart(x->rioUnit); | |||
} | |||
void rioInterruptionListener(void *inClientData, UInt32 inInterruption) | |||
{ | |||
printf("Session interrupted! --- %s ---\n", inInterruption == kAudioSessionBeginInterruption ? "Begin Interruption" : "End Interruption"); | |||
UIKitAUIOHost *x = (UIKitAUIOHost *)inClientData; | |||
if (inInterruption == kAudioSessionEndInterruption) { | |||
// make sure we are again the active session | |||
//AudioSessionSetActive(false); | |||
AudioSessionSetActive(true); | |||
x->isRunning = true; | |||
AudioOutputUnitStart(x->rioUnit); | |||
} | |||
if (inInterruption == kAudioSessionBeginInterruption) { | |||
x->isRunning = false; | |||
AudioOutputUnitStop(x->rioUnit); | |||
printf("rioInterruptionListener audioInputIsAvailable=%d\n", x->audioInputIsAvailable); | |||
UIAlertView *baseAlert = [[UIAlertView alloc] initWithTitle:@"Audio interrupted" | |||
message:@"This could have been interrupted by another application or due to unplugging a headset:" | |||
delegate:x | |||
cancelButtonTitle:nil | |||
otherButtonTitles:@"Resume", @"Cancel", nil]; | |||
[baseAlert show]; | |||
} | |||
} | |||
@implementation UIKitAUIOHost | |||
- (id)init | |||
{ | |||
if (self = [super init]) | |||
{ | |||
nsLock = [[NSLock alloc] init]; | |||
fadeInTime = 1.0; | |||
[self performSelector:@selector(initAudio) withObject:nil afterDelay:1.0]; | |||
} | |||
return self; | |||
} | |||
- (void)initAudio | |||
{ | |||
// render proc | |||
inputProc.inputProc = PerformThru; | |||
inputProc.inputProcRefCon = self; | |||
// session | |||
AudioSessionInitialize (NULL, NULL, rioInterruptionListener, self); | |||
AudioSessionSetActive (true); | |||
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; | |||
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); | |||
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self); | |||
UInt32 size = sizeof(hwSampleRate); | |||
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &hwSampleRate); | |||
Float32 bufferDuration = 512 / hwSampleRate; | |||
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration); | |||
UGen::initialise(); | |||
UGen::prepareToPlay(hwSampleRate, 512); | |||
rawInput = Plug::AR(UGen::emptyChannels(2)); | |||
preFadeOutput = [self constructGraph: rawInput]; | |||
rioUnit = NULL; | |||
isRunning = true; | |||
propListener((void*)self, 0,0,0); | |||
size = sizeof(format); | |||
AudioUnitGetProperty(rioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, &size); | |||
//Float32 bufferDuration; | |||
size = sizeof(bufferDuration); | |||
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &bufferDuration); | |||
bufferSize = (int)(hwSampleRate*bufferDuration+0.5); | |||
floatBuffer = new float[bufferSize * NUM_CHANNELS]; | |||
} | |||
- (UGen)constructGraph:(UGen)input | |||
{ | |||
return UGen::emptyChannels(NUM_CHANNELS); | |||
} | |||
- (void)addOther:(UGen)ugen | |||
{ | |||
[self lock]; | |||
others <<= ugen; | |||
[self unlock]; | |||
} | |||
- (void)lock | |||
{ | |||
[nsLock lock]; | |||
} | |||
- (void)unlock | |||
{ | |||
[nsLock unlock]; | |||
} | |||
- (BOOL)tryLock | |||
{ | |||
return [nsLock tryLock]; | |||
} | |||
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex | |||
{ | |||
printf("buttonIndex=%d\n", buttonIndex); | |||
if(buttonIndex == 0) | |||
{ | |||
// resume | |||
isRunning = true; | |||
propListener((void*)self, 0,0,0); | |||
} | |||
[alertView release]; | |||
} | |||
-(void) dealloc | |||
{ | |||
UGen::shutdown(); | |||
delete [] floatBuffer; | |||
[nsLock release]; | |||
[super dealloc]; | |||
} | |||
@end | |||
//============================================================================== | |||
class IPhoneAudioIODeviceType : public AudioIODeviceType | |||
{ | |||
public: | |||
//============================================================================== | |||
IPhoneAudioIODeviceType() | |||
: AudioIODeviceType (T("iPhone Audio")), | |||
hasScanned (false) | |||
{ | |||
} | |||
~IPhoneAudioIODeviceType() | |||
{ | |||
} | |||
//============================================================================== | |||
void scanForDevices() | |||
{ | |||
} | |||
const StringArray getDeviceNames (const bool wantInputNames) const | |||
{ | |||
StringArray s; | |||
return s; | |||
} | |||
int getDefaultDeviceIndex (const bool forInput) const | |||
{ | |||
return 0; | |||
} | |||
int getIndexOfDevice (AudioIODevice* device, const bool asInput) const | |||
{ | |||
return 0; | |||
} | |||
bool hasSeparateInputsAndOutputs() const { return true; } | |||
AudioIODevice* createDevice (const String& outputDeviceName, | |||
const String& inputDeviceName) | |||
{ | |||
if (outputDeviceName.isNotEmpty() && inputDeviceName.isNotEmpty()) | |||
return new CoreAudioIODevice (deviceName, | |||
inputIds [inputIndex], | |||
inputIndex, | |||
outputIds [outputIndex], | |||
outputIndex); | |||
return 0; | |||
} | |||
//============================================================================== | |||
juce_UseDebuggingNewOperator | |||
private: | |||
IPhoneAudioIODeviceType (const IPhoneAudioIODeviceType&); | |||
const IPhoneAudioIODeviceType& operator= (const IPhoneAudioIODeviceType&); | |||
}; | |||
//============================================================================== | |||
AudioIODeviceType* juce_createAudioIODeviceType_iPhoneAudio() | |||
{ | |||
return new IPhoneAudioIODeviceType(); | |||
} | |||
#endif |
@@ -0,0 +1,352 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
// (This file gets included by juce_mac_NativeCode.mm, rather than being | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
//============================================================================== | |||
class FontHelper | |||
{ | |||
UIFont* font; | |||
public: | |||
String name; | |||
bool isBold, isItalic, needsItalicTransform; | |||
float fontSize, totalSize, ascent; | |||
int refCount; | |||
FontHelper (const String& name_, | |||
const bool bold_, | |||
const bool italic_, | |||
const float size_) | |||
: font (0), | |||
name (name_), | |||
isBold (bold_), | |||
isItalic (italic_), | |||
needsItalicTransform (false), | |||
fontSize (size_), | |||
refCount (1) | |||
{ | |||
//attributes = [[NSMutableDictionary dictionaryWithObject: [NSNumber numberWithInt: 0] | |||
// forKey: NSLigatureAttributeName] retain]; | |||
font = [UIFont fontWithName: juceStringToNS (name_) size: size_]; | |||
if (italic_) | |||
{ | |||
/* NSFont* newFont = [[NSFontManager sharedFontManager] convertFont: font toHaveTrait: NSItalicFontMask]; | |||
if (newFont == font) | |||
needsItalicTransform = true; // couldn't find a proper italic version, so fake it with a transform.. | |||
font = newFont;*/ | |||
} | |||
// if (bold_) | |||
// font = [[NSFontManager sharedFontManager] convertFont: font toHaveTrait: NSBoldFontMask]; | |||
[font retain]; | |||
ascent = fabsf (font.ascender); | |||
totalSize = ascent + fabsf (font.descender); | |||
} | |||
~FontHelper() | |||
{ | |||
[font release]; | |||
} | |||
bool getPathAndKerning (const juce_wchar char1, | |||
const juce_wchar char2, | |||
Path* path, | |||
float& kerning, | |||
float* ascent, | |||
float* descent) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
return false; | |||
/* if (font == 0 | |||
|| ! [[font coveredCharacterSet] longCharacterIsMember: (UTF32Char) char1]) | |||
return false; | |||
String chars; | |||
chars << ' ' << char1 << char2; | |||
NSTextStorage* textStorage = [[[NSTextStorage alloc] initWithString: juceStringToNS (chars) | |||
attributes: attributes] autorelease]; | |||
NSLayoutManager* layoutManager = [[[NSLayoutManager alloc] init] autorelease]; | |||
NSTextContainer* textContainer = [[[NSTextContainer alloc] init] autorelease]; | |||
[layoutManager addTextContainer: textContainer]; | |||
[textStorage addLayoutManager: layoutManager]; | |||
[textStorage setFont: font]; | |||
unsigned int glyphIndex = [layoutManager glyphRangeForCharacterRange: NSMakeRange (1, 1) | |||
actualCharacterRange: 0].location; | |||
NSPoint p1 = [layoutManager locationForGlyphAtIndex: glyphIndex]; | |||
NSPoint p2 = [layoutManager locationForGlyphAtIndex: glyphIndex + 1]; | |||
kerning = p2.x - p1.x; | |||
if (ascent != 0) | |||
*ascent = this->ascent; | |||
if (descent != 0) | |||
*descent = fabsf ([font descender]); | |||
if (path != 0) | |||
{ | |||
NSBezierPath* bez = [NSBezierPath bezierPath]; | |||
[bez moveToPoint: NSMakePoint (0, 0)]; | |||
[bez appendBezierPathWithGlyph: [layoutManager glyphAtIndex: glyphIndex] | |||
inFont: font]; | |||
for (int i = 0; i < [bez elementCount]; ++i) | |||
{ | |||
NSPoint p[3]; | |||
switch ([bez elementAtIndex: i associatedPoints: p]) | |||
{ | |||
case NSMoveToBezierPathElement: | |||
path->startNewSubPath (p[0].x, -p[0].y); | |||
break; | |||
case NSLineToBezierPathElement: | |||
path->lineTo (p[0].x, -p[0].y); | |||
break; | |||
case NSCurveToBezierPathElement: | |||
path->cubicTo (p[0].x, -p[0].y, p[1].x, -p[1].y, p[2].x, -p[2].y); | |||
break; | |||
case NSClosePathBezierPathElement: | |||
path->closeSubPath(); | |||
break; | |||
default: | |||
jassertfalse | |||
break; | |||
} | |||
} | |||
if (needsItalicTransform) | |||
path->applyTransform (AffineTransform::identity.sheared (-0.15, 0)); | |||
} | |||
return kerning != 0;*/ | |||
} | |||
juce_wchar getDefaultChar() | |||
{ | |||
return 0; | |||
} | |||
}; | |||
//============================================================================== | |||
class FontHelperCache : public Timer, | |||
public DeletedAtShutdown | |||
{ | |||
VoidArray cache; | |||
public: | |||
FontHelperCache() | |||
{ | |||
} | |||
~FontHelperCache() | |||
{ | |||
for (int i = cache.size(); --i >= 0;) | |||
{ | |||
FontHelper* const f = (FontHelper*) cache.getUnchecked(i); | |||
delete f; | |||
} | |||
clearSingletonInstance(); | |||
} | |||
FontHelper* getFont (const String& name, | |||
const bool bold, | |||
const bool italic, | |||
const float size = 1024) | |||
{ | |||
for (int i = cache.size(); --i >= 0;) | |||
{ | |||
FontHelper* const f = (FontHelper*) cache.getUnchecked(i); | |||
if (f->name == name | |||
&& f->isBold == bold | |||
&& f->isItalic == italic | |||
&& f->fontSize == size) | |||
{ | |||
f->refCount++; | |||
return f; | |||
} | |||
} | |||
FontHelper* const f = new FontHelper (name, bold, italic, size); | |||
cache.add (f); | |||
return f; | |||
} | |||
void releaseFont (FontHelper* f) | |||
{ | |||
for (int i = cache.size(); --i >= 0;) | |||
{ | |||
FontHelper* const f2 = (FontHelper*) cache.getUnchecked(i); | |||
if (f == f2) | |||
{ | |||
f->refCount--; | |||
if (f->refCount == 0) | |||
startTimer (5000); | |||
break; | |||
} | |||
} | |||
} | |||
void timerCallback() | |||
{ | |||
stopTimer(); | |||
for (int i = cache.size(); --i >= 0;) | |||
{ | |||
FontHelper* const f = (FontHelper*) cache.getUnchecked(i); | |||
if (f->refCount == 0) | |||
{ | |||
cache.remove (i); | |||
delete f; | |||
} | |||
} | |||
if (cache.size() == 0) | |||
delete this; | |||
} | |||
juce_DeclareSingleton_SingleThreaded_Minimal (FontHelperCache) | |||
}; | |||
juce_ImplementSingleton_SingleThreaded (FontHelperCache) | |||
//============================================================================== | |||
void Typeface::initialiseTypefaceCharacteristics (const String& fontName, | |||
bool bold, | |||
bool italic, | |||
bool addAllGlyphsToFont) throw() | |||
{ | |||
// This method is only safe to be called from the normal UI thread.. | |||
jassert (MessageManager::getInstance()->isThisTheMessageThread()); | |||
FontHelper* const helper = FontHelperCache::getInstance() | |||
->getFont (fontName, bold, italic); | |||
clear(); | |||
setAscent (helper->ascent / helper->totalSize); | |||
setName (fontName); | |||
setDefaultCharacter (helper->getDefaultChar()); | |||
setBold (bold); | |||
setItalic (italic); | |||
if (addAllGlyphsToFont) | |||
{ | |||
//xxx | |||
jassertfalse | |||
} | |||
FontHelperCache::getInstance()->releaseFont (helper); | |||
} | |||
bool Typeface::findAndAddSystemGlyph (juce_wchar character) throw() | |||
{ | |||
// This method is only safe to be called from the normal UI thread.. | |||
jassert (MessageManager::getInstance()->isThisTheMessageThread()); | |||
if (character == 0) | |||
return false; | |||
FontHelper* const helper = FontHelperCache::getInstance() | |||
->getFont (getName(), isBold(), isItalic()); | |||
Path path; | |||
float width; | |||
bool foundOne = false; | |||
if (helper->getPathAndKerning (character, T('I'), &path, width, 0, 0)) | |||
{ | |||
path.applyTransform (AffineTransform::scale (1.0f / helper->totalSize, | |||
1.0f / helper->totalSize)); | |||
addGlyph (character, path, width / helper->totalSize); | |||
for (int i = 0; i < glyphs.size(); ++i) | |||
{ | |||
const TypefaceGlyphInfo* const g = (const TypefaceGlyphInfo*) glyphs.getUnchecked(i); | |||
float kerning; | |||
if (helper->getPathAndKerning (character, g->getCharacter(), 0, kerning, 0, 0)) | |||
{ | |||
kerning = (kerning - width) / helper->totalSize; | |||
if (kerning != 0) | |||
addKerningPair (character, g->getCharacter(), kerning); | |||
} | |||
if (helper->getPathAndKerning (g->getCharacter(), character, 0, kerning, 0, 0)) | |||
{ | |||
kerning = kerning / helper->totalSize - g->width; | |||
if (kerning != 0) | |||
addKerningPair (g->getCharacter(), character, kerning); | |||
} | |||
} | |||
foundOne = true; | |||
} | |||
FontHelperCache::getInstance()->releaseFont (helper); | |||
return foundOne; | |||
} | |||
//============================================================================== | |||
const StringArray Font::findAllTypefaceNames() throw() | |||
{ | |||
StringArray names; | |||
const ScopedAutoReleasePool pool; | |||
NSArray* fonts = [UIFont familyNames]; | |||
for (unsigned int i = 0; i < [fonts count]; ++i) | |||
names.add (nsStringToJuce ((NSString*) [fonts objectAtIndex: i])); | |||
names.sort (true); | |||
return names; | |||
} | |||
void Typeface::getDefaultFontNames (String& defaultSans, String& defaultSerif, String& defaultFixed) throw() | |||
{ | |||
defaultSans = "Lucida Grande"; | |||
defaultSerif = "Times New Roman"; | |||
defaultFixed = "Monaco"; | |||
} | |||
#endif |
@@ -0,0 +1,325 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
// (This file gets included by juce_mac_NativeCode.mm, rather than being | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
struct CallbackMessagePayload | |||
{ | |||
MessageCallbackFunction* function; | |||
void* parameter; | |||
void* volatile result; | |||
bool volatile hasBeenExecuted; | |||
}; | |||
/* When you use multiple DLLs which share similarly-named obj-c classes - like | |||
for example having more than one juce plugin loaded into a host, then when a | |||
method is called, the actual code that runs might actually be in a different module | |||
than the one you expect... So any calls to library functions or statics that are | |||
made inside obj-c methods will probably end up getting executed in a different DLL's | |||
memory space. Not a great thing to happen - this obviously leads to bizarre crashes. | |||
To work around this insanity, I'm only allowing obj-c methods to make calls to | |||
virtual methods of an object that's known to live inside the right module's space. | |||
*/ | |||
class AppDelegateRedirector | |||
{ | |||
public: | |||
AppDelegateRedirector() {} | |||
virtual ~AppDelegateRedirector() {} | |||
virtual BOOL openFile (const NSString* filename) | |||
{ | |||
if (JUCEApplication::getInstance() != 0) | |||
{ | |||
JUCEApplication::getInstance()->anotherInstanceStarted (nsStringToJuce (filename)); | |||
return YES; | |||
} | |||
return NO; | |||
} | |||
virtual void openFiles (NSArray* filenames) | |||
{ | |||
StringArray files; | |||
for (unsigned int i = 0; i < [filenames count]; ++i) | |||
files.add (nsStringToJuce ((NSString*) [filenames objectAtIndex: i])); | |||
if (files.size() > 0 && JUCEApplication::getInstance() != 0) | |||
{ | |||
JUCEApplication::getInstance()->anotherInstanceStarted (files.joinIntoString (T(" "))); | |||
} | |||
} | |||
virtual void focusChanged() | |||
{ | |||
juce_HandleProcessFocusChange(); | |||
} | |||
virtual void deliverMessage (void* message) | |||
{ | |||
// no need for an mm lock here - deliverMessage locks it | |||
MessageManager::getInstance()->deliverMessage (message); | |||
} | |||
virtual void performCallback (CallbackMessagePayload* pl) | |||
{ | |||
pl->result = (*pl->function) (pl->parameter); | |||
pl->hasBeenExecuted = true; | |||
} | |||
virtual void deleteSelf() | |||
{ | |||
delete this; | |||
} | |||
}; | |||
END_JUCE_NAMESPACE | |||
using namespace JUCE_NAMESPACE; | |||
#define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) | |||
static int numPendingMessages = 0; | |||
@interface JuceAppDelegate : NSObject <UIApplicationDelegate> | |||
{ | |||
@private | |||
id oldDelegate; | |||
AppDelegateRedirector* redirector; | |||
@public | |||
bool flushingMessages; | |||
} | |||
- (JuceAppDelegate*) init; | |||
- (void) dealloc; | |||
- (BOOL) application: (UIApplication*) application handleOpenURL: (NSURL*) url; | |||
- (void) applicationDidBecomeActive: (NSNotification*) aNotification; | |||
- (void) applicationDidResignActive: (NSNotification*) aNotification; | |||
- (void) applicationWillUnhide: (NSNotification*) aNotification; | |||
- (void) customEvent: (id) data; | |||
- (void) performCallback: (id) info; | |||
- (void) dummyMethod; | |||
@end | |||
@implementation JuceAppDelegate | |||
- (JuceAppDelegate*) init | |||
{ | |||
[super init]; | |||
redirector = new AppDelegateRedirector(); | |||
numPendingMessages = 0; | |||
flushingMessages = false; | |||
oldDelegate = [[UIApplication sharedApplication] delegate]; | |||
[[UIApplication sharedApplication] setDelegate: self]; | |||
return self; | |||
} | |||
- (void) dealloc | |||
{ | |||
if (oldDelegate != 0) | |||
[[UIApplication sharedApplication] setDelegate: oldDelegate]; | |||
redirector->deleteSelf(); | |||
[super dealloc]; | |||
} | |||
- (BOOL) application: (UIApplication*) application handleOpenURL: (NSURL*) url | |||
{ | |||
return redirector->openFile ([url absoluteString]); | |||
} | |||
- (void) applicationDidBecomeActive: (NSNotification*) aNotification | |||
{ | |||
redirector->focusChanged(); | |||
} | |||
- (void) applicationDidResignActive: (NSNotification*) aNotification | |||
{ | |||
redirector->focusChanged(); | |||
} | |||
- (void) applicationWillUnhide: (NSNotification*) aNotification | |||
{ | |||
redirector->focusChanged(); | |||
} | |||
- (void) customEvent: (id) n | |||
{ | |||
atomicDecrement (numPendingMessages); | |||
NSData* data = (NSData*) n; | |||
void* message = 0; | |||
[data getBytes: &message length: sizeof (message)]; | |||
[data release]; | |||
if (message != 0 && ! flushingMessages) | |||
redirector->deliverMessage (message); | |||
} | |||
- (void) performCallback: (id) info | |||
{ | |||
if ([info isKindOfClass: [NSData class]]) | |||
{ | |||
CallbackMessagePayload* pl = (CallbackMessagePayload*) [((NSData*) info) bytes]; | |||
if (pl != 0) | |||
redirector->performCallback (pl); | |||
} | |||
else | |||
{ | |||
jassertfalse // should never get here! | |||
} | |||
} | |||
- (void) dummyMethod {} // (used as a way of running a dummy thread) | |||
@end | |||
BEGIN_JUCE_NAMESPACE | |||
static JuceAppDelegate* juceAppDelegate = 0; | |||
void MessageManager::runDispatchLoop() | |||
{ | |||
jassert (isThisTheMessageThread()); // must only be called by the message thread | |||
runDispatchLoopUntil (-1); | |||
} | |||
static const int quitMessageId = 0xfffff321; | |||
void MessageManager::stopDispatchLoop() | |||
{ | |||
Message* const m = new Message (quitMessageId, 0, 0, 0); | |||
m->messageRecipient = 0; | |||
postMessageToQueue (m); | |||
quitMessagePosted = true; | |||
} | |||
bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
jassert (isThisTheMessageThread()); // must only be called by the message thread | |||
uint32 endTime = Time::getMillisecondCounter() + millisecondsToRunFor; | |||
NSDate* endDate = [NSDate dateWithTimeIntervalSinceNow: millisecondsToRunFor * 0.001]; | |||
while (! quitMessagePosted) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode | |||
beforeDate: endDate]; | |||
if (millisecondsToRunFor >= 0 && Time::getMillisecondCounter() >= endTime) | |||
break; | |||
} | |||
return ! quitMessagePosted; | |||
} | |||
//============================================================================== | |||
void MessageManager::doPlatformSpecificInitialisation() | |||
{ | |||
if (juceAppDelegate == 0) | |||
juceAppDelegate = [[JuceAppDelegate alloc] init]; | |||
} | |||
void MessageManager::doPlatformSpecificShutdown() | |||
{ | |||
if (juceAppDelegate != 0) | |||
{ | |||
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: juceAppDelegate]; | |||
[[NSNotificationCenter defaultCenter] removeObserver: juceAppDelegate]; | |||
// Annoyingly, cancelPerformSelectorsWithTarget can't actually cancel the messages | |||
// sent by performSelectorOnMainThread, so need to manually flush these before quitting.. | |||
juceAppDelegate->flushingMessages = true; | |||
for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode | |||
beforeDate: [NSDate dateWithTimeIntervalSinceNow: 5 * 0.001]]; | |||
} | |||
[juceAppDelegate release]; | |||
juceAppDelegate = 0; | |||
} | |||
} | |||
bool juce_postMessageToSystemQueue (void* message) | |||
{ | |||
atomicIncrement (numPendingMessages); | |||
[juceAppDelegate performSelectorOnMainThread: @selector (customEvent:) | |||
withObject: (id) [[NSData alloc] initWithBytes: &message length: (int) sizeof (message)] | |||
waitUntilDone: NO]; | |||
return true; | |||
} | |||
void MessageManager::broadcastMessage (const String& value) throw() | |||
{ | |||
} | |||
void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, | |||
void* data) | |||
{ | |||
if (isThisTheMessageThread()) | |||
{ | |||
return (*callback) (data); | |||
} | |||
else | |||
{ | |||
// If a thread has a MessageManagerLock and then tries to call this method, it'll | |||
// deadlock because the message manager is blocked from running, so can never | |||
// call your function.. | |||
jassert (! MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||
const ScopedAutoReleasePool pool; | |||
CallbackMessagePayload cmp; | |||
cmp.function = callback; | |||
cmp.parameter = data; | |||
cmp.result = 0; | |||
cmp.hasBeenExecuted = false; | |||
[juceAppDelegate performSelectorOnMainThread: @selector (performCallback:) | |||
withObject: [NSData dataWithBytesNoCopy: &cmp | |||
length: sizeof (cmp) | |||
freeWhenDone: NO] | |||
waitUntilDone: YES]; | |||
return cmp.result; | |||
} | |||
} | |||
#endif |
@@ -28,6 +28,46 @@ | |||
#ifdef JUCE_INCLUDED_FILE | |||
//============================================================================== | |||
static JUCEApplication* juce_intialisingApp; | |||
END_JUCE_NAMESPACE | |||
@interface JuceAppStartupDelegate : NSObject <UIApplicationDelegate> | |||
{ | |||
} | |||
- (void) applicationDidFinishLaunching: (UIApplication*) application; | |||
- (void) applicationWillResignActive: (UIApplication*) application; | |||
@end | |||
@implementation JuceAppStartupDelegate | |||
- (void) applicationDidFinishLaunching: (UIApplication*) application | |||
{ | |||
String dummy; | |||
if (! juce_intialisingApp->initialiseApp (dummy)) | |||
{ | |||
// (should quit) | |||
} | |||
} | |||
- (void) applicationWillResignActive: (UIApplication*) application | |||
{ | |||
JUCEApplication::shutdownAppAndClearUp(); | |||
} | |||
@end | |||
BEGIN_JUCE_NAMESPACE | |||
int juce_IPhoneMain (int argc, char* argv[], JUCEApplication* app) | |||
{ | |||
juce_intialisingApp = app; | |||
return UIApplicationMain (argc, argv, nil, @"JuceAppStartupDelegate"); | |||
} | |||
//============================================================================== | |||
ScopedAutoReleasePool::ScopedAutoReleasePool() | |||
{ | |||
@@ -1,58 +0,0 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#ifndef __JUCE_MAC_NATIVEINCLUDES_JUCEHEADER__ | |||
#define __JUCE_MAC_NATIVEINCLUDES_JUCEHEADER__ | |||
/* | |||
This file wraps together all the mac-specific code, so that | |||
we can include all the native headers just once, and compile all our | |||
platform-specific stuff in one big lump, keeping it out of the way of | |||
the rest of the codebase. | |||
*/ | |||
#include "../../core/juce_StandardHeader.h" | |||
#import <Foundation/Foundation.h> | |||
#import <UIKit/UIKit.h> | |||
#import <AudioToolbox/AudioToolbox.h> | |||
#import <AVFoundation/AVFoundation.h> | |||
#import <CoreData/CoreData.h> | |||
#import <MobileCoreServices/MobileCoreServices.h> | |||
#include <libkern/OSAtomic.h> | |||
#include <sys/sysctl.h> | |||
#include <sys/stat.h> | |||
//#include <sys/dir.h> | |||
#include <sys/param.h> | |||
#include <sys/mount.h> | |||
#include <fnmatch.h> | |||
#include <utime.h> | |||
#include <dlfcn.h> | |||
#include <ifaddrs.h> | |||
#include <net/if_dl.h> | |||
#include <mach/mach_time.h> | |||
#endif // __JUCE_MAC_NATIVEINCLUDES_JUCEHEADER__ |
@@ -0,0 +1,926 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-9 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
// (This file gets included by juce_mac_NativeCode.mm, rather than being | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
class UIViewComponentPeer; | |||
//============================================================================== | |||
END_JUCE_NAMESPACE | |||
#define JuceUIView MakeObjCClassName(JuceUIView) | |||
@interface JuceUIView : UIView | |||
{ | |||
@public | |||
UIViewComponentPeer* owner; | |||
} | |||
- (JuceUIView*) initWithOwner: (UIViewComponentPeer*) owner withFrame: (CGRect) frame; | |||
- (void) dealloc; | |||
- (void) drawRect: (CGRect) r; | |||
- (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event; | |||
- (void) touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event; | |||
- (void) touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event; | |||
- (void) touchesCancelled: (NSSet*) touches withEvent: (UIEvent*) event; | |||
- (BOOL) becomeFirstResponder; | |||
- (BOOL) resignFirstResponder; | |||
- (BOOL) canBecomeFirstResponder; | |||
@end | |||
//============================================================================== | |||
#define JuceUIWindow MakeObjCClassName(JuceUIWindow) | |||
@interface JuceUIWindow : UIWindow | |||
{ | |||
@private | |||
UIViewComponentPeer* owner; | |||
bool isZooming; | |||
} | |||
- (void) setOwner: (UIViewComponentPeer*) owner; | |||
- (void) becomeKeyWindow; | |||
@end | |||
BEGIN_JUCE_NAMESPACE | |||
//============================================================================== | |||
class UIViewComponentPeer : public ComponentPeer | |||
{ | |||
public: | |||
UIViewComponentPeer (Component* const component, | |||
const int windowStyleFlags, | |||
UIView* viewToAttachTo); | |||
~UIViewComponentPeer(); | |||
//============================================================================== | |||
void* getNativeHandle() const; | |||
void setVisible (bool shouldBeVisible); | |||
void setTitle (const String& title); | |||
void setPosition (int x, int y); | |||
void setSize (int w, int h); | |||
void setBounds (int x, int y, int w, int h, const bool isNowFullScreen); | |||
void getBounds (int& x, int& y, int& w, int& h, const bool global) const; | |||
void getBounds (int& x, int& y, int& w, int& h) const; | |||
int getScreenX() const; | |||
int getScreenY() const; | |||
void relativePositionToGlobal (int& x, int& y); | |||
void globalPositionToRelative (int& x, int& y); | |||
void setMinimised (bool shouldBeMinimised); | |||
bool isMinimised() const; | |||
void setFullScreen (bool shouldBeFullScreen); | |||
bool isFullScreen() const; | |||
bool contains (int x, int y, bool trueIfInAChildWindow) const; | |||
const BorderSize getFrameSize() const; | |||
bool setAlwaysOnTop (bool alwaysOnTop); | |||
void toFront (bool makeActiveWindow); | |||
void toBehind (ComponentPeer* other); | |||
void setIcon (const Image& newIcon); | |||
virtual void drawRect (CGRect r); | |||
virtual bool canBecomeKeyWindow(); | |||
virtual bool windowShouldClose(); | |||
virtual void redirectMovedOrResized(); | |||
virtual CGRect constrainRect (CGRect r); | |||
//============================================================================== | |||
virtual void viewFocusGain(); | |||
virtual void viewFocusLoss(); | |||
bool isFocused() const; | |||
void grabFocus(); | |||
void textInputRequired (int x, int y); | |||
//============================================================================== | |||
void repaint (int x, int y, int w, int h); | |||
void performAnyPendingRepaintsNow(); | |||
//============================================================================== | |||
juce_UseDebuggingNewOperator | |||
UIWindow* window; | |||
JuceUIView* view; | |||
bool isSharedWindow, fullScreen; | |||
}; | |||
//============================================================================== | |||
END_JUCE_NAMESPACE | |||
@implementation JuceUIView | |||
- (JuceUIView*) initWithOwner: (UIViewComponentPeer*) owner_ | |||
withFrame: (CGRect) frame | |||
{ | |||
[super initWithFrame: frame]; | |||
owner = owner_; | |||
return self; | |||
} | |||
- (void) dealloc | |||
{ | |||
[super dealloc]; | |||
} | |||
//============================================================================== | |||
- (void) drawRect: (CGRect) r | |||
{ | |||
if (owner != 0) | |||
owner->drawRect (r); | |||
} | |||
//============================================================================== | |||
bool KeyPress::isKeyCurrentlyDown (const int keyCode) throw() | |||
{ | |||
return false; | |||
} | |||
static int currentModifiers = 0; | |||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() throw() | |||
{ | |||
return ModifierKeys (currentModifiers); | |||
} | |||
void ModifierKeys::updateCurrentModifiers() throw() | |||
{ | |||
currentModifierFlags = currentModifiers; | |||
} | |||
static int getModifierForButtonNumber (const int num) throw() | |||
{ | |||
return num == 0 ? ModifierKeys::leftButtonModifier | |||
: (num == 1 ? ModifierKeys::rightButtonModifier | |||
: (num == 2 ? ModifierKeys::middleButtonModifier : 0)); | |||
} | |||
static int64 getMouseTime (UIEvent* e) { return (int64) [e timestamp] * 1000.0; } | |||
//============================================================================== | |||
- (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event | |||
{ | |||
NSArray* const t = [[event touchesForView: self] allObjects]; | |||
switch ([t count]) | |||
{ | |||
case 1: // One finger.. | |||
{ | |||
CGPoint p = [[t objectAtIndex: 0] locationInView: self]; | |||
currentModifiers |= getModifierForButtonNumber (0); | |||
owner->handleMouseDown (p.x, p.y, getMouseTime (event)); | |||
} | |||
default: | |||
//xxx multi-touch.. | |||
break; | |||
} | |||
} | |||
- (void) touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event | |||
{ | |||
NSArray* const t = [[event touchesForView: self] allObjects]; | |||
switch ([t count]) | |||
{ | |||
case 1: // One finger.. | |||
{ | |||
CGPoint p = [[t objectAtIndex: 0] locationInView: self]; | |||
owner->handleMouseDrag (p.x, p.y, getMouseTime (event)); | |||
} | |||
default: | |||
//xxx multi-touch.. | |||
break; | |||
} | |||
} | |||
- (void) touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event | |||
{ | |||
NSArray* const t = [[event touchesForView: self] allObjects]; | |||
switch ([t count]) | |||
{ | |||
case 1: // One finger.. | |||
{ | |||
CGPoint p = [[t objectAtIndex: 0] locationInView: self]; | |||
const int oldMods = currentModifiers; | |||
currentModifiers &= ~getModifierForButtonNumber (0); | |||
owner->handleMouseUp (oldMods, p.x, p.y, getMouseTime (event)); | |||
} | |||
default: | |||
//xxx multi-touch.. | |||
break; | |||
} | |||
} | |||
- (void) touchesCancelled: (NSSet*) touches withEvent: (UIEvent*) event | |||
{ | |||
[self touchesEnded: touches withEvent: event]; | |||
} | |||
//============================================================================== | |||
- (BOOL) becomeFirstResponder | |||
{ | |||
if (owner != 0) | |||
owner->viewFocusGain(); | |||
return true; | |||
} | |||
- (BOOL) resignFirstResponder | |||
{ | |||
if (owner != 0) | |||
owner->viewFocusLoss(); | |||
return true; | |||
} | |||
- (BOOL) canBecomeFirstResponder | |||
{ | |||
return owner != 0 && owner->canBecomeKeyWindow(); | |||
} | |||
@end | |||
//============================================================================== | |||
@implementation JuceUIWindow | |||
- (void) setOwner: (UIViewComponentPeer*) owner_ | |||
{ | |||
owner = owner_; | |||
isZooming = false; | |||
} | |||
- (void) becomeKeyWindow | |||
{ | |||
[super becomeKeyWindow]; | |||
if (owner != 0) | |||
owner->grabFocus(); | |||
} | |||
@end | |||
//============================================================================== | |||
//============================================================================== | |||
BEGIN_JUCE_NAMESPACE | |||
//============================================================================== | |||
class JuceUIImage | |||
{ | |||
public: | |||
JuceUIImage (const int width, const int height, const bool hasAlpha) | |||
: juceImage (hasAlpha ? Image::ARGB : Image::RGB, | |||
width, height, hasAlpha) | |||
{ | |||
lineStride = 0; | |||
pixelStride = 0; | |||
imageData = juceImage.lockPixelDataReadWrite (0, 0, width, height, | |||
lineStride, pixelStride); | |||
CGDataProviderRef provider = CGDataProviderCreateWithData (0, imageData, lineStride * pixelStride, 0); | |||
imageRef = CGImageCreate (width, height, | |||
8, pixelStride * 8, lineStride, | |||
CGColorSpaceCreateDeviceRGB(), | |||
hasAlpha ? (kCGImageAlphaFirst | kCGBitmapByteOrder32Little) : kCGBitmapByteOrderDefault, | |||
provider, | |||
0, | |||
true, kCGRenderingIntentDefault); | |||
juceImage.releasePixelDataReadWrite (imageData); | |||
uiImage = [[UIImage imageWithCGImage: imageRef] retain]; | |||
} | |||
~JuceUIImage() | |||
{ | |||
[uiImage release]; | |||
CFRelease (imageRef); | |||
} | |||
Image& getJuceImage() throw() { return juceImage; } | |||
void draw (const float x, const float y) const | |||
{ | |||
[uiImage drawAtPoint: CGPointMake (x, y) | |||
blendMode: kCGBlendModeCopy | |||
alpha: 1.0f]; | |||
} | |||
void drawUIImage (UIImage* imageToDraw) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
jassertfalse | |||
/*[NSGraphicsContext saveGraphicsState]; | |||
[NSGraphicsContext setCurrentContext: | |||
[NSGraphicsContext graphicsContextWithBitmapImageRep: imageRep]]; | |||
[imageToDraw drawAtPoint: NSZeroPoint | |||
fromRect: NSMakeRect (0, 0, [imageToDraw size].width, [imageToDraw size].height) | |||
operation: NSCompositeSourceOver | |||
fraction: 1.0f]; | |||
[[NSGraphicsContext currentContext] flushGraphics]; | |||
[NSGraphicsContext restoreGraphicsState]; | |||
if (juceImage.hasAlphaChannel()) | |||
swapRGBOrder (0, 0, juceImage.getWidth(), juceImage.getHeight());*/ | |||
} | |||
private: | |||
Image juceImage; | |||
CGImageRef imageRef; | |||
CGDataProviderRef provider; | |||
UIImage* uiImage; | |||
uint8* imageData; | |||
int pixelStride, lineStride; | |||
/* void swapRGBOrder (const int x, const int y, const int w, int h) const | |||
{ | |||
#if JUCE_BIG_ENDIAN | |||
jassert (pixelStride == 4); | |||
#endif | |||
jassert (Rectangle (0, 0, juceImage.getWidth(), juceImage.getHeight()) | |||
.contains (Rectangle (x, y, w, h))); | |||
uint8* start = imageData + x * pixelStride + y * lineStride; | |||
while (--h >= 0) | |||
{ | |||
uint8* p = start; | |||
start += lineStride; | |||
for (int i = w; --i >= 0;) | |||
{ | |||
#if JUCE_BIG_ENDIAN | |||
const uint8 oldp3 = p[3]; | |||
const uint8 oldp1 = p[1]; | |||
p[3] = p[0]; | |||
p[0] = oldp1; | |||
p[1] = p[2]; | |||
p[2] = oldp3; | |||
#else | |||
const uint8 oldp0 = p[0]; | |||
p[0] = p[2]; | |||
p[2] = oldp0; | |||
#endif | |||
p += pixelStride; | |||
} | |||
} | |||
}*/ | |||
}; | |||
//============================================================================== | |||
UIViewComponentPeer::UIViewComponentPeer (Component* const component, | |||
const int windowStyleFlags, | |||
UIView* viewToAttachTo) | |||
: ComponentPeer (component, windowStyleFlags), | |||
window (0), | |||
view (0), | |||
isSharedWindow (viewToAttachTo != 0), | |||
fullScreen (false) | |||
{ | |||
CGRect r; | |||
r.origin.x = 0; | |||
r.origin.y = 0; | |||
r.size.width = (float) component->getWidth(); | |||
r.size.height = (float) component->getHeight(); | |||
view = [[JuceUIView alloc] initWithOwner: this withFrame: r]; | |||
if (isSharedWindow) | |||
{ | |||
window = [viewToAttachTo window]; | |||
[viewToAttachTo addSubview: view]; | |||
setVisible (component->isVisible()); | |||
} | |||
else | |||
{ | |||
r.origin.x = (float) component->getX(); | |||
r.origin.y = (float) component->getY(); | |||
r.origin.y = [[UIScreen mainScreen] bounds].size.height - (r.origin.y + r.size.height); | |||
window = [[JuceUIWindow alloc] init]; | |||
window.frame = r; | |||
[((JuceUIWindow*) window) setOwner: this]; | |||
if (component->isAlwaysOnTop()) | |||
window.windowLevel = UIWindowLevelAlert; | |||
[window addSubview: view]; | |||
view.frame = CGRectMake (0, 0, r.size.width, r.size.height); | |||
} | |||
setTitle (component->getName()); | |||
} | |||
UIViewComponentPeer::~UIViewComponentPeer() | |||
{ | |||
view->owner = 0; | |||
[view removeFromSuperview]; | |||
[view release]; | |||
if (! isSharedWindow) | |||
{ | |||
[((JuceUIWindow*) window) setOwner: 0]; | |||
[window release]; | |||
} | |||
} | |||
//============================================================================== | |||
void* UIViewComponentPeer::getNativeHandle() const | |||
{ | |||
return view; | |||
} | |||
void UIViewComponentPeer::setVisible (bool shouldBeVisible) | |||
{ | |||
view.hidden = ! shouldBeVisible; | |||
} | |||
void UIViewComponentPeer::setTitle (const String& title) | |||
{ | |||
// xxx is this possible? | |||
} | |||
void UIViewComponentPeer::setPosition (int x, int y) | |||
{ | |||
setBounds (x, y, component->getWidth(), component->getHeight(), false); | |||
} | |||
void UIViewComponentPeer::setSize (int w, int h) | |||
{ | |||
setBounds (component->getX(), component->getY(), w, h, false); | |||
} | |||
void UIViewComponentPeer::setBounds (int x, int y, int w, int h, const bool isNowFullScreen) | |||
{ | |||
fullScreen = isNowFullScreen; | |||
w = jmax (0, w); | |||
h = jmax (0, h); | |||
CGRect r; | |||
r.origin.x = (float) x; | |||
r.origin.y = (float) y; | |||
r.size.width = (float) w; | |||
r.size.height = (float) h; | |||
if (isSharedWindow) | |||
{ | |||
//r.origin.y = [[view superview] frame].size.height - (r.origin.y + r.size.height); | |||
if ([view frame].size.width != r.size.width | |||
|| [view frame].size.height != r.size.height) | |||
[view setNeedsDisplay]; | |||
view.frame = r; | |||
} | |||
else | |||
{ | |||
//r.origin.y = [[UIScreen mainScreen] bounds].size.height - (r.origin.y + r.size.height); | |||
window.frame = r; | |||
view.frame = CGRectMake (0, 0, r.size.width, r.size.height); | |||
} | |||
} | |||
void UIViewComponentPeer::getBounds (int& x, int& y, int& w, int& h, const bool global) const | |||
{ | |||
CGRect r = [view frame]; | |||
if (global && [view window] != 0) | |||
{ | |||
r = [view convertRect: r toView: nil]; | |||
CGRect wr = [[view window] frame]; | |||
r.origin.x += wr.origin.x; | |||
r.origin.y += wr.origin.y; | |||
y = (int) ([[UIScreen mainScreen] bounds].size.height - r.origin.y - r.size.height); | |||
} | |||
else | |||
{ | |||
y = (int) ([[view superview] frame].size.height - r.origin.y - r.size.height); | |||
} | |||
x = (int) r.origin.x; | |||
w = (int) r.size.width; | |||
h = (int) r.size.height; | |||
} | |||
void UIViewComponentPeer::getBounds (int& x, int& y, int& w, int& h) const | |||
{ | |||
getBounds (x, y, w, h, ! isSharedWindow); | |||
} | |||
int UIViewComponentPeer::getScreenX() const | |||
{ | |||
int x, y, w, h; | |||
getBounds (x, y, w, h, true); | |||
return x; | |||
} | |||
int UIViewComponentPeer::getScreenY() const | |||
{ | |||
int x, y, w, h; | |||
getBounds (x, y, w, h, true); | |||
return y; | |||
} | |||
void UIViewComponentPeer::relativePositionToGlobal (int& x, int& y) | |||
{ | |||
int wx, wy, ww, wh; | |||
getBounds (wx, wy, ww, wh, true); | |||
x += wx; | |||
y += wy; | |||
} | |||
void UIViewComponentPeer::globalPositionToRelative (int& x, int& y) | |||
{ | |||
int wx, wy, ww, wh; | |||
getBounds (wx, wy, ww, wh, true); | |||
x -= wx; | |||
y -= wy; | |||
} | |||
CGRect UIViewComponentPeer::constrainRect (CGRect r) | |||
{ | |||
if (constrainer != 0) | |||
{ | |||
CGRect current = [window frame]; | |||
current.origin.y = [[UIScreen mainScreen] bounds].size.height - current.origin.y - current.size.height; | |||
r.origin.y = [[UIScreen mainScreen] bounds].size.height - r.origin.y - r.size.height; | |||
int x = (int) r.origin.x; | |||
int y = (int) r.origin.y; | |||
int w = (int) r.size.width; | |||
int h = (int) r.size.height; | |||
Rectangle original ((int) current.origin.x, (int) current.origin.y, | |||
(int) current.size.width, (int) current.size.height); | |||
constrainer->checkBounds (x, y, w, h, | |||
original, | |||
Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(), | |||
y != original.getY() && y + h == original.getBottom(), | |||
x != original.getX() && x + w == original.getRight(), | |||
y == original.getY() && y + h != original.getBottom(), | |||
x == original.getX() && x + w != original.getRight()); | |||
r.origin.x = x; | |||
r.origin.y = [[UIScreen mainScreen] bounds].size.height - r.size.height - y; | |||
r.size.width = w; | |||
r.size.height = h; | |||
} | |||
return r; | |||
} | |||
void UIViewComponentPeer::setMinimised (bool shouldBeMinimised) | |||
{ | |||
// xxx | |||
} | |||
bool UIViewComponentPeer::isMinimised() const | |||
{ | |||
return false; | |||
} | |||
void UIViewComponentPeer::setFullScreen (bool shouldBeFullScreen) | |||
{ | |||
if (! isSharedWindow) | |||
{ | |||
Rectangle r (lastNonFullscreenBounds); | |||
setMinimised (false); | |||
if (fullScreen != shouldBeFullScreen) | |||
{ | |||
if (shouldBeFullScreen) | |||
r = Desktop::getInstance().getMainMonitorArea(); | |||
// (can't call the component's setBounds method because that'll reset our fullscreen flag) | |||
if (r != getComponent()->getBounds() && ! r.isEmpty()) | |||
setBounds (r.getX(), r.getY(), r.getWidth(), r.getHeight(), shouldBeFullScreen); | |||
} | |||
} | |||
} | |||
bool UIViewComponentPeer::isFullScreen() const | |||
{ | |||
return fullScreen; | |||
} | |||
bool UIViewComponentPeer::contains (int x, int y, bool trueIfInAChildWindow) const | |||
{ | |||
if (((unsigned int) x) >= (unsigned int) component->getWidth() | |||
|| ((unsigned int) y) >= (unsigned int) component->getHeight()) | |||
return false; | |||
CGPoint p; | |||
p.x = (float) x; | |||
p.y = (float) y; | |||
UIView* v = [view hitTest: p withEvent: nil]; | |||
if (trueIfInAChildWindow) | |||
return v != nil; | |||
return v == view; | |||
} | |||
const BorderSize UIViewComponentPeer::getFrameSize() const | |||
{ | |||
BorderSize b; | |||
if (! isSharedWindow) | |||
{ | |||
CGRect v = [view convertRect: [view frame] toView: nil]; | |||
CGRect w = [window frame]; | |||
b.setTop ((int) (w.size.height - (v.origin.y + v.size.height))); | |||
b.setBottom ((int) v.origin.y); | |||
b.setLeft ((int) v.origin.x); | |||
b.setRight ((int) (w.size.width - (v.origin.x + v.size.width))); | |||
} | |||
return b; | |||
} | |||
bool UIViewComponentPeer::setAlwaysOnTop (bool alwaysOnTop) | |||
{ | |||
if (! isSharedWindow) | |||
window.windowLevel = alwaysOnTop ? UIWindowLevelAlert : UIWindowLevelNormal; | |||
return true; | |||
} | |||
void UIViewComponentPeer::toFront (bool makeActiveWindow) | |||
{ | |||
if (isSharedWindow) | |||
[[view superview] bringSubviewToFront: view]; | |||
if (window != 0 && component->isVisible()) | |||
[window makeKeyAndVisible]; | |||
} | |||
void UIViewComponentPeer::toBehind (ComponentPeer* other) | |||
{ | |||
UIViewComponentPeer* o = (UIViewComponentPeer*) other; | |||
if (isSharedWindow) | |||
{ | |||
[[view superview] insertSubview: view belowSubview: o->view]; | |||
} | |||
else | |||
{ | |||
jassertfalse // don't know how to do this | |||
} | |||
} | |||
void UIViewComponentPeer::setIcon (const Image& /*newIcon*/) | |||
{ | |||
// to do.. | |||
} | |||
//============================================================================== | |||
static UIViewComponentPeer* currentlyFocusedPeer = 0; | |||
void UIViewComponentPeer::viewFocusGain() | |||
{ | |||
if (currentlyFocusedPeer != this) | |||
{ | |||
if (ComponentPeer::isValidPeer (currentlyFocusedPeer)) | |||
currentlyFocusedPeer->handleFocusLoss(); | |||
currentlyFocusedPeer = this; | |||
handleFocusGain(); | |||
} | |||
} | |||
void UIViewComponentPeer::viewFocusLoss() | |||
{ | |||
if (currentlyFocusedPeer == this) | |||
{ | |||
currentlyFocusedPeer = 0; | |||
handleFocusLoss(); | |||
} | |||
} | |||
void juce_HandleProcessFocusChange() | |||
{ | |||
if (UIViewComponentPeer::isValidPeer (currentlyFocusedPeer)) | |||
{ | |||
if (Process::isForegroundProcess()) | |||
{ | |||
currentlyFocusedPeer->handleFocusGain(); | |||
ComponentPeer::bringModalComponentToFront(); | |||
} | |||
else | |||
{ | |||
currentlyFocusedPeer->handleFocusLoss(); | |||
// turn kiosk mode off if we lose focus.. | |||
Desktop::getInstance().setKioskModeComponent (0); | |||
} | |||
} | |||
} | |||
bool UIViewComponentPeer::isFocused() const | |||
{ | |||
return isSharedWindow ? this == currentlyFocusedPeer | |||
: (window != 0 && [window isKeyWindow]); | |||
} | |||
void UIViewComponentPeer::grabFocus() | |||
{ | |||
if (window != 0) | |||
{ | |||
[window makeKeyWindow]; | |||
viewFocusGain(); | |||
} | |||
} | |||
void UIViewComponentPeer::textInputRequired (int /*x*/, int /*y*/) | |||
{ | |||
} | |||
//============================================================================== | |||
void UIViewComponentPeer::drawRect (CGRect r) | |||
{ | |||
if (r.size.width < 1.0f || r.size.height < 1.0f) | |||
return; | |||
DBG (Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height).toString()); | |||
const float y = r.origin.y;//[view frame].size.height - (r.origin.y + r.size.height); | |||
JuceUIImage temp ((int) (r.size.width + 0.5f), | |||
(int) (r.size.height + 0.5f), | |||
true);//! getComponent()->isOpaque()); | |||
LowLevelGraphicsSoftwareRenderer context (temp.getJuceImage()); | |||
const int originX = -roundFloatToInt (r.origin.x); | |||
const int originY = -roundFloatToInt (y); | |||
context.setOrigin (originX, originY); | |||
handlePaint (context); | |||
//CGContextClipToRect (UIGraphicsGetCurrentContext(), r); | |||
temp.draw (r.origin.x, r.origin.y); | |||
} | |||
bool UIViewComponentPeer::canBecomeKeyWindow() | |||
{ | |||
return (getStyleFlags() & juce::ComponentPeer::windowIgnoresKeyPresses) == 0; | |||
} | |||
bool UIViewComponentPeer::windowShouldClose() | |||
{ | |||
if (! isValidPeer (this)) | |||
return YES; | |||
handleUserClosingWindow(); | |||
return NO; | |||
} | |||
void UIViewComponentPeer::redirectMovedOrResized() | |||
{ | |||
handleMovedOrResized(); | |||
} | |||
//============================================================================== | |||
void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool allowMenusAndBars) | |||
{ | |||
} | |||
//============================================================================== | |||
void UIViewComponentPeer::repaint (int x, int y, int w, int h) | |||
{ | |||
[view setNeedsDisplayInRect: | |||
CGRectMake ((float) x, (float) y,//([view frame].size.height - (y + h)), | |||
(float) w, (float) h)]; | |||
} | |||
void UIViewComponentPeer::performAnyPendingRepaintsNow() | |||
{ | |||
} | |||
ComponentPeer* Component::createNewPeer (int styleFlags, void* windowToAttachTo) | |||
{ | |||
return new UIViewComponentPeer (this, styleFlags, (UIView*) windowToAttachTo); | |||
} | |||
//============================================================================== | |||
static Image* UIImageToJuceImage (UIImage* image) | |||
{ | |||
JuceUIImage juceIm ((int) [image size].width, | |||
(int) [image size].height, | |||
true); | |||
juceIm.drawUIImage (image); | |||
return juceIm.getJuceImage().createCopy(); | |||
} | |||
Image* juce_createIconForFile (const File& file) | |||
{ | |||
return 0; | |||
} | |||
//============================================================================== | |||
const int KeyPress::spaceKey = ' '; | |||
const int KeyPress::returnKey = 0x0d; | |||
const int KeyPress::escapeKey = 0x1b; | |||
const int KeyPress::backspaceKey = 0x7f; | |||
const int KeyPress::leftKey = 0x1000; | |||
const int KeyPress::rightKey = 0x1001; | |||
const int KeyPress::upKey = 0x1002; | |||
const int KeyPress::downKey = 0x1003; | |||
const int KeyPress::pageUpKey = 0x1004; | |||
const int KeyPress::pageDownKey = 0x1005; | |||
const int KeyPress::endKey = 0x1006; | |||
const int KeyPress::homeKey = 0x1007; | |||
const int KeyPress::deleteKey = 0x1008; | |||
const int KeyPress::insertKey = -1; | |||
const int KeyPress::tabKey = 9; | |||
const int KeyPress::F1Key = 0x2001; | |||
const int KeyPress::F2Key = 0x2002; | |||
const int KeyPress::F3Key = 0x2003; | |||
const int KeyPress::F4Key = 0x2004; | |||
const int KeyPress::F5Key = 0x2005; | |||
const int KeyPress::F6Key = 0x2006; | |||
const int KeyPress::F7Key = 0x2007; | |||
const int KeyPress::F8Key = 0x2008; | |||
const int KeyPress::F9Key = 0x2009; | |||
const int KeyPress::F10Key = 0x200a; | |||
const int KeyPress::F11Key = 0x200b; | |||
const int KeyPress::F12Key = 0x200c; | |||
const int KeyPress::F13Key = 0x200d; | |||
const int KeyPress::F14Key = 0x200e; | |||
const int KeyPress::F15Key = 0x200f; | |||
const int KeyPress::F16Key = 0x2010; | |||
const int KeyPress::numberPad0 = 0x30020; | |||
const int KeyPress::numberPad1 = 0x30021; | |||
const int KeyPress::numberPad2 = 0x30022; | |||
const int KeyPress::numberPad3 = 0x30023; | |||
const int KeyPress::numberPad4 = 0x30024; | |||
const int KeyPress::numberPad5 = 0x30025; | |||
const int KeyPress::numberPad6 = 0x30026; | |||
const int KeyPress::numberPad7 = 0x30027; | |||
const int KeyPress::numberPad8 = 0x30028; | |||
const int KeyPress::numberPad9 = 0x30029; | |||
const int KeyPress::numberPadAdd = 0x3002a; | |||
const int KeyPress::numberPadSubtract = 0x3002b; | |||
const int KeyPress::numberPadMultiply = 0x3002c; | |||
const int KeyPress::numberPadDivide = 0x3002d; | |||
const int KeyPress::numberPadSeparator = 0x3002e; | |||
const int KeyPress::numberPadDecimalPoint = 0x3002f; | |||
const int KeyPress::numberPadEquals = 0x30030; | |||
const int KeyPress::numberPadDelete = 0x30031; | |||
const int KeyPress::playKey = 0x30000; | |||
const int KeyPress::stopKey = 0x30001; | |||
const int KeyPress::fastForwardKey = 0x30002; | |||
const int KeyPress::rewindKey = 0x30003; | |||
#endif |
@@ -27,7 +27,6 @@ | |||
// compiled on its own). | |||
#if JUCE_INCLUDED_FILE && JUCE_QUICKTIME && JUCE_USE_CAMERA | |||
//============================================================================== | |||
#define QTCaptureCallbackDelegate MakeObjCClassName(QTCaptureCallbackDelegate) | |||
@@ -399,5 +398,4 @@ CameraDevice* CameraDevice::openDevice (int index, | |||
return 0; | |||
} | |||
#endif |
@@ -27,6 +27,8 @@ | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
#if JUCE_MAC | |||
//============================================================================== | |||
#undef log | |||
#define log(a) Logger::writeToLog(a) | |||
@@ -586,4 +588,50 @@ void MidiInput::stop() | |||
#undef log | |||
#else | |||
MidiOutput::~MidiOutput() | |||
{ | |||
} | |||
void MidiOutput::reset() | |||
{ | |||
} | |||
bool MidiOutput::getVolume (float& leftVol, float& rightVol) | |||
{ | |||
return false; | |||
} | |||
void MidiOutput::setVolume (float leftVol, float rightVol) | |||
{ | |||
} | |||
void MidiOutput::sendMessageNow (const MidiMessage& message) | |||
{ | |||
} | |||
const StringArray MidiOutput::getDevices() | |||
{ | |||
return StringArray(); | |||
} | |||
MidiOutput* MidiOutput::openDevice (int index) | |||
{ | |||
return 0; | |||
} | |||
const StringArray MidiInput::getDevices() | |||
{ | |||
return StringArray(); | |||
} | |||
MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) | |||
{ | |||
return 0; | |||
} | |||
#endif | |||
#endif |
@@ -27,6 +27,8 @@ | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
#if JUCE_MAC | |||
//============================================================================== | |||
END_JUCE_NAMESPACE | |||
using namespace JUCE_NAMESPACE; | |||
@@ -147,4 +149,24 @@ void FileChooser::showPlatformDialog (OwnedArray<File>& results, | |||
[panel setDelegate: nil]; | |||
} | |||
#else | |||
//============================================================================== | |||
void FileChooser::showPlatformDialog (OwnedArray<File>& results, | |||
const String& title, | |||
const File& currentFileOrDirectory, | |||
const String& filter, | |||
bool selectsDirectory, | |||
bool isSaveDialogue, | |||
bool warnAboutOverwritingExistingFiles, | |||
bool selectMultipleFiles, | |||
FilePreviewComponent* extraInfoComponent) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
jassertfalse //xxx to do | |||
} | |||
#endif | |||
#endif |
@@ -295,8 +295,13 @@ const String File::getVersion() const throw() | |||
//============================================================================== | |||
const File File::getLinkedTarget() const throw() | |||
{ | |||
#if JUCE_IPHONE || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) | |||
NSString* dest = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath: juceStringToNS (getFullPathName()) error: nil]; | |||
#else | |||
NSString* dest = [[NSFileManager defaultManager] pathContentOfSymbolicLinkAtPath: juceStringToNS (getFullPathName())]; | |||
#endif | |||
if (dest != nil) | |||
return File (nsStringToJuce (dest)); | |||
@@ -332,31 +337,6 @@ struct FindFileStruct | |||
String parentDir; | |||
}; | |||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile, | |||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, | |||
Time* creationTime, bool* isReadOnly) throw() | |||
{ | |||
NSDirectoryEnumerator* e = [[NSFileManager defaultManager] enumeratorAtPath: juceStringToNS (directory)]; | |||
if (e != 0) | |||
{ | |||
FindFileStruct* ff = new FindFileStruct(); | |||
ff->enumerator = [e retain]; | |||
ff->parentDir = directory; | |||
if (! ff->parentDir.endsWithChar (File::separator)) | |||
ff->parentDir += File::separator; | |||
if (juce_findFileNext (ff, firstResultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly)) | |||
return ff; | |||
[e release]; | |||
delete ff; | |||
} | |||
return 0; | |||
} | |||
bool juce_findFileNext (void* handle, String& resultFile, | |||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) throw() | |||
{ | |||
@@ -404,6 +384,31 @@ bool juce_findFileNext (void* handle, String& resultFile, | |||
return true; | |||
} | |||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile, | |||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime, | |||
Time* creationTime, bool* isReadOnly) throw() | |||
{ | |||
NSDirectoryEnumerator* e = [[NSFileManager defaultManager] enumeratorAtPath: juceStringToNS (directory)]; | |||
if (e != 0) | |||
{ | |||
FindFileStruct* ff = new FindFileStruct(); | |||
ff->enumerator = [e retain]; | |||
ff->parentDir = directory; | |||
if (! ff->parentDir.endsWithChar (File::separator)) | |||
ff->parentDir += File::separator; | |||
if (juce_findFileNext (ff, firstResultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly)) | |||
return ff; | |||
[e release]; | |||
delete ff; | |||
} | |||
return 0; | |||
} | |||
void juce_findFileClose (void* handle) throw() | |||
{ | |||
FindFileStruct* ff = (FindFileStruct*) handle; | |||
@@ -437,7 +442,7 @@ bool juce_launchFile (const String& fileName, | |||
const String& parameters) throw() | |||
{ | |||
#if JUCE_IPHONE | |||
return false; // is this possible? | |||
return [[UIApplication sharedApplication] openURL: [NSURL fileURLWithPath: juceStringToNS (fileName)]]; | |||
#else | |||
const ScopedAutoReleasePool pool; | |||
@@ -502,7 +507,12 @@ const String PlatformUtilities::makePathFromFSRef (FSRef* file) | |||
OSType PlatformUtilities::getTypeOfFile (const String& filename) | |||
{ | |||
const ScopedAutoReleasePool pool; | |||
#if JUCE_IPHONE || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) | |||
NSDictionary* fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath: juceStringToNS (filename) error: nil]; | |||
#else | |||
NSDictionary* fileDict = [[NSFileManager defaultManager] fileAttributesAtPath: juceStringToNS (filename) traverseLink: NO]; | |||
#endif | |||
return (OSType) [fileDict objectForKey: NSFileHFSTypeCode]; | |||
} | |||
@@ -27,6 +27,8 @@ | |||
// compiled on its own). | |||
#ifdef JUCE_INCLUDED_FILE | |||
#if JUCE_MAC | |||
//============================================================================== | |||
static NSImage* juceImageToNSImage (const Image& image) | |||
{ | |||
@@ -187,4 +189,14 @@ void MouseCursor::showInWindow (ComponentPeer*) const throw() | |||
[c set]; | |||
} | |||
#else | |||
void* juce_createMouseCursorFromImage (const Image& image, int hotspotX, int hotspotY) throw() { return 0; } | |||
void* juce_createStandardMouseCursor (MouseCursor::StandardCursorType type) throw() { return 0; } | |||
void juce_deleteMouseCursor (void* const cursorHandle, const bool isStandard) throw() {} | |||
void MouseCursor::showInAllWindows() const throw() {} | |||
void MouseCursor::showInWindow (ComponentPeer*) const throw() {} | |||
#endif | |||
#endif |
@@ -35,22 +35,33 @@ | |||
#include "../../core/juce_StandardHeader.h" | |||
#import <Cocoa/Cocoa.h> | |||
#import <CoreAudio/HostTime.h> | |||
#import <CoreAudio/AudioHardware.h> | |||
#import <CoreMIDI/MIDIServices.h> | |||
#import <QTKit/QTKit.h> | |||
#import <WebKit/WebKit.h> | |||
#import <DiscRecording/DiscRecording.h> | |||
#import <IOKit/IOKitLib.h> | |||
#import <IOKit/IOCFPlugIn.h> | |||
#import <IOKit/hid/IOHIDLib.h> | |||
#import <IOKit/hid/IOHIDKeys.h> | |||
#import <IOKit/pwr_mgt/IOPMLib.h> | |||
#if JUCE_IPHONE | |||
#import <Foundation/Foundation.h> | |||
#import <UIKit/UIKit.h> | |||
#import <AudioToolbox/AudioToolbox.h> | |||
#import <AVFoundation/AVFoundation.h> | |||
#import <CoreData/CoreData.h> | |||
#import <MobileCoreServices/MobileCoreServices.h> | |||
#include <sys/fcntl.h> | |||
#else | |||
#import <Cocoa/Cocoa.h> | |||
#import <CoreAudio/HostTime.h> | |||
#import <CoreAudio/AudioHardware.h> | |||
#import <CoreMIDI/MIDIServices.h> | |||
#import <QTKit/QTKit.h> | |||
#import <WebKit/WebKit.h> | |||
#import <DiscRecording/DiscRecording.h> | |||
#import <IOKit/IOKitLib.h> | |||
#import <IOKit/IOCFPlugIn.h> | |||
#import <IOKit/hid/IOHIDLib.h> | |||
#import <IOKit/hid/IOHIDKeys.h> | |||
#import <IOKit/pwr_mgt/IOPMLib.h> | |||
#include <sys/dir.h> | |||
#include <sys/socket.h> | |||
#endif | |||
#include <sys/sysctl.h> | |||
#include <sys/stat.h> | |||
#include <sys/dir.h> | |||
#include <sys/param.h> | |||
#include <sys/mount.h> | |||
#include <fnmatch.h> | |||
@@ -27,6 +27,8 @@ | |||
// compiled on its own). | |||
#if JUCE_INCLUDED_FILE && JUCE_OPENGL | |||
#if JUCE_MAC | |||
END_JUCE_NAMESPACE | |||
#define ThreadSafeNSOpenGLView MakeObjCClassName(ThreadSafeNSOpenGLView) | |||
@@ -315,4 +317,21 @@ void OpenGLPixelFormat::getAvailablePixelFormats (Component* /*component*/, | |||
//jassertfalse //xxx can't see how you do this in cocoa! | |||
} | |||
#else | |||
//============================================================================== | |||
OpenGLContext* OpenGLContext::createContextForWindow (Component* const component, | |||
const OpenGLPixelFormat& pixelFormat, | |||
const OpenGLContext* const contextToShareWith) | |||
{ | |||
return 0; | |||
} | |||
void juce_glViewport (const int w, const int h) | |||
{ | |||
//glViewport (0, 0, w, h); | |||
} | |||
#endif | |||
#endif |
@@ -170,7 +170,7 @@ void SystemClipboard::copyTextToClipboard (const String& text) throw() | |||
{ | |||
#if JUCE_IPHONE | |||
[[UIPasteboard generalPasteboard] setValue: juceStringToNS (text) | |||
forPasteboardType: (NSString*) kUTTypePlainText]; | |||
forPasteboardType: @"public.text"]; | |||
#else | |||
[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject: NSStringPboardType] | |||
owner: nil]; | |||
@@ -183,7 +183,7 @@ void SystemClipboard::copyTextToClipboard (const String& text) throw() | |||
const String SystemClipboard::getTextFromClipboard() throw() | |||
{ | |||
#if JUCE_IPHONE | |||
NSString* text = [[UIPasteboard generalPasteboard] valueForPasteboardType: (NSString*) kUTTypePlainText]; | |||
NSString* text = [[UIPasteboard generalPasteboard] valueForPasteboardType: @"public.text"]; | |||
#else | |||
NSString* text = [[NSPasteboard generalPasteboard] stringForType: NSStringPboardType]; | |||
#endif | |||
@@ -27,6 +27,8 @@ | |||
// compiled on its own). | |||
#if JUCE_INCLUDED_FILE && JUCE_WEB_BROWSER | |||
#if JUCE_MAC | |||
//============================================================================== | |||
END_JUCE_NAMESPACE | |||
@@ -266,4 +268,70 @@ bool WebBrowserComponent::pageAboutToLoad (const String& url) | |||
return true; | |||
} | |||
#else | |||
//============================================================================== | |||
WebBrowserComponent::WebBrowserComponent (const bool unloadPageWhenBrowserIsHidden_) | |||
{ | |||
} | |||
WebBrowserComponent::~WebBrowserComponent() | |||
{ | |||
} | |||
//============================================================================== | |||
void WebBrowserComponent::goToURL (const String& url, | |||
const StringArray* headers, | |||
const MemoryBlock* postData) | |||
{ | |||
} | |||
void WebBrowserComponent::stop() | |||
{ | |||
} | |||
void WebBrowserComponent::goBack() | |||
{ | |||
} | |||
void WebBrowserComponent::goForward() | |||
{ | |||
} | |||
void WebBrowserComponent::refresh() | |||
{ | |||
} | |||
//============================================================================== | |||
void WebBrowserComponent::paint (Graphics& g) | |||
{ | |||
} | |||
void WebBrowserComponent::checkWindowAssociation() | |||
{ | |||
} | |||
void WebBrowserComponent::reloadLastURL() | |||
{ | |||
} | |||
void WebBrowserComponent::parentHierarchyChanged() | |||
{ | |||
} | |||
void WebBrowserComponent::resized() | |||
{ | |||
} | |||
void WebBrowserComponent::visibilityChanged() | |||
{ | |||
} | |||
bool WebBrowserComponent::pageAboutToLoad (const String& url) | |||
{ | |||
return true; | |||
} | |||
#endif | |||
#endif |
@@ -28,6 +28,7 @@ | |||
#define __JUCE_WIN32_NATIVEINCLUDES_JUCEHEADER__ | |||
#include "../../core/juce_TargetPlatform.h" | |||
#include "../../../juce_Config.h" | |||
#ifndef STRICT | |||