From ec43e11abcdbb88581a3104b9a17e26f68823454 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Thu, 11 Jul 2019 11:09:16 +0100 Subject: [PATCH] VS2013: Removed the VS2013 exporter from the Projucer --- BREAKING-CHANGES.txt | 25 + README.md | 2 +- .../vending/billing/IInAppBillingService.java | 971 --- .../java/com/juce/demorunner/DemoRunner.java | 3166 ---------- .../demorunner/SharingContentProvider.java | 138 - .../com/roli/juce/demorunner/DemoRunner.java | 2996 --------- .../demorunner/SharingContentProvider.java | 138 - .../Builds/VisualStudio2013/DemoRunner.sln | 20 - .../VisualStudio2013/DemoRunner_App.vcxproj | 3096 ---------- .../DemoRunner_App.vcxproj.filters | 5351 ----------------- .../Builds/VisualStudio2013/icon.ico | Bin 33530 -> 0 bytes .../Builds/VisualStudio2013/resources.rc | 34 - examples/DemoRunner/DemoRunner.jucer | 29 - .../DemoRunner/JuceLibraryCode/AppConfig.h | 2 +- extras/AudioPluginHost/AudioPluginHost.jucer | 25 +- .../vending/billing/IInAppBillingService.java | 971 --- .../roli/juce/pluginhost/AudioPluginHost.java | 3166 ---------- .../pluginhost/SharingContentProvider.java | 138 - .../VisualStudio2013/AudioPluginHost.sln | 20 - .../AudioPluginHost_App.vcxproj | 2650 -------- .../AudioPluginHost_App.vcxproj.filters | 4532 -------------- .../Builds/VisualStudio2013/icon.ico | Bin 33530 -> 0 bytes .../Builds/VisualStudio2013/resources.rc | 34 - .../AudioPluginHost_App.vcxproj | 4 +- .../JuceLibraryCode/AppConfig.h | 2 +- .../Builds/VisualStudio2013/Projucer.sln | 20 - .../VisualStudio2013/Projucer_App.vcxproj | 2107 ------- .../Projucer_App.vcxproj.filters | 3758 ------------ .../Projucer/Builds/VisualStudio2013/icon.ico | Bin 33530 -> 0 bytes .../Builds/VisualStudio2013/resources.rc | 34 - extras/Projucer/Projucer.jucer | 18 - .../ProjectSaving/jucer_ProjectExport_MSVC.h | 46 - .../ProjectSaving/jucer_ProjectExporter.cpp | 19 +- 33 files changed, 36 insertions(+), 33476 deletions(-) delete mode 100644 examples/DemoRunner/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java delete mode 100644 examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java delete mode 100644 examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/SharingContentProvider.java delete mode 100644 examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/DemoRunner.java delete mode 100644 examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/SharingContentProvider.java delete mode 100644 examples/DemoRunner/Builds/VisualStudio2013/DemoRunner.sln delete mode 100644 examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj delete mode 100644 examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters delete mode 100644 examples/DemoRunner/Builds/VisualStudio2013/icon.ico delete mode 100644 examples/DemoRunner/Builds/VisualStudio2013/resources.rc delete mode 100644 extras/AudioPluginHost/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java delete mode 100644 extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/AudioPluginHost.java delete mode 100644 extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/SharingContentProvider.java delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost.sln delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj.filters delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2013/icon.ico delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2013/resources.rc delete mode 100644 extras/Projucer/Builds/VisualStudio2013/Projucer.sln delete mode 100644 extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj delete mode 100644 extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters delete mode 100644 extras/Projucer/Builds/VisualStudio2013/icon.ico delete mode 100644 extras/Projucer/Builds/VisualStudio2013/resources.rc diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index 40441fe0c3..f44119341c 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -4,6 +4,31 @@ JUCE breaking changes Develop ======= +Change +------ +The Visual Studio 2013 exporter has been removed from the Projucer and we will +no longer maintain backwards compatibility with Visual Studio 2013 in JUCE. + +Possible Issues +--------------- +It is no longer possible to create Visual Studio 2013 projects from the +Projucer or compile JUCE-based software using Visual Studio 2013. + +Workaround +---------- +If you are using Visual Studio 2013 to build your projects you will need to +update to a more modern version of Visual Studio. + +Rationale +--------- +Of all the platforms JUCE supports Visual Studio 2013 was holding us back the +most in terms of C++ features we would like to use more broadly across the +codebase. It is still possible to target older versions of Windows with more +modern versions of Visual Studio. Until recently the AAX SDK was distributed as +a Visual Studio 2013 project, but this is now provided as a Visual Studio 2017 +project. + + Change ------ JUCE is moving towards using C++11 pointer container types instead of passing diff --git a/README.md b/README.md index 258d6724fc..c585655cdf 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ For further help getting started, please refer to the JUCE ## Minimum System Requirements #### Building JUCE Projects - __macOS__: macOS 10.11 and Xcode 7.3.1 -- __Windows__: Windows 8.1 and Visual Studio 2013 64-bit +- __Windows__: Windows 8.1 and Visual Studio 2015 64-bit - __Linux__: GCC 4.8 #### Deployment Targets diff --git a/examples/DemoRunner/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java b/examples/DemoRunner/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java deleted file mode 100644 index 0bb31cb5d3..0000000000 --- a/examples/DemoRunner/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java +++ /dev/null @@ -1,971 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.android.vending.billing; -/** - * InAppBillingService is the service that provides in-app billing version 3 and beyond. - * This service provides the following features: - * 1. Provides a new API to get details of in-app items published for the app including - * price, type, title and description. - * 2. The purchase flow is synchronous and purchase information is available immediately - * after it completes. - * 3. Purchase information of in-app purchases is maintained within the Google Play system - * till the purchase is consumed. - * 4. An API to consume a purchase of an inapp item. All purchases of one-time - * in-app items are consumable and thereafter can be purchased again. - * 5. An API to get current purchases of the user immediately. This will not contain any - * consumed purchases. - * - * All calls will give a response code with the following possible values - * RESULT_OK = 0 - success - * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog - * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down - * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested - * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase - * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API - * RESULT_ERROR = 6 - Fatal error during the API action - * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned - * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned - */ -public interface IInAppBillingService extends android.os.IInterface - { - /** Local-side IPC implementation stub class. */ - public static abstract class Stub extends android.os.Binder implements com.android.vending.billing.IInAppBillingService - { - private static final java.lang.String DESCRIPTOR = "com.android.vending.billing.IInAppBillingService"; - /** Construct the stub at attach it to the interface. */ - public Stub() - { - this.attachInterface(this, DESCRIPTOR); - } - /** - * Cast an IBinder object into an com.android.vending.billing.IInAppBillingService interface, - * generating a proxy if needed. - */ - public static com.android.vending.billing.IInAppBillingService asInterface(android.os.IBinder obj) - { - if ((obj==null)) { - return null; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - if (((iin!=null)&&(iin instanceof com.android.vending.billing.IInAppBillingService))) { - return ((com.android.vending.billing.IInAppBillingService)iin); - } - return new com.android.vending.billing.IInAppBillingService.Stub.Proxy(obj); - } - @Override public android.os.IBinder asBinder() - { - return this; - } - @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException - { - switch (code) - { - case INTERFACE_TRANSACTION: - { - reply.writeString(DESCRIPTOR); - return true; - } - case TRANSACTION_isBillingSupported: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.isBillingSupported(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getSkuDetails: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - android.os.Bundle _arg3; - if ((0!=data.readInt())) { - _arg3 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg3 = null; - } - android.os.Bundle _result = this.getSkuDetails(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getBuyIntent: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - android.os.Bundle _result = this.getBuyIntent(_arg0, _arg1, _arg2, _arg3, _arg4); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getPurchases: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - android.os.Bundle _result = this.getPurchases(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_consumePurchase: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.consumePurchase(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_stub: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.stub(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getBuyIntentToReplaceSkus: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.util.List _arg2; - _arg2 = data.createStringArrayList(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - java.lang.String _arg5; - _arg5 = data.readString(); - android.os.Bundle _result = this.getBuyIntentToReplaceSkus(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getBuyIntentExtraParams: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - android.os.Bundle _arg5; - if ((0!=data.readInt())) { - _arg5 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg5 = null; - } - android.os.Bundle _result = this.getBuyIntentExtraParams(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getPurchaseHistory: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - android.os.Bundle _arg4; - if ((0!=data.readInt())) { - _arg4 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg4 = null; - } - android.os.Bundle _result = this.getPurchaseHistory(_arg0, _arg1, _arg2, _arg3, _arg4); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_isBillingSupportedExtraParams: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - android.os.Bundle _arg3; - if ((0!=data.readInt())) { - _arg3 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg3 = null; - } - int _result = this.isBillingSupportedExtraParams(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - } - return super.onTransact(code, data, reply, flags); - } - private static class Proxy implements com.android.vending.billing.IInAppBillingService - { - private android.os.IBinder mRemote; - Proxy(android.os.IBinder remote) - { - mRemote = remote; - } - @Override public android.os.IBinder asBinder() - { - return mRemote; - } - public java.lang.String getInterfaceDescriptor() - { - return DESCRIPTOR; - } - @Override public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - mRemote.transact(Stub.TRANSACTION_isBillingSupported, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Provides details of a list of SKUs - * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle - * with a list JSON strings containing the productId, price, title and description. - * This API can be called with a maximum of 20 SKUs. - * @param apiVersion billing API version that the app is using - * @param packageName the package name of the calling app - * @param type of the in-app items ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "DETAILS_LIST" with a StringArrayList containing purchase information - * in JSON format similar to: - * '{ "productId" : "exampleSku", - * "type" : "inapp", - * "price" : "$5.00", - * "price_currency": "USD", - * "price_amount_micros": 5000000, - * "title : "Example Title", - * "description" : "This is an example description" }' - */ - @Override public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - if ((skusBundle!=null)) { - _data.writeInt(1); - skusBundle.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getSkuDetails, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, - * the type, a unique purchase token and an optional developer payload. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - @Override public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(sku); - _data.writeString(type); - _data.writeString(developerPayload); - mRemote.transact(Stub.TRANSACTION_getBuyIntent, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns the current SKUs owned by the user of the type and package name specified along with - * purchase information and a signature of the data to be validated. - * This will return all SKUs that have been purchased in V3 and managed items purchased using - * V1 and V2 that have not been consumed. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus are too many, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - on failures. - * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - @Override public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - _data.writeString(continuationToken); - mRemote.transact(Stub.TRANSACTION_getPurchases, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(purchaseToken); - mRemote.transact(Stub.TRANSACTION_consumePurchase, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - mRemote.transact(Stub.TRANSACTION_stub, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for upgrading or downgrading a - * subscription. The existing owned SKU(s) should be provided along with the new SKU that - * the user is upgrading or downgrading to. - * @param apiVersion billing API version that the app is using, must be 5 or later - * @param packageName package name of the calling app - * @param oldSkus the SKU(s) that the user is upgrading or downgrading from, - * if null or empty this method will behave like {@link #getBuyIntent} - * @param newSku the SKU that the user is upgrading or downgrading to - * @param type of the item being purchased, currently must be "subs" - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - @Override public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeStringList(oldSkus); - _data.writeString(newSku); - _data.writeString(type); - _data.writeString(developerPayload); - mRemote.transact(Stub.TRANSACTION_getBuyIntentToReplaceSkus, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for an in-app item. This method is - * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams} - * parameter. This parameter is a Bundle of optional keys and values that affect the - * operation of the method. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @extraParams a Bundle with the following optional keys: - * "skusToReplace" - List - an optional list of SKUs that the user is - * upgrading or downgrading from. - * Pass this field if the purchase is upgrading or downgrading - * existing subscriptions. - * The specified SKUs are replaced with the SKUs that the user is - * purchasing. Google Play replaces the specified SKUs at the start of - * the next billing cycle. - * "replaceSkusProration" - Boolean - whether the user should be credited for any unused - * subscription time on the SKUs they are upgrading or downgrading. - * If you set this field to true, Google Play swaps out the old SKUs - * and credits the user with the unused value of their subscription - * time on a pro-rated basis. - * Google Play applies this credit to the new subscription, and does - * not begin billing the user for the new subscription until after - * the credit is used up. - * If you set this field to false, the user does not receive credit for - * any unused subscription time and the recurrence date does not - * change. - * Default value is true. Ignored if you do not pass skusToReplace. - * "accountId" - String - an optional obfuscated string that is uniquely - * associated with the user's account in your app. - * If you pass this value, Google Play can use it to detect irregular - * activity, such as many devices making purchases on the same - * account in a short period of time. - * Do not use the developer ID or the user's Google ID for this field. - * In addition, this field should not contain the user's ID in - * cleartext. - * We recommend that you use a one-way hash to generate a string from - * the user's ID, and store the hashed string in this field. - * "vr" - Boolean - an optional flag indicating whether the returned intent - * should start a VR purchase flow. The apiVersion must also be 7 or - * later to use this flag. - */ - @Override public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(sku); - _data.writeString(type); - _data.writeString(developerPayload); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getBuyIntentExtraParams, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns the most recent purchase made by the user for each SKU, even if that purchase is - * expired, canceled, or consumed. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus is too large, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @param extraParams a Bundle with extra params that would be appended into http request - * query string. Not used at this moment. Reserved for future functionality. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value: RESULT_OK(0) if success, - * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures. - * - * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - @Override public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - _data.writeString(continuationToken); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getPurchaseHistory, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_isBillingSupportedExtraParams, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - } - static final int TRANSACTION_isBillingSupported = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); - static final int TRANSACTION_getSkuDetails = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); - static final int TRANSACTION_getBuyIntent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); - static final int TRANSACTION_getPurchases = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); - static final int TRANSACTION_consumePurchase = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); - static final int TRANSACTION_stub = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); - static final int TRANSACTION_getBuyIntentToReplaceSkus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); - static final int TRANSACTION_getBuyIntentExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); - static final int TRANSACTION_getPurchaseHistory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); - static final int TRANSACTION_isBillingSupportedExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); - } - public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException; - /** - * Provides details of a list of SKUs - * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle - * with a list JSON strings containing the productId, price, title and description. - * This API can be called with a maximum of 20 SKUs. - * @param apiVersion billing API version that the app is using - * @param packageName the package name of the calling app - * @param type of the in-app items ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "DETAILS_LIST" with a StringArrayList containing purchase information - * in JSON format similar to: - * '{ "productId" : "exampleSku", - * "type" : "inapp", - * "price" : "$5.00", - * "price_currency": "USD", - * "price_amount_micros": 5000000, - * "title : "Example Title", - * "description" : "This is an example description" }' - */ - public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, - * the type, a unique purchase token and an optional developer payload. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException; - /** - * Returns the current SKUs owned by the user of the type and package name specified along with - * purchase information and a signature of the data to be validated. - * This will return all SKUs that have been purchased in V3 and managed items purchased using - * V1 and V2 that have not been consumed. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus are too many, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - on failures. - * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException; - public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException; - public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for upgrading or downgrading a - * subscription. The existing owned SKU(s) should be provided along with the new SKU that - * the user is upgrading or downgrading to. - * @param apiVersion billing API version that the app is using, must be 5 or later - * @param packageName package name of the calling app - * @param oldSkus the SKU(s) that the user is upgrading or downgrading from, - * if null or empty this method will behave like {@link #getBuyIntent} - * @param newSku the SKU that the user is upgrading or downgrading to - * @param type of the item being purchased, currently must be "subs" - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for an in-app item. This method is - * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams} - * parameter. This parameter is a Bundle of optional keys and values that affect the - * operation of the method. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @extraParams a Bundle with the following optional keys: - * "skusToReplace" - List - an optional list of SKUs that the user is - * upgrading or downgrading from. - * Pass this field if the purchase is upgrading or downgrading - * existing subscriptions. - * The specified SKUs are replaced with the SKUs that the user is - * purchasing. Google Play replaces the specified SKUs at the start of - * the next billing cycle. - * "replaceSkusProration" - Boolean - whether the user should be credited for any unused - * subscription time on the SKUs they are upgrading or downgrading. - * If you set this field to true, Google Play swaps out the old SKUs - * and credits the user with the unused value of their subscription - * time on a pro-rated basis. - * Google Play applies this credit to the new subscription, and does - * not begin billing the user for the new subscription until after - * the credit is used up. - * If you set this field to false, the user does not receive credit for - * any unused subscription time and the recurrence date does not - * change. - * Default value is true. Ignored if you do not pass skusToReplace. - * "accountId" - String - an optional obfuscated string that is uniquely - * associated with the user's account in your app. - * If you pass this value, Google Play can use it to detect irregular - * activity, such as many devices making purchases on the same - * account in a short period of time. - * Do not use the developer ID or the user's Google ID for this field. - * In addition, this field should not contain the user's ID in - * cleartext. - * We recommend that you use a one-way hash to generate a string from - * the user's ID, and store the hashed string in this field. - * "vr" - Boolean - an optional flag indicating whether the returned intent - * should start a VR purchase flow. The apiVersion must also be 7 or - * later to use this flag. - */ - public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException; - /** - * Returns the most recent purchase made by the user for each SKU, even if that purchase is - * expired, canceled, or consumed. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus is too large, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @param extraParams a Bundle with extra params that would be appended into http request - * query string. Not used at this moment. Reserved for future functionality. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value: RESULT_OK(0) if success, - * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures. - * - * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException; - public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException; - } diff --git a/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java b/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java deleted file mode 100644 index b5a9a0621f..0000000000 --- a/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java +++ /dev/null @@ -1,3166 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.juce.demorunner; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.hardware.camera2.*; -import android.database.ContentObserver; -import android.media.session.*; -import android.media.MediaMetadata; -import android.net.http.SslError; -import android.net.Uri; -import android.os.Bundle; -import android.os.Looper; -import android.os.Handler; -import android.os.Message; -import android.os.ParcelUuid; -import android.os.Environment; -import android.view.*; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; -import android.graphics.*; -import android.text.ClipboardManager; -import android.text.InputType; -import android.util.DisplayMetrics; -import android.util.Log; -import android.util.Pair; -import android.webkit.SslErrorHandler; -import android.webkit.WebChromeClient; -import android.webkit.WebResourceError; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import java.lang.Runnable; -import java.lang.ref.WeakReference; -import java.lang.reflect.*; -import java.util.*; -import java.io.*; -import java.net.URL; -import java.net.HttpURLConnection; -import android.media.AudioManager; -import android.Manifest; -import java.util.concurrent.CancellationException; -import java.util.concurrent.Future; -import java.util.concurrent.Executors; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.atomic.*; - -import android.media.midi.*; -import android.bluetooth.*; -import android.bluetooth.le.*; - - -//============================================================================== -public class DemoRunner extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("juce_jni"); - } - - //============================================================================== - public boolean isPermissionDeclaredInManifest (int permissionID) - { - return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID)); - } - - public boolean isPermissionDeclaredInManifest (String permissionToCheck) - { - try - { - PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS); - - if (info.requestedPermissions != null) - for (String permission : info.requestedPermissions) - if (permission.equals (permissionToCheck)) - return true; - } - catch (PackageManager.NameNotFoundException e) - { - Log.d ("JUCE", "isPermissionDeclaredInManifest: PackageManager.NameNotFoundException = " + e.toString()); - } - - Log.d ("JUCE", "isPermissionDeclaredInManifest: could not find requested permission " + permissionToCheck); - return false; - } - - //============================================================================== - // these have to match the values of enum PermissionID in C++ class RuntimePermissions: - private static final int JUCE_PERMISSIONS_RECORD_AUDIO = 1; - private static final int JUCE_PERMISSIONS_BLUETOOTH_MIDI = 2; - private static final int JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE = 3; - private static final int JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 4; - private static final int JUCE_PERMISSIONS_CAMERA = 5; - - private static String getAndroidPermissionName (int permissionID) - { - switch (permissionID) - { - case JUCE_PERMISSIONS_RECORD_AUDIO: return Manifest.permission.RECORD_AUDIO; - case JUCE_PERMISSIONS_BLUETOOTH_MIDI: return Manifest.permission.ACCESS_COARSE_LOCATION; - // use string value as this is not defined in SDKs < 16 - case JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE: return "android.permission.READ_EXTERNAL_STORAGE"; - case JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE: return Manifest.permission.WRITE_EXTERNAL_STORAGE; - case JUCE_PERMISSIONS_CAMERA: return Manifest.permission.CAMERA; - } - - // unknown permission ID! - assert false; - return new String(); - } - - public boolean isPermissionGranted (int permissionID) - { - return getApplicationContext().checkCallingOrSelfPermission (getAndroidPermissionName (permissionID)) == PackageManager.PERMISSION_GRANTED; - } - - private Map permissionCallbackPtrMap; - - public void requestRuntimePermission (int permissionID, long ptrToCallback) - { - String permissionName = getAndroidPermissionName (permissionID); - - if (getApplicationContext().checkCallingOrSelfPermission (permissionName) != PackageManager.PERMISSION_GRANTED) - { - // remember callbackPtr, request permissions, and let onRequestPermissionResult call callback asynchronously - permissionCallbackPtrMap.put (permissionID, ptrToCallback); - requestPermissionsCompat (new String[]{permissionName}, permissionID); - } - else - { - // permissions were already granted before, we can call callback directly - androidRuntimePermissionsCallback (true, ptrToCallback); - } - } - - private native void androidRuntimePermissionsCallback (boolean permissionWasGranted, long ptrToCallback); - - @Override - public void onRequestPermissionsResult (int permissionID, String permissions[], int[] grantResults) - { - boolean permissionsGranted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED); - - if (! permissionsGranted) - Log.d ("JUCE", "onRequestPermissionsResult: runtime permission was DENIED: " + getAndroidPermissionName (permissionID)); - - Long ptrToCallback = permissionCallbackPtrMap.get (permissionID); - permissionCallbackPtrMap.remove (permissionID); - androidRuntimePermissionsCallback (permissionsGranted, ptrToCallback); - } - - //============================================================================== - public interface JuceMidiPort - { - boolean isInputPort(); - - // start, stop does nothing on an output port - void start(); - void stop(); - - void close(); - - // send will do nothing on an input port - void sendMidi (byte[] msg, int offset, int count); - } - - //============================================================================== - //============================================================================== - public class BluetoothManager extends ScanCallback - { - BluetoothManager() - { - } - - public String[] getMidiBluetoothAddresses() - { - return bluetoothMidiDevices.toArray (new String[bluetoothMidiDevices.size()]); - } - - public String getHumanReadableStringForBluetoothAddress (String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - return btDevice.getName(); - } - - public int getBluetoothDeviceStatus (String address) - { - return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); - } - - public void startStopScan (boolean shouldStart) - { - BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - - if (bluetoothAdapter == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get default Bluetooth adapter"); - return; - } - - BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); - - if (bluetoothLeScanner == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get Bluetooth LE scanner"); - return; - } - - if (shouldStart) - { - ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder(); - scanFilterBuilder.setServiceUuid (ParcelUuid.fromString (bluetoothLEMidiServiceUUID)); - - ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder(); - scanSettingsBuilder.setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES) - .setScanMode (ScanSettings.SCAN_MODE_LOW_POWER) - .setScanMode (ScanSettings.MATCH_MODE_STICKY); - - bluetoothLeScanner.startScan (Arrays.asList (scanFilterBuilder.build()), - scanSettingsBuilder.build(), - this); - } - else - { - bluetoothLeScanner.stopScan (this); - } - } - - public boolean pairBluetoothMidiDevice(String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - - if (btDevice == null) - { - Log.d ("JUCE", "failed to create buletooth device from address"); - return false; - } - - return getAndroidMidiDeviceManager().pairBluetoothDevice (btDevice); - } - - public void unpairBluetoothMidiDevice (String address) - { - getAndroidMidiDeviceManager().unpairBluetoothDevice (address); - } - - public void onScanFailed (int errorCode) - { - } - - public void onScanResult (int callbackType, ScanResult result) - { - if (callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES - || callbackType == ScanSettings.CALLBACK_TYPE_FIRST_MATCH) - { - BluetoothDevice device = result.getDevice(); - - if (device != null) - bluetoothMidiDevices.add (device.getAddress()); - } - - if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) - { - Log.d ("JUCE", "ScanSettings.CALLBACK_TYPE_MATCH_LOST"); - BluetoothDevice device = result.getDevice(); - - if (device != null) - { - bluetoothMidiDevices.remove (device.getAddress()); - unpairBluetoothMidiDevice (device.getAddress()); - } - } - } - - public void onBatchScanResults (List results) - { - for (ScanResult result : results) - onScanResult (ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result); - } - - private BluetoothLeScanner scanner; - private static final String bluetoothLEMidiServiceUUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"; - - private HashSet bluetoothMidiDevices = new HashSet(); - } - - public static class JuceMidiInputPort extends MidiReceiver implements JuceMidiPort - { - private native void handleReceive (long host, byte[] msg, int offset, int count, long timestamp); - - public JuceMidiInputPort (MidiDeviceManager mm, MidiOutputPort actualPort, MidiPortPath portPathToUse, long hostToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - juceHost = hostToUse; - isConnected = false; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return true; - } - - @Override - public void start() - { - if (owner != null && androidPort != null && ! isConnected) { - androidPort.connect(this); - isConnected = true; - } - } - - @Override - public void stop() - { - if (owner != null && androidPort != null && isConnected) { - androidPort.disconnect(this); - isConnected = false; - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - @Override - public void onSend (byte[] msg, int offset, int count, long timestamp) - { - if (count > 0) - handleReceive (juceHost, msg, offset, count, timestamp); - } - - @Override - public void onFlush() - {} - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - } - - MidiDeviceManager owner; - MidiOutputPort androidPort; - MidiPortPath portPath; - long juceHost; - boolean isConnected; - } - - public static class JuceMidiOutputPort implements JuceMidiPort - { - public JuceMidiOutputPort (MidiDeviceManager mm, MidiInputPort actualPort, MidiPortPath portPathToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return false; - } - - @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - if (androidPort != null) - { - try { - androidPort.send(msg, offset, count); - } catch (IOException exception) - { - Log.d ("JUCE", "send midi had IO exception"); - } - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - MidiDeviceManager owner; - MidiInputPort androidPort; - MidiPortPath portPath; - } - - private static class MidiPortPath extends Object - { - public MidiPortPath (int deviceIdToUse, boolean direction, int androidIndex) - { - deviceId = deviceIdToUse; - isInput = direction; - portIndex = androidIndex; - - } - - public int deviceId; - public int portIndex; - public boolean isInput; - - @Override - public int hashCode() - { - Integer i = new Integer ((deviceId * 128) + (portIndex < 128 ? portIndex : 127)); - return i.hashCode() * (isInput ? -1 : 1); - } - - @Override - public boolean equals (Object obj) - { - if (obj == null) - return false; - - if (getClass() != obj.getClass()) - return false; - - MidiPortPath other = (MidiPortPath) obj; - return (portIndex == other.portIndex && isInput == other.isInput && deviceId == other.deviceId); - } - } - - //============================================================================== - public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener - { - //============================================================================== - private class DummyBluetoothGattCallback extends BluetoothGattCallback - { - public DummyBluetoothGattCallback (MidiDeviceManager mm) - { - super(); - owner = mm; - } - - public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) - { - if (newState == BluetoothProfile.STATE_CONNECTED) - { - gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); - owner.pairBluetoothDeviceStepTwo (gatt.getDevice()); - } - } - public void onServicesDiscovered(BluetoothGatt gatt, int status) {} - public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {} - public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {} - public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {} - public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {} - - private MidiDeviceManager owner; - } - - //============================================================================== - private class MidiDeviceOpenTask extends java.util.TimerTask - { - public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device, BluetoothGatt gattToUse) - { - owner = deviceManager; - midiDevice = device; - btGatt = gattToUse; - } - - @Override - public boolean cancel() - { - synchronized (MidiDeviceOpenTask.class) - { - owner = null; - boolean retval = super.cancel(); - - if (btGatt != null) - { - btGatt.disconnect(); - btGatt.close(); - - btGatt = null; - } - - if (midiDevice != null) - { - try - { - midiDevice.close(); - } - catch (IOException e) - {} - - midiDevice = null; - } - - return retval; - } - } - - public String getBluetoothAddress() - { - synchronized (MidiDeviceOpenTask.class) - { - if (midiDevice != null) - { - MidiDeviceInfo info = midiDevice.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - return btDevice.getAddress(); - } - } - } - - return ""; - } - - public BluetoothGatt getGatt() { return btGatt; } - - public int getID() - { - return midiDevice.getInfo().getId(); - } - - @Override - public void run() - { - synchronized (MidiDeviceOpenTask.class) - { - if (owner != null && midiDevice != null) - owner.onDeviceOpenedDelayed (midiDevice); - } - } - - private MidiDeviceManager owner; - private MidiDevice midiDevice; - private BluetoothGatt btGatt; - } - - //============================================================================== - public MidiDeviceManager() - { - manager = (MidiManager) getSystemService (MIDI_SERVICE); - - if (manager == null) - { - Log.d ("JUCE", "MidiDeviceManager error: could not get MidiManager system service"); - return; - } - - openPorts = new HashMap> (); - midiDevices = new ArrayList>(); - openTasks = new HashMap(); - btDevicesPairing = new HashMap(); - - MidiDeviceInfo[] foundDevices = manager.getDevices(); - for (MidiDeviceInfo info : foundDevices) - onDeviceAdded (info); - - manager.registerDeviceCallback (this, null); - } - - protected void finalize() throws Throwable - { - manager.unregisterDeviceCallback (this); - - synchronized (MidiDeviceManager.class) - { - btDevicesPairing.clear(); - - for (Integer deviceID : openTasks.keySet()) - openTasks.get (deviceID).cancel(); - - openTasks = null; - } - - for (MidiPortPath key : openPorts.keySet()) - openPorts.get (key).get().close(); - - openPorts = null; - - for (Pair device : midiDevices) - { - if (device.second != null) - { - device.second.disconnect(); - device.second.close(); - } - - device.first.close(); - } - - midiDevices.clear(); - - super.finalize(); - } - - public String[] getJuceAndroidMidiInputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - } - - public String[] getJuceAndroidMidiOutputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_INPUT); - } - - private String[] getJuceAndroidMidiDevices (int portType) - { - // only update the list when JUCE asks for a new list - synchronized (MidiDeviceManager.class) - { - deviceInfos = getDeviceInfos(); - } - - ArrayList portNames = new ArrayList(); - - int index = 0; - for (MidiPortPath portInfo = getPortPathForJuceIndex (portType, index); portInfo != null; portInfo = getPortPathForJuceIndex (portType, ++index)) - portNames.add (getPortName (portInfo)); - - String[] names = new String[portNames.size()]; - return portNames.toArray (names); - } - - private JuceMidiPort openMidiPortWithJuceIndex (int index, long host, boolean isInput) - { - synchronized (MidiDeviceManager.class) - { - int portTypeToFind = (isInput ? MidiDeviceInfo.PortInfo.TYPE_OUTPUT : MidiDeviceInfo.PortInfo.TYPE_INPUT); - MidiPortPath portInfo = getPortPathForJuceIndex (portTypeToFind, index); - - if (portInfo != null) - { - // ports must be opened exclusively! - if (openPorts.containsKey (portInfo)) - return null; - - Pair devicePair = getMidiDevicePairForId (portInfo.deviceId); - - if (devicePair != null) - { - MidiDevice device = devicePair.first; - if (device != null) - { - JuceMidiPort juceMidiPort = null; - - if (isInput) - { - MidiOutputPort outputPort = device.openOutputPort(portInfo.portIndex); - - if (outputPort != null) - juceMidiPort = new JuceMidiInputPort(this, outputPort, portInfo, host); - } - else - { - MidiInputPort inputPort = device.openInputPort(portInfo.portIndex); - - if (inputPort != null) - juceMidiPort = new JuceMidiOutputPort(this, inputPort, portInfo); - } - - if (juceMidiPort != null) - { - openPorts.put(portInfo, new WeakReference(juceMidiPort)); - - return juceMidiPort; - } - } - } - } - } - - return null; - } - - public JuceMidiPort openMidiInputPortWithJuceIndex (int index, long host) - { - return openMidiPortWithJuceIndex (index, host, true); - } - - public JuceMidiPort openMidiOutputPortWithJuceIndex (int index) - { - return openMidiPortWithJuceIndex (index, 0, false); - } - - /* 0: unpaired, 1: paired, 2: pairing */ - public int getBluetoothDeviceStatus (String address) - { - synchronized (MidiDeviceManager.class) - { - if (! address.isEmpty()) - { - if (findMidiDeviceForBluetoothAddress (address) != null) - return 1; - - if (btDevicesPairing.containsKey (address)) - return 2; - - if (findOpenTaskForBluetoothAddress (address) != null) - return 2; - } - } - - return 0; - } - - public boolean pairBluetoothDevice (BluetoothDevice btDevice) - { - String btAddress = btDevice.getAddress(); - if (btAddress.isEmpty()) - return false; - - synchronized (MidiDeviceManager.class) - { - if (getBluetoothDeviceStatus (btAddress) != 0) - return false; - - - btDevicesPairing.put (btDevice.getAddress(), null); - BluetoothGatt gatt = btDevice.connectGatt (getApplicationContext(), true, new DummyBluetoothGattCallback (this)); - - if (gatt != null) - { - btDevicesPairing.put (btDevice.getAddress(), gatt); - } - else - { - pairBluetoothDeviceStepTwo (btDevice); - } - } - - return true; - } - - public void pairBluetoothDeviceStepTwo (BluetoothDevice btDevice) - { - manager.openBluetoothDevice(btDevice, this, null); - } - - public void unpairBluetoothDevice (String address) - { - if (address.isEmpty()) - return; - - synchronized (MidiDeviceManager.class) - { - if (btDevicesPairing.containsKey (address)) - { - BluetoothGatt gatt = btDevicesPairing.get (address); - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - btDevicesPairing.remove (address); - } - - MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); - if (openTask != null) - { - int deviceID = openTask.getID(); - openTask.cancel(); - openTasks.remove (deviceID); - } - - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (address); - if (midiDevicePair != null) - { - MidiDevice midiDevice = midiDevicePair.first; - onDeviceRemoved (midiDevice.getInfo()); - - try { - midiDevice.close(); - } - catch (IOException exception) - { - Log.d ("JUCE", "IOException while closing midi device"); - } - } - } - } - - private Pair findMidiDeviceForBluetoothAddress (String address) - { - for (Pair midiDevice : midiDevices) - { - MidiDeviceInfo info = midiDevice.first.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null && btDevice.getAddress().equals (address)) - return midiDevice; - } - } - - return null; - } - - private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) - { - for (Integer deviceID : openTasks.keySet()) - { - MidiDeviceOpenTask openTask = openTasks.get (deviceID); - if (openTask.getBluetoothAddress().equals (address)) - return openTask; - } - - return null; - } - - public void removePort (MidiPortPath path) - { - openPorts.remove (path); - } - - public String getInputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_OUTPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public String getOutputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_INPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public void onDeviceAdded (MidiDeviceInfo info) - { - // only add standard midi devices - if (info.getType() == info.TYPE_BLUETOOTH) - return; - - manager.openDevice (info, this, null); - } - - public void onDeviceRemoved (MidiDeviceInfo info) - { - synchronized (MidiDeviceManager.class) - { - Pair devicePair = getMidiDevicePairForId (info.getId()); - - if (devicePair != null) - { - MidiDevice midiDevice = devicePair.first; - BluetoothGatt gatt = devicePair.second; - - // close all ports that use this device - boolean removedPort = true; - - while (removedPort == true) - { - removedPort = false; - for (MidiPortPath key : openPorts.keySet()) - { - if (key.deviceId == info.getId()) - { - openPorts.get(key).get().close(); - removedPort = true; - break; - } - } - } - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - midiDevices.remove (devicePair); - } - } - } - - public void onDeviceStatusChanged (MidiDeviceStatus status) - { - } - - @Override - public void onDeviceOpened (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo info = theDevice.getInfo(); - int deviceID = info.getId(); - BluetoothGatt gatt = null; - boolean isBluetooth = false; - - if (! openTasks.containsKey (deviceID)) - { - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - isBluetooth = true; - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - if (btDevicesPairing.containsKey (btAddress)) - { - gatt = btDevicesPairing.get (btAddress); - btDevicesPairing.remove (btAddress); - } - else - { - // unpair was called in the mean time - try - { - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - - theDevice.close(); - } - catch (IOException e) - {} - - return; - } - } - } - - MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice, gatt); - openTasks.put (deviceID, openTask); - - new java.util.Timer().schedule (openTask, (isBluetooth ? 2000 : 100)); - } - } - } - - public void onDeviceOpenedDelayed (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - int deviceID = theDevice.getInfo().getId(); - - if (openTasks.containsKey (deviceID)) - { - if (! midiDevices.contains(theDevice)) - { - BluetoothGatt gatt = openTasks.get (deviceID).getGatt(); - openTasks.remove (deviceID); - midiDevices.add (new Pair (theDevice, gatt)); - } - } - else - { - // unpair was called in the mean time - MidiDeviceInfo info = theDevice.getInfo(); - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - BluetoothGatt gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - } - - try - { - theDevice.close(); - } - catch (IOException e) - {} - } - } - } - - public String getPortName(MidiPortPath path) - { - int portTypeToFind = (path.isInput ? MidiDeviceInfo.PortInfo.TYPE_INPUT : MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - - synchronized (MidiDeviceManager.class) - { - for (MidiDeviceInfo info : deviceInfos) - { - int localIndex = 0; - if (info.getId() == path.deviceId) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - int portType = portInfo.getType(); - if (portType == portTypeToFind) - { - int portIndex = portInfo.getPortNumber(); - if (portIndex == path.portIndex) - { - String portName = portInfo.getName(); - if (portName.isEmpty()) - portName = (String) info.getProperties().get(info.PROPERTY_NAME); - - return portName; - } - } - } - } - } - } - - return ""; - } - - public MidiPortPath getPortPathForJuceIndex (int portType, int juceIndex) - { - int portIdx = 0; - for (MidiDeviceInfo info : deviceInfos) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - if (portInfo.getType() == portType) - { - if (portIdx == juceIndex) - return new MidiPortPath (info.getId(), - (portType == MidiDeviceInfo.PortInfo.TYPE_INPUT), - portInfo.getPortNumber()); - - portIdx++; - } - } - } - - return null; - } - - private MidiDeviceInfo[] getDeviceInfos() - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo[] infos = new MidiDeviceInfo[midiDevices.size()]; - - int idx = 0; - for (Pair midiDevice : midiDevices) - infos[idx++] = midiDevice.first.getInfo(); - - return infos; - } - } - - private Pair getMidiDevicePairForId (int deviceId) - { - synchronized (MidiDeviceManager.class) - { - for (Pair midiDevice : midiDevices) - if (midiDevice.first.getInfo().getId() == deviceId) - return midiDevice; - } - - return null; - } - - private MidiManager manager; - private HashMap btDevicesPairing; - private HashMap openTasks; - private ArrayList> midiDevices; - private MidiDeviceInfo[] deviceInfos; - private HashMap> openPorts; - } - - public MidiDeviceManager getAndroidMidiDeviceManager() - { - if (getSystemService (MIDI_SERVICE) == null) - return null; - - synchronized (DemoRunner.class) - { - if (midiDeviceManager == null) - midiDeviceManager = new MidiDeviceManager(); - } - - return midiDeviceManager; - } - - public BluetoothManager getAndroidBluetoothManager() - { - BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - - if (adapter == null) - return null; - - if (adapter.getBluetoothLeScanner() == null) - return null; - - synchronized (DemoRunner.class) - { - if (bluetoothManager == null) - bluetoothManager = new BluetoothManager(); - } - - return bluetoothManager; - } - - //============================================================================== - @Override - public void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - isScreenSaverEnabled = true; - hideActionBar(); - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - - setVolumeControlStream (AudioManager.STREAM_MUSIC); - - permissionCallbackPtrMap = new HashMap(); - appPausedResumedListeners = new HashMap(); - } - - @Override - protected void onDestroy() - { - quitApp(); - super.onDestroy(); - - clearDataCache(); - } - - @Override - protected void onPause() - { - suspendApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appPaused(); - - try - { - Thread.sleep (1000); // This is a bit of a hack to avoid some hard-to-track-down - // openGL glitches when pausing/resuming apps.. - } catch (InterruptedException e) {} - - super.onPause(); - } - - @Override - protected void onResume() - { - super.onResume(); - resumeApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appResumed(); - } - - @Override - public void onConfigurationChanged (Configuration cfg) - { - super.onConfigurationChanged (cfg); - setContentView (viewHolder); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - // Need to override this as the default implementation always finishes the activity. - @Override - public void onBackPressed() - { - ComponentPeerView focusedView = getViewWithFocusOrDefaultView(); - - if (focusedView == null) - return; - - focusedView.backButtonPressed(); - } - - private ComponentPeerView getViewWithFocusOrDefaultView() - { - for (int i = 0; i < viewHolder.getChildCount(); ++i) - { - if (viewHolder.getChildAt (i).hasFocus()) - return (ComponentPeerView) viewHolder.getChildAt (i); - } - - if (viewHolder.getChildCount() > 0) - return (ComponentPeerView) viewHolder.getChildAt (0); - - return null; - } - - //============================================================================== - private void hideActionBar() - { - // get "getActionBar" method - java.lang.reflect.Method getActionBarMethod = null; - try - { - getActionBarMethod = this.getClass().getMethod ("getActionBar"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (getActionBarMethod == null) return; - - // invoke "getActionBar" method - Object actionBar = null; - try - { - actionBar = getActionBarMethod.invoke (this); - } - catch (java.lang.IllegalArgumentException e) { return; } - catch (java.lang.IllegalAccessException e) { return; } - catch (java.lang.reflect.InvocationTargetException e) { return; } - if (actionBar == null) return; - - // get "hide" method - java.lang.reflect.Method actionBarHideMethod = null; - try - { - actionBarHideMethod = actionBar.getClass().getMethod ("hide"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (actionBarHideMethod == null) return; - - // invoke "hide" method - try - { - actionBarHideMethod.invoke (actionBar); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - void requestPermissionsCompat (String[] permissions, int requestCode) - { - Method requestPermissionsMethod = null; - try - { - requestPermissionsMethod = this.getClass().getMethod ("requestPermissions", - String[].class, int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (requestPermissionsMethod == null) return; - - try - { - requestPermissionsMethod.invoke (this, permissions, requestCode); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void suspendApp(); - private native void resumeApp(); - private native void setScreenSize (int screenWidth, int screenHeight, int dpi); - private native void appActivityResult (int requestCode, int resultCode, Intent data); - private native void appNewIntent (Intent intent); - - //============================================================================== - private ViewHolder viewHolder; - private MidiDeviceManager midiDeviceManager = null; - private BluetoothManager bluetoothManager = null; - private boolean isScreenSaverEnabled; - private java.util.Timer keepAliveTimer; - - public final ComponentPeerView createNewView (boolean opaque, long host) - { - ComponentPeerView v = new ComponentPeerView (this, opaque, host); - viewHolder.addView (v); - addAppPausedResumedListener (v, host); - return v; - } - - public final void deleteView (ComponentPeerView view) - { - removeAppPausedResumedListener (view, view.host); - - view.host = 0; - - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - public final void deleteNativeSurfaceView (NativeSurfaceView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - final class ViewHolder extends ViewGroup - { - public ViewHolder (Context context) - { - super (context); - setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); - setFocusable (false); - } - - protected final void onLayout (boolean changed, int left, int top, int right, int bottom) - { - setScreenSize (getWidth(), getHeight(), getDPI()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - private final int getDPI() - { - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics (metrics); - return metrics.densityDpi; - } - - private boolean isFirstResize = true; - } - - public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom) - { - canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE); - } - - //============================================================================== - public final void setScreenSaver (boolean enabled) - { - if (isScreenSaverEnabled != enabled) - { - isScreenSaverEnabled = enabled; - - if (keepAliveTimer != null) - { - keepAliveTimer.cancel(); - keepAliveTimer = null; - } - - if (enabled) - { - getWindow().clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } - else - { - getWindow().addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - - // If no user input is received after about 3 seconds, the OS will lower the - // task's priority, so this timer forces it to be kept active. - keepAliveTimer = new java.util.Timer(); - - keepAliveTimer.scheduleAtFixedRate (new TimerTask() - { - @Override - public void run() - { - android.app.Instrumentation instrumentation = new android.app.Instrumentation(); - - try - { - instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_UNKNOWN); - } - catch (Exception e) - { - } - } - }, 2000, 2000); - } - } - } - - public final boolean getScreenSaver() - { - return isScreenSaverEnabled; - } - - //============================================================================== - public final String getClipboardContent() - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - - CharSequence content = clipboard.getText(); - return content != null ? content.toString() : new String(); - } - - public final void setClipboardContent (String newText) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - clipboard.setText (newText); - } - - //============================================================================== - public final void showMessageBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showOkCancelBox (String title, String message, final long callback, - String okButtonText, String cancelButtonText) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton (okButtonText.isEmpty() ? "OK" : okButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton (cancelButtonText.isEmpty() ? "Cancel" : cancelButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showYesNoCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("Yes", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("No", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 2); - } - }) - .setNeutralButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public native void alertDismissed (long callback, int id); - - //============================================================================== - public interface AppPausedResumedListener - { - void appPaused(); - void appResumed(); - } - - private Map appPausedResumedListeners; - - public void addAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.put (new Long (listenerHost), l); - } - - public void removeAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.remove (new Long (listenerHost)); - } - - //============================================================================== - public final class ComponentPeerView extends ViewGroup - implements View.OnFocusChangeListener, AppPausedResumedListener - { - public ComponentPeerView (Context context, boolean opaque_, long host) - { - super (context); - this.host = host; - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - - // swap red and blue colours to match internal opengl texture format - ColorMatrix colorMatrix = new ColorMatrix(); - - float[] colorTransform = { 0, 0, 1.0f, 0, 0, - 0, 1.0f, 0, 0, 0, - 1.0f, 0, 0, 0, 0, - 0, 0, 0, 1.0f, 0 }; - - colorMatrix.set (colorTransform); - paint.setColorFilter (new ColorMatrixColorFilter (colorMatrix)); - - java.lang.reflect.Method method = null; - - try - { - method = getClass().getMethod ("setLayerType", int.class, Paint.class); - } - catch (SecurityException e) {} - catch (NoSuchMethodException e) {} - - if (method != null) - { - try - { - int layerTypeNone = 0; - method.invoke (this, layerTypeNone, null); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - } - - //============================================================================== - private native void handlePaint (long host, Canvas canvas, Paint paint); - - @Override - public void onDraw (Canvas canvas) - { - if (host == 0) - return; - - handlePaint (host, canvas, paint); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - private long host; - private Paint paint = new Paint(); - - //============================================================================== - private native void handleMouseDown (long host, int index, float x, float y, long time); - private native void handleMouseDrag (long host, int index, float x, float y, long time); - private native void handleMouseUp (long host, int index, float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - if (host == 0) - return false; - - int action = event.getAction(); - long time = event.getEventTime(); - - switch (action & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - handleMouseDown (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - handleMouseUp (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_MOVE: - { - int n = event.getPointerCount(); - for (int i = 0; i < n; ++i) - handleMouseDrag (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - - return true; - } - - case MotionEvent.ACTION_POINTER_UP: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseUp (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - case MotionEvent.ACTION_POINTER_DOWN: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseDown (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - default: - break; - } - - return false; - } - - //============================================================================== - private native void handleKeyDown (long host, int keycode, int textchar); - private native void handleKeyUp (long host, int keycode, int textchar); - private native void handleBackButton (long host); - private native void handleKeyboardHidden (long host); - - public void showKeyboard (String type) - { - InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) - { - if (type.length() > 0) - { - imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT); - imm.setInputMethod (getWindowToken(), type); - keyboardDismissListener.startListening(); - } - else - { - imm.hideSoftInputFromWindow (getWindowToken(), 0); - keyboardDismissListener.stopListening(); - } - } - } - - public void backButtonPressed() - { - if (host == 0) - return; - - handleBackButton (host); - } - - @Override - public boolean onKeyDown (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - switch (keyCode) - { - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_DOWN: - return super.onKeyDown (keyCode, event); - case KeyEvent.KEYCODE_BACK: - { - ((Activity) getContext()).onBackPressed(); - return true; - } - - default: - break; - } - - handleKeyDown (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyUp (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - handleKeyUp (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) - { - if (host == 0) - return false; - - if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction() != KeyEvent.ACTION_MULTIPLE) - return super.onKeyMultiple (keyCode, count, event); - - if (event.getCharacters() != null) - { - int utf8Char = event.getCharacters().codePointAt (0); - handleKeyDown (host, utf8Char, utf8Char); - return true; - } - - return false; - } - - //============================================================================== - private final class KeyboardDismissListener - { - public KeyboardDismissListener (ComponentPeerView viewToUse) - { - view = viewToUse; - } - - private void startListening() - { - view.getViewTreeObserver().addOnGlobalLayoutListener(viewTreeObserver); - } - - private void stopListening() - { - view.getViewTreeObserver().removeGlobalOnLayoutListener(viewTreeObserver); - } - - private class TreeObserver implements ViewTreeObserver.OnGlobalLayoutListener - { - TreeObserver() - { - keyboardShown = false; - } - - @Override - public void onGlobalLayout() - { - Rect r = new Rect(); - - ViewGroup parentView = (ViewGroup) getParent(); - - if (parentView == null) - return; - - parentView.getWindowVisibleDisplayFrame (r); - - int diff = parentView.getHeight() - (r.bottom - r.top); - - // Arbitrary threshold, surely keyboard would take more than 20 pix. - if (diff < 20 && keyboardShown) - { - keyboardShown = false; - handleKeyboardHidden (view.host); - } - - if (! keyboardShown && diff > 20) - keyboardShown = true; - }; - - private boolean keyboardShown; - }; - - private ComponentPeerView view; - private TreeObserver viewTreeObserver = new TreeObserver(); - } - - private KeyboardDismissListener keyboardDismissListener = new KeyboardDismissListener(this); - - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 - @Override - public InputConnection onCreateInputConnection (EditorInfo outAttrs) - { - outAttrs.actionLabel = ""; - outAttrs.hintText = ""; - outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; - outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - if (host == 0) - return; - - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged (host); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - for (int i = getChildCount(); --i >= 0;) - requestTransparentRegion (getChildAt (i)); - } - - private native void viewSizeChanged (long host); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (host == 0) - return; - - if (v == this) - focusChanged (host, hasFocus); - } - - private native void focusChanged (long host, boolean hasFocus); - - public void setViewName (String newName) {} - - public void setSystemUiVisibilityCompat (int visibility) - { - Method systemUIVisibilityMethod = null; - try - { - systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (systemUIVisibilityMethod == null) return; - - try - { - systemUIVisibilityMethod.invoke (this, visibility); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - public boolean isVisible() { return getVisibility() == VISIBLE; } - public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); } - - public boolean containsPoint (int x, int y) - { - return true; //xxx needs to check overlapping views - } - - //============================================================================== - private native void handleAppPaused (long host); - private native void handleAppResumed (long host); - - @Override - public void appPaused() - { - if (host == 0) - return; - - handleAppPaused (host); - } - - @Override - public void appResumed() - { - if (host == 0) - return; - - // Ensure that navigation/status bar visibility is correctly restored. - handleAppResumed (host); - } - } - - //============================================================================== - public static class NativeSurfaceView extends SurfaceView - implements SurfaceHolder.Callback - { - private long nativeContext = 0; - private boolean forVideo; - - NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo) - { - super (context); - nativeContext = nativeContextPtr; - forVideo = createdForVideo; - } - - public Surface getNativeSurface() - { - Surface retval = null; - - SurfaceHolder holder = getHolder(); - if (holder != null) - retval = holder.getSurface(); - - return retval; - } - - //============================================================================== - @Override - public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) - { - if (forVideo) - surfaceChangedNativeVideo (nativeContext, holder, format, width, height); - else - surfaceChangedNative (nativeContext, holder, format, width, height); - } - - @Override - public void surfaceCreated (SurfaceHolder holder) - { - if (forVideo) - surfaceCreatedNativeVideo (nativeContext, holder); - else - surfaceCreatedNative (nativeContext, holder); - } - - @Override - public void surfaceDestroyed (SurfaceHolder holder) - { - if (forVideo) - surfaceDestroyedNativeVideo (nativeContext, holder); - else - surfaceDestroyedNative (nativeContext, holder); - } - - @Override - protected void dispatchDraw (Canvas canvas) - { - super.dispatchDraw (canvas); - - if (forVideo) - dispatchDrawNativeVideo (nativeContext, canvas); - else - dispatchDrawNative (nativeContext, canvas); - } - - //============================================================================== - @Override - protected void onAttachedToWindow() - { - super.onAttachedToWindow(); - getHolder().addCallback (this); - } - - @Override - protected void onDetachedFromWindow() - { - super.onDetachedFromWindow(); - getHolder().removeCallback (this); - } - - //============================================================================== - private native void dispatchDrawNative (long nativeContextPtr, Canvas canvas); - private native void surfaceCreatedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder, - int format, int width, int height); - - private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas); - private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder); - private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder); - private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder, - int format, int width, int height); - } - - public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo) - { - return new NativeSurfaceView (this, nativeSurfacePtr, forVideo); - } - - //============================================================================== - public final int[] renderGlyph (char glyph1, char glyph2, Paint paint, android.graphics.Matrix matrix, Rect bounds) - { - Path p = new Path(); - - char[] str = { glyph1, glyph2 }; - paint.getTextPath (str, 0, (glyph2 != 0 ? 2 : 1), 0.0f, 0.0f, p); - - RectF boundsF = new RectF(); - p.computeBounds (boundsF, true); - matrix.mapRect (boundsF); - - boundsF.roundOut (bounds); - bounds.left--; - bounds.right++; - - final int w = bounds.width(); - final int h = Math.max (1, bounds.height()); - - Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); - - Canvas c = new Canvas (bm); - matrix.postTranslate (-bounds.left, -bounds.top); - c.setMatrix (matrix); - c.drawPath (p, paint); - - final int sizeNeeded = w * h; - if (cachedRenderArray.length < sizeNeeded) - cachedRenderArray = new int [sizeNeeded]; - - bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h); - bm.recycle(); - return cachedRenderArray; - } - - private int[] cachedRenderArray = new int [256]; - - //============================================================================== - public static class NativeInvocationHandler implements InvocationHandler - { - public NativeInvocationHandler (Activity activityToUse, long nativeContextRef) - { - activity = activityToUse; - nativeContext = nativeContextRef; - } - - public void nativeContextDeleted() - { - nativeContext = 0; - } - - @Override - public void finalize() - { - activity.runOnUiThread (new Runnable() - { - @Override - public void run() - { - if (nativeContext != 0) - dispatchFinalize (nativeContext); - } - }); - } - - @Override - public Object invoke (Object proxy, Method method, Object[] args) throws Throwable - { - return dispatchInvoke (nativeContext, proxy, method, args); - } - - //============================================================================== - Activity activity; - private long nativeContext = 0; - - private native void dispatchFinalize (long nativeContextRef); - private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args); - } - - public InvocationHandler createInvocationHandler (long nativeContextRef) - { - return new NativeInvocationHandler (this, nativeContextRef); - } - - public void invocationHandlerContextDeleted (InvocationHandler handler) - { - ((NativeInvocationHandler) handler).nativeContextDeleted(); - } - - //============================================================================== - public static class HTTPStream - { - public HTTPStream (String address, boolean isPostToUse, byte[] postDataToUse, - String headersToUse, int timeOutMsToUse, - int[] statusCodeToUse, StringBuffer responseHeadersToUse, - int numRedirectsToFollowToUse, String httpRequestCmdToUse) throws IOException - { - isPost = isPostToUse; - postData = postDataToUse; - headers = headersToUse; - timeOutMs = timeOutMsToUse; - statusCode = statusCodeToUse; - responseHeaders = responseHeadersToUse; - totalLength = -1; - numRedirectsToFollow = numRedirectsToFollowToUse; - httpRequestCmd = httpRequestCmdToUse; - - connection = createConnection (address, isPost, postData, headers, timeOutMs, httpRequestCmd); - } - - private final HttpURLConnection createConnection (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, String httpRequestCmdToUse) throws IOException - { - HttpURLConnection newConnection = (HttpURLConnection) (new URL(address).openConnection()); - - try - { - newConnection.setInstanceFollowRedirects (false); - newConnection.setConnectTimeout (timeOutMs); - newConnection.setReadTimeout (timeOutMs); - - // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines. - // So convert headers string to an array, with an element for each line - String headerLines[] = headers.split("\\n"); - - // Set request headers - for (int i = 0; i < headerLines.length; ++i) - { - int pos = headerLines[i].indexOf (":"); - - if (pos > 0 && pos < headerLines[i].length()) - { - String field = headerLines[i].substring (0, pos); - String value = headerLines[i].substring (pos + 1); - - if (value.length() > 0) - newConnection.setRequestProperty (field, value); - } - } - - newConnection.setRequestMethod (httpRequestCmd); - - if (isPost) - { - newConnection.setDoOutput (true); - - if (postData != null) - { - OutputStream out = newConnection.getOutputStream(); - out.write(postData); - out.flush(); - } - } - - return newConnection; - } - catch (Throwable e) - { - newConnection.disconnect(); - throw new IOException ("Connection error"); - } - } - - private final InputStream getCancellableStream (final boolean isInput) throws ExecutionException - { - synchronized (createFutureLock) - { - if (hasBeenCancelled.get()) - return null; - - streamFuture = executor.submit (new Callable() - { - @Override - public BufferedInputStream call() throws IOException - { - return new BufferedInputStream (isInput ? connection.getInputStream() - : connection.getErrorStream()); - } - }); - } - - try - { - return streamFuture.get(); - } - catch (InterruptedException e) - { - return null; - } - catch (CancellationException e) - { - return null; - } - } - - public final boolean connect() - { - boolean result = false; - int numFollowedRedirects = 0; - - while (true) - { - result = doConnect(); - - if (! result) - return false; - - if (++numFollowedRedirects > numRedirectsToFollow) - break; - - int status = statusCode[0]; - - if (status == 301 || status == 302 || status == 303 || status == 307) - { - // Assumes only one occurrence of "Location" - int pos1 = responseHeaders.indexOf ("Location:") + 10; - int pos2 = responseHeaders.indexOf ("\n", pos1); - - if (pos2 > pos1) - { - String currentLocation = connection.getURL().toString(); - String newLocation = responseHeaders.substring (pos1, pos2); - - try - { - // Handle newLocation whether it's absolute or relative - URL baseUrl = new URL (currentLocation); - URL newUrl = new URL (baseUrl, newLocation); - String transformedNewLocation = newUrl.toString(); - - if (transformedNewLocation != currentLocation) - { - // Clear responseHeaders before next iteration - responseHeaders.delete (0, responseHeaders.length()); - - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - connection.disconnect(); - - try - { - connection = createConnection (transformedNewLocation, isPost, - postData, headers, timeOutMs, - httpRequestCmd); - } - catch (Throwable e) - { - return false; - } - } - } - else - { - break; - } - } - catch (Throwable e) - { - return false; - } - } - else - { - break; - } - } - else - { - break; - } - } - - return result; - } - - private final boolean doConnect() - { - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - try - { - try - { - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - { - if (connection.getResponseCode() < 400) - { - statusCode[0] = connection.getResponseCode(); - connection.disconnect(); - return false; - } - } - finally - { - statusCode[0] = connection.getResponseCode(); - } - - try - { - if (statusCode[0] >= 400) - inputStream = getCancellableStream (false); - else - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - {} - - for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) - { - if (entry.getKey() != null && entry.getValue() != null) - { - responseHeaders.append(entry.getKey() + ": " - + android.text.TextUtils.join(",", entry.getValue()) + "\n"); - - if (entry.getKey().compareTo ("Content-Length") == 0) - totalLength = Integer.decode (entry.getValue().get (0)); - } - } - - return true; - } - catch (IOException e) - { - return false; - } - } - } - - static class DisconnectionRunnable implements Runnable - { - public DisconnectionRunnable (HttpURLConnection theConnection, - InputStream theInputStream, - ReentrantLock theCreateStreamLock, - Object theCreateFutureLock, - Future theStreamFuture) - { - connectionToDisconnect = theConnection; - inputStream = theInputStream; - createStreamLock = theCreateStreamLock; - createFutureLock = theCreateFutureLock; - streamFuture = theStreamFuture; - } - - public void run() - { - try - { - if (! createStreamLock.tryLock()) - { - synchronized (createFutureLock) - { - if (streamFuture != null) - streamFuture.cancel (true); - } - - createStreamLock.lock(); - } - - if (connectionToDisconnect != null) - connectionToDisconnect.disconnect(); - - if (inputStream != null) - inputStream.close(); - } - catch (IOException e) - {} - finally - { - createStreamLock.unlock(); - } - } - - private HttpURLConnection connectionToDisconnect; - private InputStream inputStream; - private ReentrantLock createStreamLock; - private Object createFutureLock; - Future streamFuture; - } - - public final void release() - { - DisconnectionRunnable disconnectionRunnable = new DisconnectionRunnable (connection, - inputStream, - createStreamLock, - createFutureLock, - streamFuture); - - synchronized (createStreamLock) - { - hasBeenCancelled.set (true); - - connection = null; - } - - Thread disconnectionThread = new Thread(disconnectionRunnable); - disconnectionThread.start(); - } - - public final int read (byte[] buffer, int numBytes) - { - int num = 0; - - try - { - synchronized (createStreamLock) - { - if (inputStream != null) - num = inputStream.read (buffer, 0, numBytes); - } - } - catch (IOException e) - {} - - if (num > 0) - position += num; - - return num; - } - - public final long getPosition() { return position; } - public final long getTotalLength() { return totalLength; } - public final boolean isExhausted() { return false; } - public final boolean setPosition (long newPos) { return false; } - - private boolean isPost; - private byte[] postData; - private String headers; - private int timeOutMs; - String httpRequestCmd; - private HttpURLConnection connection; - private int[] statusCode; - private StringBuffer responseHeaders; - private int totalLength; - private int numRedirectsToFollow; - private InputStream inputStream; - private long position; - private final ReentrantLock createStreamLock = new ReentrantLock(); - private final Object createFutureLock = new Object(); - private AtomicBoolean hasBeenCancelled = new AtomicBoolean(); - - private final ExecutorService executor = Executors.newCachedThreadPool (Executors.defaultThreadFactory()); - Future streamFuture; - } - - public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, int[] statusCode, - StringBuffer responseHeaders, int numRedirectsToFollow, - String httpRequestCmd) - { - // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL) - if (timeOutMs < 0) - timeOutMs = 0; - else if (timeOutMs == 0) - timeOutMs = 30000; - - for (;;) - { - try - { - HTTPStream httpStream = new HTTPStream (address, isPost, postData, headers, - timeOutMs, statusCode, responseHeaders, - numRedirectsToFollow, httpRequestCmd); - - return httpStream; - } - catch (Throwable e) {} - - return null; - } - } - - public final void launchURL (String url) - { - startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url))); - } - - private native boolean webViewPageLoadStarted (long host, WebView view, String url); - private native void webViewPageLoadFinished (long host, WebView view, String url); - private native void webViewReceivedError (long host, WebView view, WebResourceRequest request, WebResourceError error); private native void webViewReceivedHttpError (long host, WebView view, WebResourceRequest request, WebResourceResponse errorResponse); private native void webViewReceivedSslError (long host, WebView view, SslErrorHandler handler, SslError error); - private native void webViewCloseWindowRequest (long host, WebView view); - private native void webViewCreateWindowRequest (long host, WebView view); - - //============================================================================== - public class JuceWebViewClient extends WebViewClient - { - public JuceWebViewClient (long hostToUse) - { - host = hostToUse; - } - - public void hostDeleted() - { - synchronized (hostLock) - { - host = 0; - } - } - - @Override - public void onPageFinished (WebView view, String url) - { - if (host == 0) - return; - - webViewPageLoadFinished (host, view, url); - } - - @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) - { - if (host == 0) - return; - - webViewReceivedSslError (host, view, handler, error); - } - - @Override - public void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error) - { - if (host == 0) - return; - - webViewReceivedError (host, view, request, error); - } - - @Override - public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) - { - if (host == 0) - return; - - webViewReceivedHttpError (host, view, request, errorResponse); - } - - @Override - public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) - { - synchronized (hostLock) - { - if (host != 0) - { - boolean shouldLoad = webViewPageLoadStarted (host, view, request.getUrl().toString()); - - if (shouldLoad) - return null; - } - } - - return new WebResourceResponse ("text/html", null, null); - } - - private long host; - private final Object hostLock = new Object(); - } - - public class JuceWebChromeClient extends WebChromeClient - { - public JuceWebChromeClient (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onCloseWindow (WebView window) - { - webViewCloseWindowRequest (host, window); - } - - @Override - public boolean onCreateWindow (WebView view, boolean isDialog, - boolean isUserGesture, Message resultMsg) - { - webViewCreateWindowRequest (host, view); - return false; - } - - private long host; - private final Object hostLock = new Object(); - } - - - //============================================================================== - public class CameraDeviceStateCallback extends CameraDevice.StateCallback - { - private native void cameraDeviceStateClosed (long host, CameraDevice camera); - private native void cameraDeviceStateDisconnected (long host, CameraDevice camera); - private native void cameraDeviceStateError (long host, CameraDevice camera, int error); - private native void cameraDeviceStateOpened (long host, CameraDevice camera); - - CameraDeviceStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onClosed (CameraDevice camera) - { - cameraDeviceStateClosed (host, camera); - } - - @Override - public void onDisconnected (CameraDevice camera) - { - cameraDeviceStateDisconnected (host, camera); - } - - @Override - public void onError (CameraDevice camera, int error) - { - cameraDeviceStateError (host, camera, error); - } - - @Override - public void onOpened (CameraDevice camera) - { - cameraDeviceStateOpened (host, camera); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback - { - private native void cameraCaptureSessionActive (long host, CameraCaptureSession session); - private native void cameraCaptureSessionClosed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigureFailed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigured (long host, CameraCaptureSession session); - private native void cameraCaptureSessionReady (long host, CameraCaptureSession session); - - CameraCaptureSessionStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onActive (CameraCaptureSession session) - { - cameraCaptureSessionActive (host, session); - } - - @Override - public void onClosed (CameraCaptureSession session) - { - cameraCaptureSessionClosed (host, session); - } - - @Override - public void onConfigureFailed (CameraCaptureSession session) - { - cameraCaptureSessionConfigureFailed (host, session); - } - - @Override - public void onConfigured (CameraCaptureSession session) - { - cameraCaptureSessionConfigured (host, session); - } - - @Override - public void onReady (CameraCaptureSession session) - { - cameraCaptureSessionReady (host, session); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionCaptureCallback extends CameraCaptureSession.CaptureCallback - { - private native void cameraCaptureSessionCaptureCompleted (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result); - private native void cameraCaptureSessionCaptureFailed (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, CaptureFailure failure); - private native void cameraCaptureSessionCaptureProgressed (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult); - private native void cameraCaptureSessionCaptureStarted (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber); - private native void cameraCaptureSessionCaptureSequenceAborted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId); - private native void cameraCaptureSessionCaptureSequenceCompleted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId, long frameNumber); - - CameraCaptureSessionCaptureCallback (long hostToUse, boolean shouldBePreview) - { - host = hostToUse; - preview = shouldBePreview; - } - - @Override - public void onCaptureCompleted (CameraCaptureSession session, CaptureRequest request, - TotalCaptureResult result) - { - cameraCaptureSessionCaptureCompleted (host, preview, session, request, result); - } - - @Override - public void onCaptureFailed (CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) - { - cameraCaptureSessionCaptureFailed (host, preview, session, request, failure); - } - - @Override - public void onCaptureProgressed (CameraCaptureSession session, CaptureRequest request, - CaptureResult partialResult) - { - cameraCaptureSessionCaptureProgressed (host, preview, session, request, partialResult); - } - - @Override - public void onCaptureSequenceAborted (CameraCaptureSession session, int sequenceId) - { - cameraCaptureSessionCaptureSequenceAborted (host, preview, session, sequenceId); - } - - @Override - public void onCaptureSequenceCompleted (CameraCaptureSession session, int sequenceId, long frameNumber) - { - cameraCaptureSessionCaptureSequenceCompleted (host, preview, session, sequenceId, frameNumber); - } - - @Override - public void onCaptureStarted (CameraCaptureSession session, CaptureRequest request, long timestamp, - long frameNumber) - { - cameraCaptureSessionCaptureStarted (host, preview, session, request, timestamp, frameNumber); - } - - private long host; - private boolean preview; - } - - //============================================================================== - public class JuceOrientationEventListener extends OrientationEventListener - { - private native void deviceOrientationChanged (long host, int orientation); - - public JuceOrientationEventListener (long hostToUse, Context context, int rate) - { - super (context, rate); - - host = hostToUse; - } - - @Override - public void onOrientationChanged (int orientation) - { - deviceOrientationChanged (host, orientation); - } - - private long host; - } - - - //============================================================================== - public class MediaControllerCallback extends MediaController.Callback - { - private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info); - private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata); - private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state); - private native void mediaControllerSessionDestroyed (long host); - - MediaControllerCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onAudioInfoChanged (MediaController.PlaybackInfo info) - { - mediaControllerAudioInfoChanged (host, info); - } - - @Override - public void onMetadataChanged (MediaMetadata metadata) - { - mediaControllerMetadataChanged (host, metadata); - } - - @Override - public void onPlaybackStateChanged (PlaybackState state) - { - mediaControllerPlaybackStateChanged (host, state); - } - - @Override - public void onQueueChanged (List queue) {} - - @Override - public void onSessionDestroyed() - { - mediaControllerSessionDestroyed (host); - } - - private long host; - } - - //============================================================================== - public class MediaSessionCallback extends MediaSession.Callback - { - private native void mediaSessionPause (long host); - private native void mediaSessionPlay (long host); - private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras); - private native void mediaSessionSeekTo (long host, long pos); - private native void mediaSessionStop (long host); - - - MediaSessionCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onPause() - { - mediaSessionPause (host); - } - - @Override - public void onPlay() - { - mediaSessionPlay (host); - } - - @Override - public void onPlayFromMediaId (String mediaId, Bundle extras) - { - mediaSessionPlayFromMediaId (host, mediaId, extras); - } - - @Override - public void onSeekTo (long pos) - { - mediaSessionSeekTo (host, pos); - } - - @Override - public void onStop() - { - mediaSessionStop (host); - } - - @Override - public void onFastForward() {} - - @Override - public boolean onMediaButtonEvent (Intent mediaButtonIntent) - { - return true; - } - - @Override - public void onRewind() {} - - @Override - public void onSkipToNext() {} - - @Override - public void onSkipToPrevious() {} - - @Override - public void onSkipToQueueItem (long id) {} - - private long host; - } - - //============================================================================== - public class SystemVolumeObserver extends ContentObserver - { - private native void mediaSessionSystemVolumeChanged (long host); - - SystemVolumeObserver (Activity activityToUse, long hostToUse) - { - super (null); - - activity = activityToUse; - host = hostToUse; - } - - void setEnabled (boolean shouldBeEnabled) - { - if (shouldBeEnabled) - activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this); - else - activity.getApplicationContext().getContentResolver().unregisterContentObserver (this); - } - - @Override - public void onChange (boolean selfChange, Uri uri) - { - if (uri.toString().startsWith ("content://settings/system/volume_music")) - mediaSessionSystemVolumeChanged (host); - } - - private Activity activity; - private long host; - } - - - //============================================================================== - public static final String getLocaleValue (boolean isRegion) - { - java.util.Locale locale = java.util.Locale.getDefault(); - - return isRegion ? locale.getCountry() - : locale.getLanguage(); - } - - private static final String getFileLocation (String type) - { - return Environment.getExternalStoragePublicDirectory (type).getAbsolutePath(); - } - - public static final String getDocumentsFolder() - { - if (getAndroidSDKVersion() >= 19) - return getFileLocation ("Documents"); - - return Environment.getDataDirectory().getAbsolutePath(); - } - - public static final String getPicturesFolder() { return getFileLocation (Environment.DIRECTORY_PICTURES); } - public static final String getMusicFolder() { return getFileLocation (Environment.DIRECTORY_MUSIC); } - public static final String getMoviesFolder() { return getFileLocation (Environment.DIRECTORY_MOVIES); } - public static final String getDownloadsFolder() { return getFileLocation (Environment.DIRECTORY_DOWNLOADS); } - - //============================================================================== - @Override - protected void onActivityResult (int requestCode, int resultCode, Intent data) - { - appActivityResult (requestCode, resultCode, data); - } - - @Override - protected void onNewIntent (Intent intent) - { - super.onNewIntent(intent); - setIntent(intent); - - appNewIntent (intent); - } - - //============================================================================== - public final Typeface getTypeFaceFromAsset (String assetName) - { - try - { - return Typeface.createFromAsset (this.getResources().getAssets(), assetName); - } - catch (Throwable e) {} - - return null; - } - - final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); - - public static String bytesToHex (byte[] bytes) - { - char[] hexChars = new char[bytes.length * 2]; - - for (int j = 0; j < bytes.length; ++j) - { - int v = bytes[j] & 0xff; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0f]; - } - - return new String (hexChars); - } - - final private java.util.Map dataCache = new java.util.HashMap(); - - synchronized private final File getDataCacheFile (byte[] data) - { - try - { - java.security.MessageDigest digest = java.security.MessageDigest.getInstance ("MD5"); - digest.update (data); - - String key = bytesToHex (digest.digest()); - - if (dataCache.containsKey (key)) - return (File) dataCache.get (key); - - File f = new File (this.getCacheDir(), "bindata_" + key); - f.delete(); - FileOutputStream os = new FileOutputStream (f); - os.write (data, 0, data.length); - dataCache.put (key, f); - return f; - } - catch (Throwable e) {} - - return null; - } - - private final void clearDataCache() - { - java.util.Iterator it = dataCache.values().iterator(); - - while (it.hasNext()) - { - File f = (File) it.next(); - f.delete(); - } - } - - public final Typeface getTypeFaceFromByteArray (byte[] data) - { - try - { - File f = getDataCacheFile (data); - - if (f != null) - return Typeface.createFromFile (f); - } - catch (Exception e) - { - Log.e ("JUCE", e.toString()); - } - - return null; - } - - public static final int getAndroidSDKVersion() - { - return android.os.Build.VERSION.SDK_INT; - } - - public final String audioManagerGetProperty (String property) - { - Object obj = getSystemService (AUDIO_SERVICE); - if (obj == null) - return null; - - java.lang.reflect.Method method; - - try - { - method = obj.getClass().getMethod ("getProperty", String.class); - } - catch (SecurityException e) { return null; } - catch (NoSuchMethodException e) { return null; } - - if (method == null) - return null; - - try - { - return (String) method.invoke (obj, property); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - - return null; - } - - public final boolean hasSystemFeature (String property) - { - return getPackageManager().hasSystemFeature (property); - } -} diff --git a/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/SharingContentProvider.java b/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/SharingContentProvider.java deleted file mode 100644 index 9afbbaaa70..0000000000 --- a/examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/SharingContentProvider.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.juce.demorunner; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.res.AssetFileDescriptor; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.net.Uri; -import android.os.FileObserver; -import android.os.ParcelFileDescriptor; -import java.lang.String; - -public final class SharingContentProvider extends ContentProvider -{ - private Object lock = new Object(); - - private native void contentSharerFileObserverEvent (long host, int event, String path); - - private native Cursor contentSharerQuery (Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder); - - private native void contentSharerCursorClosed (long host); - - private native AssetFileDescriptor contentSharerOpenFile (Uri uri, String mode); - private native String[] contentSharerGetStreamTypes (Uri uri, String mimeTypeFilter); - - public final class ProviderFileObserver extends FileObserver - { - public ProviderFileObserver (long hostToUse, String path, int mask) - { - super (path, mask); - - host = hostToUse; - } - - public void onEvent (int event, String path) - { - contentSharerFileObserverEvent (host, event, path); - } - - private long host; - } - - public final class ProviderCursor extends MatrixCursor - { - ProviderCursor (long hostToUse, String[] columnNames) - { - super (columnNames); - - host = hostToUse; - } - - @Override - public void close() - { - super.close(); - - contentSharerCursorClosed (host); - } - - private long host; - } - - @Override - public boolean onCreate() - { - return true; - } - - @Override - public Cursor query (Uri url, String[] projection, String selection, - String[] selectionArgs, String sortOrder) - { - synchronized (lock) - { - return contentSharerQuery (url, projection, selection, selectionArgs, sortOrder); - } - } - - @Override - public Uri insert (Uri uri, ContentValues values) - { - return null; - } - - @Override - public int update (Uri uri, ContentValues values, String selection, - String[] selectionArgs) - { - return 0; - } - - @Override - public int delete (Uri uri, String selection, String[] selectionArgs) - { - return 0; - } - - @Override - public String getType (Uri uri) - { - return null; - } - - @Override - public AssetFileDescriptor openAssetFile (Uri uri, String mode) - { - synchronized (lock) - { - return contentSharerOpenFile (uri, mode); - } - } - - @Override - public ParcelFileDescriptor openFile (Uri uri, String mode) - { - synchronized (lock) - { - AssetFileDescriptor result = contentSharerOpenFile (uri, mode); - - if (result != null) - return result.getParcelFileDescriptor(); - - return null; - } - } - - @Override - public String[] getStreamTypes (Uri uri, String mimeTypeFilter) - { - synchronized (lock) - { - return contentSharerGetStreamTypes (uri, mimeTypeFilter); - } - } - -} diff --git a/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/DemoRunner.java b/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/DemoRunner.java deleted file mode 100644 index 7e4f1ae939..0000000000 --- a/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/DemoRunner.java +++ /dev/null @@ -1,2996 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.roli.juce.demorunner; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.hardware.camera2.*; -import android.net.http.SslError; -import android.net.Uri; -import android.os.Bundle; -import android.os.Looper; -import android.os.Handler; -import android.os.Message; -import android.os.ParcelUuid; -import android.os.Environment; -import android.view.*; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; -import android.graphics.*; -import android.text.ClipboardManager; -import android.text.InputType; -import android.util.DisplayMetrics; -import android.util.Log; -import android.util.Pair; -import android.webkit.SslErrorHandler; -import android.webkit.WebChromeClient; -import android.webkit.WebResourceError; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import java.lang.Runnable; -import java.lang.ref.WeakReference; -import java.lang.reflect.*; -import java.util.*; -import java.io.*; -import java.net.URL; -import java.net.HttpURLConnection; -import android.media.AudioManager; -import android.Manifest; -import java.util.concurrent.CancellationException; -import java.util.concurrent.Future; -import java.util.concurrent.Executors; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.atomic.*; - -import android.media.midi.*; -import android.bluetooth.*; -import android.bluetooth.le.*; - - -//============================================================================== -public class DemoRunner extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("juce_jni"); - } - - //============================================================================== - public boolean isPermissionDeclaredInManifest (int permissionID) - { - String permissionToCheck = getAndroidPermissionName(permissionID); - - try - { - PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS); - - if (info.requestedPermissions != null) - for (String permission : info.requestedPermissions) - if (permission.equals (permissionToCheck)) - return true; - } - catch (PackageManager.NameNotFoundException e) - { - Log.d ("JUCE", "isPermissionDeclaredInManifest: PackageManager.NameNotFoundException = " + e.toString()); - } - - Log.d ("JUCE", "isPermissionDeclaredInManifest: could not find requested permission " + permissionToCheck); - return false; - } - - //============================================================================== - // these have to match the values of enum PermissionID in C++ class RuntimePermissions: - private static final int JUCE_PERMISSIONS_RECORD_AUDIO = 1; - private static final int JUCE_PERMISSIONS_BLUETOOTH_MIDI = 2; - private static final int JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE = 3; - private static final int JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 4; - private static final int JUCE_PERMISSIONS_CAMERA = 5; - - private static String getAndroidPermissionName (int permissionID) - { - switch (permissionID) - { - case JUCE_PERMISSIONS_RECORD_AUDIO: return Manifest.permission.RECORD_AUDIO; - case JUCE_PERMISSIONS_BLUETOOTH_MIDI: return Manifest.permission.ACCESS_COARSE_LOCATION; - // use string value as this is not defined in SDKs < 16 - case JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE: return "android.permission.READ_EXTERNAL_STORAGE"; - case JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE: return Manifest.permission.WRITE_EXTERNAL_STORAGE; - case JUCE_PERMISSIONS_CAMERA: return Manifest.permission.CAMERA; - } - - // unknown permission ID! - assert false; - return new String(); - } - - public boolean isPermissionGranted (int permissionID) - { - return getApplicationContext().checkCallingOrSelfPermission (getAndroidPermissionName (permissionID)) == PackageManager.PERMISSION_GRANTED; - } - - private Map permissionCallbackPtrMap; - - public void requestRuntimePermission (int permissionID, long ptrToCallback) - { - String permissionName = getAndroidPermissionName (permissionID); - - if (getApplicationContext().checkCallingOrSelfPermission (permissionName) != PackageManager.PERMISSION_GRANTED) - { - // remember callbackPtr, request permissions, and let onRequestPermissionResult call callback asynchronously - permissionCallbackPtrMap.put (permissionID, ptrToCallback); - requestPermissionsCompat (new String[]{permissionName}, permissionID); - } - else - { - // permissions were already granted before, we can call callback directly - androidRuntimePermissionsCallback (true, ptrToCallback); - } - } - - private native void androidRuntimePermissionsCallback (boolean permissionWasGranted, long ptrToCallback); - - @Override - public void onRequestPermissionsResult (int permissionID, String permissions[], int[] grantResults) - { - boolean permissionsGranted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED); - - if (! permissionsGranted) - Log.d ("JUCE", "onRequestPermissionsResult: runtime permission was DENIED: " + getAndroidPermissionName (permissionID)); - - Long ptrToCallback = permissionCallbackPtrMap.get (permissionID); - permissionCallbackPtrMap.remove (permissionID); - androidRuntimePermissionsCallback (permissionsGranted, ptrToCallback); - } - - //============================================================================== - public interface JuceMidiPort - { - boolean isInputPort(); - - // start, stop does nothing on an output port - void start(); - void stop(); - - void close(); - - // send will do nothing on an input port - void sendMidi (byte[] msg, int offset, int count); - } - - //============================================================================== - //============================================================================== - public class BluetoothManager extends ScanCallback - { - BluetoothManager() - { - } - - public String[] getMidiBluetoothAddresses() - { - return bluetoothMidiDevices.toArray (new String[bluetoothMidiDevices.size()]); - } - - public String getHumanReadableStringForBluetoothAddress (String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - return btDevice.getName(); - } - - public int getBluetoothDeviceStatus (String address) - { - return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); - } - - public void startStopScan (boolean shouldStart) - { - BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - - if (bluetoothAdapter == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get default Bluetooth adapter"); - return; - } - - BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); - - if (bluetoothLeScanner == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get Bluetooth LE scanner"); - return; - } - - if (shouldStart) - { - ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder(); - scanFilterBuilder.setServiceUuid (ParcelUuid.fromString (bluetoothLEMidiServiceUUID)); - - ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder(); - scanSettingsBuilder.setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES) - .setScanMode (ScanSettings.SCAN_MODE_LOW_POWER) - .setScanMode (ScanSettings.MATCH_MODE_STICKY); - - bluetoothLeScanner.startScan (Arrays.asList (scanFilterBuilder.build()), - scanSettingsBuilder.build(), - this); - } - else - { - bluetoothLeScanner.stopScan (this); - } - } - - public boolean pairBluetoothMidiDevice(String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - - if (btDevice == null) - { - Log.d ("JUCE", "failed to create buletooth device from address"); - return false; - } - - return getAndroidMidiDeviceManager().pairBluetoothDevice (btDevice); - } - - public void unpairBluetoothMidiDevice (String address) - { - getAndroidMidiDeviceManager().unpairBluetoothDevice (address); - } - - public void onScanFailed (int errorCode) - { - } - - public void onScanResult (int callbackType, ScanResult result) - { - if (callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES - || callbackType == ScanSettings.CALLBACK_TYPE_FIRST_MATCH) - { - BluetoothDevice device = result.getDevice(); - - if (device != null) - bluetoothMidiDevices.add (device.getAddress()); - } - - if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) - { - Log.d ("JUCE", "ScanSettings.CALLBACK_TYPE_MATCH_LOST"); - BluetoothDevice device = result.getDevice(); - - if (device != null) - { - bluetoothMidiDevices.remove (device.getAddress()); - unpairBluetoothMidiDevice (device.getAddress()); - } - } - } - - public void onBatchScanResults (List results) - { - for (ScanResult result : results) - onScanResult (ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result); - } - - private BluetoothLeScanner scanner; - private static final String bluetoothLEMidiServiceUUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"; - - private HashSet bluetoothMidiDevices = new HashSet(); - } - - public static class JuceMidiInputPort extends MidiReceiver implements JuceMidiPort - { - private native void handleReceive (long host, byte[] msg, int offset, int count, long timestamp); - - public JuceMidiInputPort (MidiDeviceManager mm, MidiOutputPort actualPort, MidiPortPath portPathToUse, long hostToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - juceHost = hostToUse; - isConnected = false; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return true; - } - - @Override - public void start() - { - if (owner != null && androidPort != null && ! isConnected) { - androidPort.connect(this); - isConnected = true; - } - } - - @Override - public void stop() - { - if (owner != null && androidPort != null && isConnected) { - androidPort.disconnect(this); - isConnected = false; - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - @Override - public void onSend (byte[] msg, int offset, int count, long timestamp) - { - if (count > 0) - handleReceive (juceHost, msg, offset, count, timestamp); - } - - @Override - public void onFlush() - {} - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - } - - MidiDeviceManager owner; - MidiOutputPort androidPort; - MidiPortPath portPath; - long juceHost; - boolean isConnected; - } - - public static class JuceMidiOutputPort implements JuceMidiPort - { - public JuceMidiOutputPort (MidiDeviceManager mm, MidiInputPort actualPort, MidiPortPath portPathToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return false; - } - - @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - if (androidPort != null) - { - try { - androidPort.send(msg, offset, count); - } catch (IOException exception) - { - Log.d ("JUCE", "send midi had IO exception"); - } - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - MidiDeviceManager owner; - MidiInputPort androidPort; - MidiPortPath portPath; - } - - private static class MidiPortPath extends Object - { - public MidiPortPath (int deviceIdToUse, boolean direction, int androidIndex) - { - deviceId = deviceIdToUse; - isInput = direction; - portIndex = androidIndex; - - } - - public int deviceId; - public int portIndex; - public boolean isInput; - - @Override - public int hashCode() - { - Integer i = new Integer ((deviceId * 128) + (portIndex < 128 ? portIndex : 127)); - return i.hashCode() * (isInput ? -1 : 1); - } - - @Override - public boolean equals (Object obj) - { - if (obj == null) - return false; - - if (getClass() != obj.getClass()) - return false; - - MidiPortPath other = (MidiPortPath) obj; - return (portIndex == other.portIndex && isInput == other.isInput && deviceId == other.deviceId); - } - } - - //============================================================================== - public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener - { - //============================================================================== - private class DummyBluetoothGattCallback extends BluetoothGattCallback - { - public DummyBluetoothGattCallback (MidiDeviceManager mm) - { - super(); - owner = mm; - } - - public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) - { - if (newState == BluetoothProfile.STATE_CONNECTED) - { - gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); - owner.pairBluetoothDeviceStepTwo (gatt.getDevice()); - } - } - public void onServicesDiscovered(BluetoothGatt gatt, int status) {} - public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {} - public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {} - public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {} - public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {} - - private MidiDeviceManager owner; - } - - //============================================================================== - private class MidiDeviceOpenTask extends java.util.TimerTask - { - public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device, BluetoothGatt gattToUse) - { - owner = deviceManager; - midiDevice = device; - btGatt = gattToUse; - } - - @Override - public boolean cancel() - { - synchronized (MidiDeviceOpenTask.class) - { - owner = null; - boolean retval = super.cancel(); - - if (btGatt != null) - { - btGatt.disconnect(); - btGatt.close(); - - btGatt = null; - } - - if (midiDevice != null) - { - try - { - midiDevice.close(); - } - catch (IOException e) - {} - - midiDevice = null; - } - - return retval; - } - } - - public String getBluetoothAddress() - { - synchronized (MidiDeviceOpenTask.class) - { - if (midiDevice != null) - { - MidiDeviceInfo info = midiDevice.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - return btDevice.getAddress(); - } - } - } - - return ""; - } - - public BluetoothGatt getGatt() { return btGatt; } - - public int getID() - { - return midiDevice.getInfo().getId(); - } - - @Override - public void run() - { - synchronized (MidiDeviceOpenTask.class) - { - if (owner != null && midiDevice != null) - owner.onDeviceOpenedDelayed (midiDevice); - } - } - - private MidiDeviceManager owner; - private MidiDevice midiDevice; - private BluetoothGatt btGatt; - } - - //============================================================================== - public MidiDeviceManager() - { - manager = (MidiManager) getSystemService (MIDI_SERVICE); - - if (manager == null) - { - Log.d ("JUCE", "MidiDeviceManager error: could not get MidiManager system service"); - return; - } - - openPorts = new HashMap> (); - midiDevices = new ArrayList>(); - openTasks = new HashMap(); - btDevicesPairing = new HashMap(); - - MidiDeviceInfo[] foundDevices = manager.getDevices(); - for (MidiDeviceInfo info : foundDevices) - onDeviceAdded (info); - - manager.registerDeviceCallback (this, null); - } - - protected void finalize() throws Throwable - { - manager.unregisterDeviceCallback (this); - - synchronized (MidiDeviceManager.class) - { - btDevicesPairing.clear(); - - for (Integer deviceID : openTasks.keySet()) - openTasks.get (deviceID).cancel(); - - openTasks = null; - } - - for (MidiPortPath key : openPorts.keySet()) - openPorts.get (key).get().close(); - - openPorts = null; - - for (Pair device : midiDevices) - { - if (device.second != null) - { - device.second.disconnect(); - device.second.close(); - } - - device.first.close(); - } - - midiDevices.clear(); - - super.finalize(); - } - - public String[] getJuceAndroidMidiInputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - } - - public String[] getJuceAndroidMidiOutputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_INPUT); - } - - private String[] getJuceAndroidMidiDevices (int portType) - { - // only update the list when JUCE asks for a new list - synchronized (MidiDeviceManager.class) - { - deviceInfos = getDeviceInfos(); - } - - ArrayList portNames = new ArrayList(); - - int index = 0; - for (MidiPortPath portInfo = getPortPathForJuceIndex (portType, index); portInfo != null; portInfo = getPortPathForJuceIndex (portType, ++index)) - portNames.add (getPortName (portInfo)); - - String[] names = new String[portNames.size()]; - return portNames.toArray (names); - } - - private JuceMidiPort openMidiPortWithJuceIndex (int index, long host, boolean isInput) - { - synchronized (MidiDeviceManager.class) - { - int portTypeToFind = (isInput ? MidiDeviceInfo.PortInfo.TYPE_OUTPUT : MidiDeviceInfo.PortInfo.TYPE_INPUT); - MidiPortPath portInfo = getPortPathForJuceIndex (portTypeToFind, index); - - if (portInfo != null) - { - // ports must be opened exclusively! - if (openPorts.containsKey (portInfo)) - return null; - - Pair devicePair = getMidiDevicePairForId (portInfo.deviceId); - - if (devicePair != null) - { - MidiDevice device = devicePair.first; - if (device != null) - { - JuceMidiPort juceMidiPort = null; - - if (isInput) - { - MidiOutputPort outputPort = device.openOutputPort(portInfo.portIndex); - - if (outputPort != null) - juceMidiPort = new JuceMidiInputPort(this, outputPort, portInfo, host); - } - else - { - MidiInputPort inputPort = device.openInputPort(portInfo.portIndex); - - if (inputPort != null) - juceMidiPort = new JuceMidiOutputPort(this, inputPort, portInfo); - } - - if (juceMidiPort != null) - { - openPorts.put(portInfo, new WeakReference(juceMidiPort)); - - return juceMidiPort; - } - } - } - } - } - - return null; - } - - public JuceMidiPort openMidiInputPortWithJuceIndex (int index, long host) - { - return openMidiPortWithJuceIndex (index, host, true); - } - - public JuceMidiPort openMidiOutputPortWithJuceIndex (int index) - { - return openMidiPortWithJuceIndex (index, 0, false); - } - - /* 0: unpaired, 1: paired, 2: pairing */ - public int getBluetoothDeviceStatus (String address) - { - synchronized (MidiDeviceManager.class) - { - if (! address.isEmpty()) - { - if (findMidiDeviceForBluetoothAddress (address) != null) - return 1; - - if (btDevicesPairing.containsKey (address)) - return 2; - - if (findOpenTaskForBluetoothAddress (address) != null) - return 2; - } - } - - return 0; - } - - public boolean pairBluetoothDevice (BluetoothDevice btDevice) - { - String btAddress = btDevice.getAddress(); - if (btAddress.isEmpty()) - return false; - - synchronized (MidiDeviceManager.class) - { - if (getBluetoothDeviceStatus (btAddress) != 0) - return false; - - - btDevicesPairing.put (btDevice.getAddress(), null); - BluetoothGatt gatt = btDevice.connectGatt (getApplicationContext(), true, new DummyBluetoothGattCallback (this)); - - if (gatt != null) - { - btDevicesPairing.put (btDevice.getAddress(), gatt); - } - else - { - pairBluetoothDeviceStepTwo (btDevice); - } - } - - return true; - } - - public void pairBluetoothDeviceStepTwo (BluetoothDevice btDevice) - { - manager.openBluetoothDevice(btDevice, this, null); - } - - public void unpairBluetoothDevice (String address) - { - if (address.isEmpty()) - return; - - synchronized (MidiDeviceManager.class) - { - if (btDevicesPairing.containsKey (address)) - { - BluetoothGatt gatt = btDevicesPairing.get (address); - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - btDevicesPairing.remove (address); - } - - MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); - if (openTask != null) - { - int deviceID = openTask.getID(); - openTask.cancel(); - openTasks.remove (deviceID); - } - - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (address); - if (midiDevicePair != null) - { - MidiDevice midiDevice = midiDevicePair.first; - onDeviceRemoved (midiDevice.getInfo()); - - try { - midiDevice.close(); - } - catch (IOException exception) - { - Log.d ("JUCE", "IOException while closing midi device"); - } - } - } - } - - private Pair findMidiDeviceForBluetoothAddress (String address) - { - for (Pair midiDevice : midiDevices) - { - MidiDeviceInfo info = midiDevice.first.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null && btDevice.getAddress().equals (address)) - return midiDevice; - } - } - - return null; - } - - private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) - { - for (Integer deviceID : openTasks.keySet()) - { - MidiDeviceOpenTask openTask = openTasks.get (deviceID); - if (openTask.getBluetoothAddress().equals (address)) - return openTask; - } - - return null; - } - - public void removePort (MidiPortPath path) - { - openPorts.remove (path); - } - - public String getInputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_OUTPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public String getOutputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_INPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public void onDeviceAdded (MidiDeviceInfo info) - { - // only add standard midi devices - if (info.getType() == info.TYPE_BLUETOOTH) - return; - - manager.openDevice (info, this, null); - } - - public void onDeviceRemoved (MidiDeviceInfo info) - { - synchronized (MidiDeviceManager.class) - { - Pair devicePair = getMidiDevicePairForId (info.getId()); - - if (devicePair != null) - { - MidiDevice midiDevice = devicePair.first; - BluetoothGatt gatt = devicePair.second; - - // close all ports that use this device - boolean removedPort = true; - - while (removedPort == true) - { - removedPort = false; - for (MidiPortPath key : openPorts.keySet()) - { - if (key.deviceId == info.getId()) - { - openPorts.get(key).get().close(); - removedPort = true; - break; - } - } - } - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - midiDevices.remove (devicePair); - } - } - } - - public void onDeviceStatusChanged (MidiDeviceStatus status) - { - } - - @Override - public void onDeviceOpened (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo info = theDevice.getInfo(); - int deviceID = info.getId(); - BluetoothGatt gatt = null; - boolean isBluetooth = false; - - if (! openTasks.containsKey (deviceID)) - { - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - isBluetooth = true; - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - if (btDevicesPairing.containsKey (btAddress)) - { - gatt = btDevicesPairing.get (btAddress); - btDevicesPairing.remove (btAddress); - } - else - { - // unpair was called in the mean time - try - { - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - - theDevice.close(); - } - catch (IOException e) - {} - - return; - } - } - } - - MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice, gatt); - openTasks.put (deviceID, openTask); - - new java.util.Timer().schedule (openTask, (isBluetooth ? 2000 : 100)); - } - } - } - - public void onDeviceOpenedDelayed (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - int deviceID = theDevice.getInfo().getId(); - - if (openTasks.containsKey (deviceID)) - { - if (! midiDevices.contains(theDevice)) - { - BluetoothGatt gatt = openTasks.get (deviceID).getGatt(); - openTasks.remove (deviceID); - midiDevices.add (new Pair (theDevice, gatt)); - } - } - else - { - // unpair was called in the mean time - MidiDeviceInfo info = theDevice.getInfo(); - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - BluetoothGatt gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - } - - try - { - theDevice.close(); - } - catch (IOException e) - {} - } - } - } - - public String getPortName(MidiPortPath path) - { - int portTypeToFind = (path.isInput ? MidiDeviceInfo.PortInfo.TYPE_INPUT : MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - - synchronized (MidiDeviceManager.class) - { - for (MidiDeviceInfo info : deviceInfos) - { - int localIndex = 0; - if (info.getId() == path.deviceId) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - int portType = portInfo.getType(); - if (portType == portTypeToFind) - { - int portIndex = portInfo.getPortNumber(); - if (portIndex == path.portIndex) - { - String portName = portInfo.getName(); - if (portName.isEmpty()) - portName = (String) info.getProperties().get(info.PROPERTY_NAME); - - return portName; - } - } - } - } - } - } - - return ""; - } - - public MidiPortPath getPortPathForJuceIndex (int portType, int juceIndex) - { - int portIdx = 0; - for (MidiDeviceInfo info : deviceInfos) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - if (portInfo.getType() == portType) - { - if (portIdx == juceIndex) - return new MidiPortPath (info.getId(), - (portType == MidiDeviceInfo.PortInfo.TYPE_INPUT), - portInfo.getPortNumber()); - - portIdx++; - } - } - } - - return null; - } - - private MidiDeviceInfo[] getDeviceInfos() - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo[] infos = new MidiDeviceInfo[midiDevices.size()]; - - int idx = 0; - for (Pair midiDevice : midiDevices) - infos[idx++] = midiDevice.first.getInfo(); - - return infos; - } - } - - private Pair getMidiDevicePairForId (int deviceId) - { - synchronized (MidiDeviceManager.class) - { - for (Pair midiDevice : midiDevices) - if (midiDevice.first.getInfo().getId() == deviceId) - return midiDevice; - } - - return null; - } - - private MidiManager manager; - private HashMap btDevicesPairing; - private HashMap openTasks; - private ArrayList> midiDevices; - private MidiDeviceInfo[] deviceInfos; - private HashMap> openPorts; - } - - public MidiDeviceManager getAndroidMidiDeviceManager() - { - if (getSystemService (MIDI_SERVICE) == null) - return null; - - synchronized (DemoRunner.class) - { - if (midiDeviceManager == null) - midiDeviceManager = new MidiDeviceManager(); - } - - return midiDeviceManager; - } - - public BluetoothManager getAndroidBluetoothManager() - { - BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - - if (adapter == null) - return null; - - if (adapter.getBluetoothLeScanner() == null) - return null; - - synchronized (DemoRunner.class) - { - if (bluetoothManager == null) - bluetoothManager = new BluetoothManager(); - } - - return bluetoothManager; - } - - //============================================================================== - @Override - public void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - isScreenSaverEnabled = true; - hideActionBar(); - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - - setVolumeControlStream (AudioManager.STREAM_MUSIC); - - permissionCallbackPtrMap = new HashMap(); - appPausedResumedListeners = new HashMap(); - } - - @Override - protected void onDestroy() - { - quitApp(); - super.onDestroy(); - - clearDataCache(); - } - - @Override - protected void onPause() - { - suspendApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appPaused(); - - try - { - Thread.sleep (1000); // This is a bit of a hack to avoid some hard-to-track-down - // openGL glitches when pausing/resuming apps.. - } catch (InterruptedException e) {} - - super.onPause(); - } - - @Override - protected void onResume() - { - super.onResume(); - resumeApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appResumed(); - } - - @Override - public void onConfigurationChanged (Configuration cfg) - { - super.onConfigurationChanged (cfg); - setContentView (viewHolder); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - // Need to override this as the default implementation always finishes the activity. - @Override - public void onBackPressed() - { - ComponentPeerView focusedView = getViewWithFocusOrDefaultView(); - - if (focusedView == null) - return; - - focusedView.backButtonPressed(); - } - - private ComponentPeerView getViewWithFocusOrDefaultView() - { - for (int i = 0; i < viewHolder.getChildCount(); ++i) - { - if (viewHolder.getChildAt (i).hasFocus()) - return (ComponentPeerView) viewHolder.getChildAt (i); - } - - if (viewHolder.getChildCount() > 0) - return (ComponentPeerView) viewHolder.getChildAt (0); - - return null; - } - - //============================================================================== - private void hideActionBar() - { - // get "getActionBar" method - java.lang.reflect.Method getActionBarMethod = null; - try - { - getActionBarMethod = this.getClass().getMethod ("getActionBar"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (getActionBarMethod == null) return; - - // invoke "getActionBar" method - Object actionBar = null; - try - { - actionBar = getActionBarMethod.invoke (this); - } - catch (java.lang.IllegalArgumentException e) { return; } - catch (java.lang.IllegalAccessException e) { return; } - catch (java.lang.reflect.InvocationTargetException e) { return; } - if (actionBar == null) return; - - // get "hide" method - java.lang.reflect.Method actionBarHideMethod = null; - try - { - actionBarHideMethod = actionBar.getClass().getMethod ("hide"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (actionBarHideMethod == null) return; - - // invoke "hide" method - try - { - actionBarHideMethod.invoke (actionBar); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - void requestPermissionsCompat (String[] permissions, int requestCode) - { - Method requestPermissionsMethod = null; - try - { - requestPermissionsMethod = this.getClass().getMethod ("requestPermissions", - String[].class, int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (requestPermissionsMethod == null) return; - - try - { - requestPermissionsMethod.invoke (this, permissions, requestCode); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void suspendApp(); - private native void resumeApp(); - private native void setScreenSize (int screenWidth, int screenHeight, int dpi); - private native void appActivityResult (int requestCode, int resultCode, Intent data); - private native void appNewIntent (Intent intent); - - //============================================================================== - private ViewHolder viewHolder; - private MidiDeviceManager midiDeviceManager = null; - private BluetoothManager bluetoothManager = null; - private boolean isScreenSaverEnabled; - private java.util.Timer keepAliveTimer; - - public final ComponentPeerView createNewView (boolean opaque, long host) - { - ComponentPeerView v = new ComponentPeerView (this, opaque, host); - viewHolder.addView (v); - addAppPausedResumedListener (v, host); - return v; - } - - public final void deleteView (ComponentPeerView view) - { - removeAppPausedResumedListener (view, view.host); - - view.host = 0; - - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - public final void deleteNativeSurfaceView (NativeSurfaceView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - final class ViewHolder extends ViewGroup - { - public ViewHolder (Context context) - { - super (context); - setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); - setFocusable (false); - } - - protected final void onLayout (boolean changed, int left, int top, int right, int bottom) - { - setScreenSize (getWidth(), getHeight(), getDPI()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - private final int getDPI() - { - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics (metrics); - return metrics.densityDpi; - } - - private boolean isFirstResize = true; - } - - public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom) - { - canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE); - } - - //============================================================================== - public final void setScreenSaver (boolean enabled) - { - if (isScreenSaverEnabled != enabled) - { - isScreenSaverEnabled = enabled; - - if (keepAliveTimer != null) - { - keepAliveTimer.cancel(); - keepAliveTimer = null; - } - - if (enabled) - { - getWindow().clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } - else - { - getWindow().addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - - // If no user input is received after about 3 seconds, the OS will lower the - // task's priority, so this timer forces it to be kept active. - keepAliveTimer = new java.util.Timer(); - - keepAliveTimer.scheduleAtFixedRate (new TimerTask() - { - @Override - public void run() - { - android.app.Instrumentation instrumentation = new android.app.Instrumentation(); - - try - { - instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_UNKNOWN); - } - catch (Exception e) - { - } - } - }, 2000, 2000); - } - } - } - - public final boolean getScreenSaver() - { - return isScreenSaverEnabled; - } - - //============================================================================== - public final String getClipboardContent() - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - return clipboard.getText().toString(); - } - - public final void setClipboardContent (String newText) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - clipboard.setText (newText); - } - - //============================================================================== - public final void showMessageBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showOkCancelBox (String title, String message, final long callback, - String okButtonText, String cancelButtonText) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton (okButtonText.isEmpty() ? "OK" : okButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton (cancelButtonText.isEmpty() ? "Cancel" : cancelButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showYesNoCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - DemoRunner.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("Yes", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("No", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 2); - } - }) - .setNeutralButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - DemoRunner.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public native void alertDismissed (long callback, int id); - - //============================================================================== - public interface AppPausedResumedListener - { - void appPaused(); - void appResumed(); - } - - private Map appPausedResumedListeners; - - public void addAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.put (new Long (listenerHost), l); - } - - public void removeAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.remove (new Long (listenerHost)); - } - - //============================================================================== - public final class ComponentPeerView extends ViewGroup - implements View.OnFocusChangeListener, AppPausedResumedListener - { - public ComponentPeerView (Context context, boolean opaque_, long host) - { - super (context); - this.host = host; - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - - // swap red and blue colours to match internal opengl texture format - ColorMatrix colorMatrix = new ColorMatrix(); - - float[] colorTransform = { 0, 0, 1.0f, 0, 0, - 0, 1.0f, 0, 0, 0, - 1.0f, 0, 0, 0, 0, - 0, 0, 0, 1.0f, 0 }; - - colorMatrix.set (colorTransform); - paint.setColorFilter (new ColorMatrixColorFilter (colorMatrix)); - - java.lang.reflect.Method method = null; - - try - { - method = getClass().getMethod ("setLayerType", int.class, Paint.class); - } - catch (SecurityException e) {} - catch (NoSuchMethodException e) {} - - if (method != null) - { - try - { - int layerTypeNone = 0; - method.invoke (this, layerTypeNone, null); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - } - - //============================================================================== - private native void handlePaint (long host, Canvas canvas, Paint paint); - - @Override - public void onDraw (Canvas canvas) - { - if (host == 0) - return; - - handlePaint (host, canvas, paint); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - private long host; - private Paint paint = new Paint(); - - //============================================================================== - private native void handleMouseDown (long host, int index, float x, float y, long time); - private native void handleMouseDrag (long host, int index, float x, float y, long time); - private native void handleMouseUp (long host, int index, float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - if (host == 0) - return false; - - int action = event.getAction(); - long time = event.getEventTime(); - - switch (action & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - handleMouseDown (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - handleMouseUp (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_MOVE: - { - int n = event.getPointerCount(); - for (int i = 0; i < n; ++i) - handleMouseDrag (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - - return true; - } - - case MotionEvent.ACTION_POINTER_UP: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseUp (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - case MotionEvent.ACTION_POINTER_DOWN: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseDown (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - default: - break; - } - - return false; - } - - //============================================================================== - private native void handleKeyDown (long host, int keycode, int textchar); - private native void handleKeyUp (long host, int keycode, int textchar); - private native void handleBackButton (long host); - private native void handleKeyboardHidden (long host); - - public void showKeyboard (String type) - { - InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) - { - if (type.length() > 0) - { - imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT); - imm.setInputMethod (getWindowToken(), type); - keyboardDismissListener.startListening(); - } - else - { - imm.hideSoftInputFromWindow (getWindowToken(), 0); - keyboardDismissListener.stopListening(); - } - } - } - - public void backButtonPressed() - { - if (host == 0) - return; - - handleBackButton (host); - } - - @Override - public boolean onKeyDown (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - switch (keyCode) - { - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_DOWN: - return super.onKeyDown (keyCode, event); - case KeyEvent.KEYCODE_BACK: - { - ((Activity) getContext()).onBackPressed(); - return true; - } - - default: - break; - } - - handleKeyDown (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyUp (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - handleKeyUp (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) - { - if (host == 0) - return false; - - if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction() != KeyEvent.ACTION_MULTIPLE) - return super.onKeyMultiple (keyCode, count, event); - - if (event.getCharacters() != null) - { - int utf8Char = event.getCharacters().codePointAt (0); - handleKeyDown (host, utf8Char, utf8Char); - return true; - } - - return false; - } - - //============================================================================== - private final class KeyboardDismissListener - { - public KeyboardDismissListener (ComponentPeerView viewToUse) - { - view = viewToUse; - } - - private void startListening() - { - view.getViewTreeObserver().addOnGlobalLayoutListener(viewTreeObserver); - } - - private void stopListening() - { - view.getViewTreeObserver().removeGlobalOnLayoutListener(viewTreeObserver); - } - - private class TreeObserver implements ViewTreeObserver.OnGlobalLayoutListener - { - TreeObserver() - { - keyboardShown = false; - } - - @Override - public void onGlobalLayout() - { - Rect r = new Rect(); - - ViewGroup parentView = (ViewGroup) getParent(); - - if (parentView == null) - return; - - parentView.getWindowVisibleDisplayFrame (r); - - int diff = parentView.getHeight() - (r.bottom - r.top); - - // Arbitrary threshold, surely keyboard would take more than 20 pix. - if (diff < 20 && keyboardShown) - { - keyboardShown = false; - handleKeyboardHidden (view.host); - } - - if (! keyboardShown && diff > 20) - keyboardShown = true; - }; - - private boolean keyboardShown; - }; - - private ComponentPeerView view; - private TreeObserver viewTreeObserver = new TreeObserver(); - } - - private KeyboardDismissListener keyboardDismissListener = new KeyboardDismissListener(this); - - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 - @Override - public InputConnection onCreateInputConnection (EditorInfo outAttrs) - { - outAttrs.actionLabel = ""; - outAttrs.hintText = ""; - outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; - outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - if (host == 0) - return; - - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged (host); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - for (int i = getChildCount(); --i >= 0;) - requestTransparentRegion (getChildAt (i)); - } - - private native void viewSizeChanged (long host); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (host == 0) - return; - - if (v == this) - focusChanged (host, hasFocus); - } - - private native void focusChanged (long host, boolean hasFocus); - - public void setViewName (String newName) {} - - public void setSystemUiVisibilityCompat (int visibility) - { - Method systemUIVisibilityMethod = null; - try - { - systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (systemUIVisibilityMethod == null) return; - - try - { - systemUIVisibilityMethod.invoke (this, visibility); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - public boolean isVisible() { return getVisibility() == VISIBLE; } - public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); } - - public boolean containsPoint (int x, int y) - { - return true; //xxx needs to check overlapping views - } - - //============================================================================== - private native void handleAppPaused (long host); - private native void handleAppResumed (long host); - - @Override - public void appPaused() - { - if (host == 0) - return; - - handleAppPaused (host); - } - - @Override - public void appResumed() - { - if (host == 0) - return; - - // Ensure that navigation/status bar visibility is correctly restored. - handleAppResumed (host); - } - } - - //============================================================================== - public static class NativeSurfaceView extends SurfaceView - implements SurfaceHolder.Callback - { - private long nativeContext = 0; - - NativeSurfaceView (Context context, long nativeContextPtr) - { - super (context); - nativeContext = nativeContextPtr; - } - - public Surface getNativeSurface() - { - Surface retval = null; - - SurfaceHolder holder = getHolder(); - if (holder != null) - retval = holder.getSurface(); - - return retval; - } - - //============================================================================== - @Override - public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) - { - surfaceChangedNative (nativeContext, holder, format, width, height); - } - - @Override - public void surfaceCreated (SurfaceHolder holder) - { - surfaceCreatedNative (nativeContext, holder); - } - - @Override - public void surfaceDestroyed (SurfaceHolder holder) - { - surfaceDestroyedNative (nativeContext, holder); - } - - @Override - protected void dispatchDraw (Canvas canvas) - { - super.dispatchDraw (canvas); - dispatchDrawNative (nativeContext, canvas); - } - - //============================================================================== - @Override - protected void onAttachedToWindow () - { - super.onAttachedToWindow(); - getHolder().addCallback (this); - } - - @Override - protected void onDetachedFromWindow () - { - super.onDetachedFromWindow(); - getHolder().removeCallback (this); - } - - //============================================================================== - private native void dispatchDrawNative (long nativeContextPtr, Canvas canvas); - private native void surfaceCreatedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder, - int format, int width, int height); - } - - public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr) - { - return new NativeSurfaceView (this, nativeSurfacePtr); - } - - //============================================================================== - public final int[] renderGlyph (char glyph1, char glyph2, Paint paint, android.graphics.Matrix matrix, Rect bounds) - { - Path p = new Path(); - - char[] str = { glyph1, glyph2 }; - paint.getTextPath (str, 0, (glyph2 != 0 ? 2 : 1), 0.0f, 0.0f, p); - - RectF boundsF = new RectF(); - p.computeBounds (boundsF, true); - matrix.mapRect (boundsF); - - boundsF.roundOut (bounds); - bounds.left--; - bounds.right++; - - final int w = bounds.width(); - final int h = Math.max (1, bounds.height()); - - Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); - - Canvas c = new Canvas (bm); - matrix.postTranslate (-bounds.left, -bounds.top); - c.setMatrix (matrix); - c.drawPath (p, paint); - - final int sizeNeeded = w * h; - if (cachedRenderArray.length < sizeNeeded) - cachedRenderArray = new int [sizeNeeded]; - - bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h); - bm.recycle(); - return cachedRenderArray; - } - - private int[] cachedRenderArray = new int [256]; - - //============================================================================== - public static class NativeInvocationHandler implements InvocationHandler - { - public NativeInvocationHandler (Activity activityToUse, long nativeContextRef) - { - activity = activityToUse; - nativeContext = nativeContextRef; - } - - public void nativeContextDeleted() - { - nativeContext = 0; - } - - @Override - public void finalize() - { - activity.runOnUiThread (new Runnable() - { - @Override - public void run() - { - if (nativeContext != 0) - dispatchFinalize (nativeContext); - } - }); - } - - @Override - public Object invoke (Object proxy, Method method, Object[] args) throws Throwable - { - return dispatchInvoke (nativeContext, proxy, method, args); - } - - //============================================================================== - Activity activity; - private long nativeContext = 0; - - private native void dispatchFinalize (long nativeContextRef); - private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args); - } - - public InvocationHandler createInvocationHandler (long nativeContextRef) - { - return new NativeInvocationHandler (this, nativeContextRef); - } - - public void invocationHandlerContextDeleted (InvocationHandler handler) - { - ((NativeInvocationHandler) handler).nativeContextDeleted(); - } - - //============================================================================== - public static class HTTPStream - { - public HTTPStream (String address, boolean isPostToUse, byte[] postDataToUse, - String headersToUse, int timeOutMsToUse, - int[] statusCodeToUse, StringBuffer responseHeadersToUse, - int numRedirectsToFollowToUse, String httpRequestCmdToUse) throws IOException - { - isPost = isPostToUse; - postData = postDataToUse; - headers = headersToUse; - timeOutMs = timeOutMsToUse; - statusCode = statusCodeToUse; - responseHeaders = responseHeadersToUse; - totalLength = -1; - numRedirectsToFollow = numRedirectsToFollowToUse; - httpRequestCmd = httpRequestCmdToUse; - - connection = createConnection (address, isPost, postData, headers, timeOutMs, httpRequestCmd); - } - - private final HttpURLConnection createConnection (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, String httpRequestCmdToUse) throws IOException - { - HttpURLConnection newConnection = (HttpURLConnection) (new URL(address).openConnection()); - - try - { - newConnection.setInstanceFollowRedirects (false); - newConnection.setConnectTimeout (timeOutMs); - newConnection.setReadTimeout (timeOutMs); - - // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines. - // So convert headers string to an array, with an element for each line - String headerLines[] = headers.split("\\n"); - - // Set request headers - for (int i = 0; i < headerLines.length; ++i) - { - int pos = headerLines[i].indexOf (":"); - - if (pos > 0 && pos < headerLines[i].length()) - { - String field = headerLines[i].substring (0, pos); - String value = headerLines[i].substring (pos + 1); - - if (value.length() > 0) - newConnection.setRequestProperty (field, value); - } - } - - newConnection.setRequestMethod (httpRequestCmd); - - if (isPost) - { - newConnection.setDoOutput (true); - - if (postData != null) - { - OutputStream out = newConnection.getOutputStream(); - out.write(postData); - out.flush(); - } - } - - return newConnection; - } - catch (Throwable e) - { - newConnection.disconnect(); - throw new IOException ("Connection error"); - } - } - - private final InputStream getCancellableStream (final boolean isInput) throws ExecutionException - { - synchronized (createFutureLock) - { - if (hasBeenCancelled.get()) - return null; - - streamFuture = executor.submit (new Callable() - { - @Override - public BufferedInputStream call() throws IOException - { - return new BufferedInputStream (isInput ? connection.getInputStream() - : connection.getErrorStream()); - } - }); - } - - try - { - return streamFuture.get(); - } - catch (InterruptedException e) - { - return null; - } - catch (CancellationException e) - { - return null; - } - } - - public final boolean connect() - { - boolean result = false; - int numFollowedRedirects = 0; - - while (true) - { - result = doConnect(); - - if (! result) - return false; - - if (++numFollowedRedirects > numRedirectsToFollow) - break; - - int status = statusCode[0]; - - if (status == 301 || status == 302 || status == 303 || status == 307) - { - // Assumes only one occurrence of "Location" - int pos1 = responseHeaders.indexOf ("Location:") + 10; - int pos2 = responseHeaders.indexOf ("\n", pos1); - - if (pos2 > pos1) - { - String currentLocation = connection.getURL().toString(); - String newLocation = responseHeaders.substring (pos1, pos2); - - try - { - // Handle newLocation whether it's absolute or relative - URL baseUrl = new URL (currentLocation); - URL newUrl = new URL (baseUrl, newLocation); - String transformedNewLocation = newUrl.toString(); - - if (transformedNewLocation != currentLocation) - { - // Clear responseHeaders before next iteration - responseHeaders.delete (0, responseHeaders.length()); - - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - connection.disconnect(); - - try - { - connection = createConnection (transformedNewLocation, isPost, - postData, headers, timeOutMs, - httpRequestCmd); - } - catch (Throwable e) - { - return false; - } - } - } - else - { - break; - } - } - catch (Throwable e) - { - return false; - } - } - else - { - break; - } - } - else - { - break; - } - } - - return result; - } - - private final boolean doConnect() - { - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - try - { - try - { - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - { - if (connection.getResponseCode() < 400) - { - statusCode[0] = connection.getResponseCode(); - connection.disconnect(); - return false; - } - } - finally - { - statusCode[0] = connection.getResponseCode(); - } - - try - { - if (statusCode[0] >= 400) - inputStream = getCancellableStream (false); - else - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - {} - - for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) - { - if (entry.getKey() != null && entry.getValue() != null) - { - responseHeaders.append(entry.getKey() + ": " - + android.text.TextUtils.join(",", entry.getValue()) + "\n"); - - if (entry.getKey().compareTo ("Content-Length") == 0) - totalLength = Integer.decode (entry.getValue().get (0)); - } - } - - return true; - } - catch (IOException e) - { - return false; - } - } - } - - static class DisconnectionRunnable implements Runnable - { - public DisconnectionRunnable (HttpURLConnection theConnection, - InputStream theInputStream, - ReentrantLock theCreateStreamLock, - Object theCreateFutureLock, - Future theStreamFuture) - { - connectionToDisconnect = theConnection; - inputStream = theInputStream; - createStreamLock = theCreateStreamLock; - createFutureLock = theCreateFutureLock; - streamFuture = theStreamFuture; - } - - public void run() - { - try - { - if (! createStreamLock.tryLock()) - { - synchronized (createFutureLock) - { - if (streamFuture != null) - streamFuture.cancel (true); - } - - createStreamLock.lock(); - } - - if (connectionToDisconnect != null) - connectionToDisconnect.disconnect(); - - if (inputStream != null) - inputStream.close(); - } - catch (IOException e) - {} - finally - { - createStreamLock.unlock(); - } - } - - private HttpURLConnection connectionToDisconnect; - private InputStream inputStream; - private ReentrantLock createStreamLock; - private Object createFutureLock; - Future streamFuture; - } - - public final void release() - { - DisconnectionRunnable disconnectionRunnable = new DisconnectionRunnable (connection, - inputStream, - createStreamLock, - createFutureLock, - streamFuture); - - synchronized (createStreamLock) - { - hasBeenCancelled.set (true); - - connection = null; - } - - Thread disconnectionThread = new Thread(disconnectionRunnable); - disconnectionThread.start(); - } - - public final int read (byte[] buffer, int numBytes) - { - int num = 0; - - try - { - synchronized (createStreamLock) - { - if (inputStream != null) - num = inputStream.read (buffer, 0, numBytes); - } - } - catch (IOException e) - {} - - if (num > 0) - position += num; - - return num; - } - - public final long getPosition() { return position; } - public final long getTotalLength() { return totalLength; } - public final boolean isExhausted() { return false; } - public final boolean setPosition (long newPos) { return false; } - - private boolean isPost; - private byte[] postData; - private String headers; - private int timeOutMs; - String httpRequestCmd; - private HttpURLConnection connection; - private int[] statusCode; - private StringBuffer responseHeaders; - private int totalLength; - private int numRedirectsToFollow; - private InputStream inputStream; - private long position; - private final ReentrantLock createStreamLock = new ReentrantLock(); - private final Object createFutureLock = new Object(); - private AtomicBoolean hasBeenCancelled = new AtomicBoolean(); - - private final ExecutorService executor = Executors.newCachedThreadPool (Executors.defaultThreadFactory()); - Future streamFuture; - } - - public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, int[] statusCode, - StringBuffer responseHeaders, int numRedirectsToFollow, - String httpRequestCmd) - { - // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL) - if (timeOutMs < 0) - timeOutMs = 0; - else if (timeOutMs == 0) - timeOutMs = 30000; - - for (;;) - { - try - { - HTTPStream httpStream = new HTTPStream (address, isPost, postData, headers, - timeOutMs, statusCode, responseHeaders, - numRedirectsToFollow, httpRequestCmd); - - return httpStream; - } - catch (Throwable e) {} - - return null; - } - } - - public final void launchURL (String url) - { - startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url))); - } - - private native boolean webViewPageLoadStarted (long host, WebView view, String url); - private native void webViewPageLoadFinished (long host, WebView view, String url); - private native void webViewReceivedError (long host, WebView view, WebResourceRequest request, WebResourceError error); private native void webViewReceivedHttpError (long host, WebView view, WebResourceRequest request, WebResourceResponse errorResponse); private native void webViewReceivedSslError (long host, WebView view, SslErrorHandler handler, SslError error); - private native void webViewCloseWindowRequest (long host, WebView view); - private native void webViewCreateWindowRequest (long host, WebView view); - - //============================================================================== - public class JuceWebViewClient extends WebViewClient - { - public JuceWebViewClient (long hostToUse) - { - host = hostToUse; - } - - public void hostDeleted() - { - synchronized (hostLock) - { - host = 0; - } - } - - @Override - public void onPageFinished (WebView view, String url) - { - if (host == 0) - return; - - webViewPageLoadFinished (host, view, url); - } - - @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) - { - if (host == 0) - return; - - webViewReceivedSslError (host, view, handler, error); - } - - @Override - public void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error) - { - if (host == 0) - return; - - webViewReceivedError (host, view, request, error); - } - - @Override - public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) - { - if (host == 0) - return; - - webViewReceivedHttpError (host, view, request, errorResponse); - } - - @Override - public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) - { - synchronized (hostLock) - { - if (host != 0) - { - boolean shouldLoad = webViewPageLoadStarted (host, view, request.getUrl().toString()); - - if (shouldLoad) - return null; - } - } - - return new WebResourceResponse ("text/html", null, null); - } - - private long host; - private final Object hostLock = new Object(); - } - - public class JuceWebChromeClient extends WebChromeClient - { - public JuceWebChromeClient (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onCloseWindow (WebView window) - { - webViewCloseWindowRequest (host, window); - } - - @Override - public boolean onCreateWindow (WebView view, boolean isDialog, - boolean isUserGesture, Message resultMsg) - { - webViewCreateWindowRequest (host, view); - return false; - } - - private long host; - private final Object hostLock = new Object(); - } - - - //============================================================================== - public class CameraDeviceStateCallback extends CameraDevice.StateCallback - { - private native void cameraDeviceStateClosed (long host, CameraDevice camera); - private native void cameraDeviceStateDisconnected (long host, CameraDevice camera); - private native void cameraDeviceStateError (long host, CameraDevice camera, int error); - private native void cameraDeviceStateOpened (long host, CameraDevice camera); - - CameraDeviceStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onClosed (CameraDevice camera) - { - cameraDeviceStateClosed (host, camera); - } - - @Override - public void onDisconnected (CameraDevice camera) - { - cameraDeviceStateDisconnected (host, camera); - } - - @Override - public void onError (CameraDevice camera, int error) - { - cameraDeviceStateError (host, camera, error); - } - - @Override - public void onOpened (CameraDevice camera) - { - cameraDeviceStateOpened (host, camera); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback - { - private native void cameraCaptureSessionActive (long host, CameraCaptureSession session); - private native void cameraCaptureSessionClosed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigureFailed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigured (long host, CameraCaptureSession session); - private native void cameraCaptureSessionReady (long host, CameraCaptureSession session); - - CameraCaptureSessionStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onActive (CameraCaptureSession session) - { - cameraCaptureSessionActive (host, session); - } - - @Override - public void onClosed (CameraCaptureSession session) - { - cameraCaptureSessionClosed (host, session); - } - - @Override - public void onConfigureFailed (CameraCaptureSession session) - { - cameraCaptureSessionConfigureFailed (host, session); - } - - @Override - public void onConfigured (CameraCaptureSession session) - { - cameraCaptureSessionConfigured (host, session); - } - - @Override - public void onReady (CameraCaptureSession session) - { - cameraCaptureSessionReady (host, session); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionCaptureCallback extends CameraCaptureSession.CaptureCallback - { - private native void cameraCaptureSessionCaptureCompleted (long host, boolean isPreview, CameraCaptureSession session, - CaptureRequest request, TotalCaptureResult result); - private native void cameraCaptureSessionCaptureFailed (long host, boolean isPreview, CameraCaptureSession session, - CaptureRequest request, CaptureFailure failure); - private native void cameraCaptureSessionCaptureProgressed (long host, boolean isPreview, CameraCaptureSession session, - CaptureRequest request, CaptureResult partialResult); - private native void cameraCaptureSessionCaptureSequenceAborted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId); - private native void cameraCaptureSessionCaptureSequenceCompleted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId, long frameNumber); - private native void cameraCaptureSessionCaptureStarted (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, - long timestamp, long frameNumber); - - CameraCaptureSessionCaptureCallback (long hostToUse, boolean shouldBePreview) - { - host = hostToUse; - preview = shouldBePreview; - } - - @Override - public void onCaptureCompleted (CameraCaptureSession session, CaptureRequest request, - TotalCaptureResult result) - { - cameraCaptureSessionCaptureCompleted (host, preview, session, request, result); - } - - @Override - public void onCaptureFailed (CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) - { - cameraCaptureSessionCaptureFailed (host, preview, session, request, failure); - } - - @Override - public void onCaptureProgressed (CameraCaptureSession session, CaptureRequest request, - CaptureResult partialResult) - { - cameraCaptureSessionCaptureProgressed (host, preview, session, request, partialResult); - } - - @Override - public void onCaptureSequenceAborted (CameraCaptureSession session, int sequenceId) - { - cameraCaptureSessionCaptureSequenceAborted (host, preview, session, sequenceId); - } - - @Override - public void onCaptureSequenceCompleted (CameraCaptureSession session, int sequenceId, long frameNumber) - { - cameraCaptureSessionCaptureSequenceCompleted (host, preview, session, sequenceId, frameNumber); - } - - @Override - public void onCaptureStarted (CameraCaptureSession session, CaptureRequest request, long timestamp, - long frameNumber) - { - cameraCaptureSessionCaptureStarted (host, preview, session, request, timestamp, frameNumber); - } - - private long host; - private boolean preview; - } - - //============================================================================== - public class JuceOrientationEventListener extends OrientationEventListener - { - private native void deviceOrientationChanged (long host, int orientation); - - public JuceOrientationEventListener (long hostToUse, Context context, int rate) - { - super (context, rate); - - host = hostToUse; - } - - @Override - public void onOrientationChanged (int orientation) - { - deviceOrientationChanged (host, orientation); - } - - private long host; - } - - - //============================================================================== - public static final String getLocaleValue (boolean isRegion) - { - java.util.Locale locale = java.util.Locale.getDefault(); - - return isRegion ? locale.getCountry() - : locale.getLanguage(); - } - - private static final String getFileLocation (String type) - { - return Environment.getExternalStoragePublicDirectory (type).getAbsolutePath(); - } - - public static final String getDocumentsFolder() - { - if (getAndroidSDKVersion() >= 19) - return getFileLocation ("Documents"); - - return Environment.getDataDirectory().getAbsolutePath(); - } - - public static final String getPicturesFolder() { return getFileLocation (Environment.DIRECTORY_PICTURES); } - public static final String getMusicFolder() { return getFileLocation (Environment.DIRECTORY_MUSIC); } - public static final String getMoviesFolder() { return getFileLocation (Environment.DIRECTORY_MOVIES); } - public static final String getDownloadsFolder() { return getFileLocation (Environment.DIRECTORY_DOWNLOADS); } - - //============================================================================== - @Override - protected void onActivityResult (int requestCode, int resultCode, Intent data) - { - appActivityResult (requestCode, resultCode, data); - } - - @Override - protected void onNewIntent (Intent intent) - { - super.onNewIntent(intent); - setIntent(intent); - - appNewIntent (intent); - } - - //============================================================================== - public final Typeface getTypeFaceFromAsset (String assetName) - { - try - { - return Typeface.createFromAsset (this.getResources().getAssets(), assetName); - } - catch (Throwable e) {} - - return null; - } - - final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); - - public static String bytesToHex (byte[] bytes) - { - char[] hexChars = new char[bytes.length * 2]; - - for (int j = 0; j < bytes.length; ++j) - { - int v = bytes[j] & 0xff; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0f]; - } - - return new String (hexChars); - } - - final private java.util.Map dataCache = new java.util.HashMap(); - - synchronized private final File getDataCacheFile (byte[] data) - { - try - { - java.security.MessageDigest digest = java.security.MessageDigest.getInstance ("MD5"); - digest.update (data); - - String key = bytesToHex (digest.digest()); - - if (dataCache.containsKey (key)) - return (File) dataCache.get (key); - - File f = new File (this.getCacheDir(), "bindata_" + key); - f.delete(); - FileOutputStream os = new FileOutputStream (f); - os.write (data, 0, data.length); - dataCache.put (key, f); - return f; - } - catch (Throwable e) {} - - return null; - } - - private final void clearDataCache() - { - java.util.Iterator it = dataCache.values().iterator(); - - while (it.hasNext()) - { - File f = (File) it.next(); - f.delete(); - } - } - - public final Typeface getTypeFaceFromByteArray (byte[] data) - { - try - { - File f = getDataCacheFile (data); - - if (f != null) - return Typeface.createFromFile (f); - } - catch (Exception e) - { - Log.e ("JUCE", e.toString()); - } - - return null; - } - - public static final int getAndroidSDKVersion() - { - return android.os.Build.VERSION.SDK_INT; - } - - public final String audioManagerGetProperty (String property) - { - Object obj = getSystemService (AUDIO_SERVICE); - if (obj == null) - return null; - - java.lang.reflect.Method method; - - try - { - method = obj.getClass().getMethod ("getProperty", String.class); - } - catch (SecurityException e) { return null; } - catch (NoSuchMethodException e) { return null; } - - if (method == null) - return null; - - try - { - return (String) method.invoke (obj, property); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - - return null; - } - - public final boolean hasSystemFeature (String property) - { - return getPackageManager().hasSystemFeature (property); - } -} diff --git a/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/SharingContentProvider.java b/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/SharingContentProvider.java deleted file mode 100644 index e9aaa0f785..0000000000 --- a/examples/DemoRunner/Builds/Android/app/src/main/java/com/roli/juce/demorunner/SharingContentProvider.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.roli.juce.demorunner; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.res.AssetFileDescriptor; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.net.Uri; -import android.os.FileObserver; -import android.os.ParcelFileDescriptor; -import java.lang.String; - -public final class SharingContentProvider extends ContentProvider -{ - private Object lock = new Object(); - - private native void contentSharerFileObserverEvent (long host, int event, String path); - - private native Cursor contentSharerQuery (Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder); - - private native void contentSharerCursorClosed (long host); - - private native AssetFileDescriptor contentSharerOpenFile (Uri uri, String mode); - private native String[] contentSharerGetStreamTypes (Uri uri, String mimeTypeFilter); - - public final class ProviderFileObserver extends FileObserver - { - public ProviderFileObserver (long hostToUse, String path, int mask) - { - super (path, mask); - - host = hostToUse; - } - - public void onEvent (int event, String path) - { - contentSharerFileObserverEvent (host, event, path); - } - - private long host; - } - - public final class ProviderCursor extends MatrixCursor - { - ProviderCursor (long hostToUse, String[] columnNames) - { - super (columnNames); - - host = hostToUse; - } - - @Override - public void close() - { - super.close(); - - contentSharerCursorClosed (host); - } - - private long host; - } - - @Override - public boolean onCreate() - { - return true; - } - - @Override - public Cursor query (Uri url, String[] projection, String selection, - String[] selectionArgs, String sortOrder) - { - synchronized (lock) - { - return contentSharerQuery (url, projection, selection, selectionArgs, sortOrder); - } - } - - @Override - public Uri insert (Uri uri, ContentValues values) - { - return null; - } - - @Override - public int update (Uri uri, ContentValues values, String selection, - String[] selectionArgs) - { - return 0; - } - - @Override - public int delete (Uri uri, String selection, String[] selectionArgs) - { - return 0; - } - - @Override - public String getType (Uri uri) - { - return null; - } - - @Override - public AssetFileDescriptor openAssetFile (Uri uri, String mode) - { - synchronized (lock) - { - return contentSharerOpenFile (uri, mode); - } - } - - @Override - public ParcelFileDescriptor openFile (Uri uri, String mode) - { - synchronized (lock) - { - AssetFileDescriptor result = contentSharerOpenFile (uri, mode); - - if (result != null) - return result.getParcelFileDescriptor(); - - return null; - } - } - - @Override - public String[] getStreamTypes (Uri uri, String mimeTypeFilter) - { - synchronized (lock) - { - return contentSharerGetStreamTypes (uri, mimeTypeFilter); - } - } - -} diff --git a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner.sln b/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner.sln deleted file mode 100644 index ba7197df6b..0000000000 --- a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner.sln +++ /dev/null @@ -1,20 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2013 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DemoRunner - App", "DemoRunner_App.vcxproj", "{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.ActiveCfg = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.Build.0 = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.ActiveCfg = Release|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj deleted file mode 100644 index 454e6060bc..0000000000 --- a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj +++ /dev/null @@ -1,3096 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C} - - - - Application - false - false - v120 - 8.1 - - - Application - false - true - v120 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.3;JUCE_APP_VERSION_HEX=0x50403;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /w44265 /w44062 %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\DemoRunner.pdb - Windows - true - - - true - $(IntDir)\DemoRunner.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.3;JUCE_APP_VERSION_HEX=0x50403;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /w44265 /w44062 %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\DemoRunner.pdb - Windows - true - true - true - - - true - $(IntDir)\DemoRunner.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters deleted file mode 100644 index 7a63baddbd..0000000000 --- a/examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters +++ /dev/null @@ -1,5351 +0,0 @@ - - - - - - {747DECFA-60E8-6F38-F8B4-1FC9052FD677} - - - {67AC4BA4-ADB7-61F2-40EB-054BFA2565E9} - - - {8C2BA468-929C-4792-FBD2-3009E3068DD0} - - - {AC828C39-320F-8E54-0482-C033528D4EEC} - - - {E3CEC08A-FA14-D343-5BFF-3D6A4A4FD713} - - - {B3BC836A-3932-C1E4-CA3C-A1C0D83281BA} - - - {97F7F593-75F8-D6B2-DC96-C946C3976226} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {02D37B85-7DE2-C8E7-A274-A5A0FBE99D69} - - - {DAF3BAAF-5207-4C34-61B9-A97DDC930D50} - - - {C7885588-8436-4C21-DC1E-58879BF53BDC} - - - {E4ECEA39-0EFF-2443-91B3-1E5DA7AD5AE4} - - - {210B8D25-68E0-32C3-1449-6A40F109C5E9} - - - {378AD911-E8E4-D230-E76B-34542849509D} - - - {F6CED5B6-0A8C-56D2-C1AC-DED6BE774A13} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {C1AE9AA4-A692-C60C-9892-486757DEC4CE} - - - {58DC204E-D0E2-182E-BFC2-E863F245D5D2} - - - {56B98154-96AF-63C0-CF58-1E2698CA95AB} - - - {BBFDA49F-EE50-D570-2101-7DC71D7E7DA1} - - - {01174C18-A414-8669-5964-5D0BEEFB965B} - - - {C5BF4FE0-80C3-4D2B-7376-A92937D89998} - - - {C4ECF515-17CC-0685-65B1-031B52EE626B} - - - {ED064203-CFE3-44F5-49E6-0BE948CCC752} - - - {60B6EF27-E71E-E771-7B52-F8228C928B3B} - - - {0ADD7306-A27A-EDEF-58D9-1011038D943B} - - - {5502FEA8-790D-593B-7FAF-105304E7A347} - - - {AFB1C715-E4C1-6EB6-367F-D39E64A43205} - - - {114D3F58-5C40-FB13-D076-E3C9CA8D9DBB} - - - {F9420CA4-6ED8-1262-CB31-33328608458F} - - - {1E1A2151-F76C-B7BC-0CB1-10A77A9CF19B} - - - {F9646265-8542-9FD2-1209-55FA76076736} - - - {5971F265-ED75-A920-9750-064F2EE5E6A2} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} - - - {29C6FE02-507E-F3FE-16CD-74D84842C1EA} - - - {8001BD68-125B-E392-8D3B-1F9C9520A65A} - - - {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} - - - {B813BD14-6565-2525-9AC3-E3AA48EDDA85} - - - {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} - - - {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {EEE9B92C-AD26-4BEA-4D95-3F859090EA9F} - - - {B1DE8DB1-C00A-12C0-D690-8B3C9504A60A} - - - {640F6C76-C532-710A-DF73-582F2350F6A3} - - - {FFA9DA63-69C5-A392-4EEE-395CD07733BB} - - - {D3DCC9A9-ADBC-E37E-3CAA-43B3F156B8B9} - - - {409F7733-AD90-6113-85BA-7136DD178413} - - - {CB8DF3B2-0409-6D59-C5D4-A034EBB7F973} - - - {7774F72F-C951-B8AB-E927-E34AD23C52C8} - - - {658BADF8-7095-C722-F9EC-9F36E8818187} - - - {2C58F450-CD01-0231-2F16-0D4D68565164} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology\internal - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\visualisers - - - JUCE Modules\juce_blocks_basics\visualisers - - - JUCE Modules\juce_blocks_basics - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\blocks - - - JUCE Modules\juce_blocks_basics\littlefoot - - - JUCE Modules\juce_blocks_basics\littlefoot - - - JUCE Modules\juce_blocks_basics\littlefoot - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\topology - - - JUCE Modules\juce_blocks_basics\visualisers - - - JUCE Modules\juce_blocks_basics\visualisers - - - JUCE Modules\juce_blocks_basics - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - - - DemoRunner\Source - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_blocks_basics\littlefoot - - - JUCE Modules\juce_blocks_basics\protocol - - - JUCE Modules\juce_blocks_basics - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/examples/DemoRunner/Builds/VisualStudio2013/icon.ico b/examples/DemoRunner/Builds/VisualStudio2013/icon.ico deleted file mode 100644 index 09d32ad703e414097a17e969e7d765325e912c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33530 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

(u1;L6(cQ?)GnM#vbq;}_8j8w4Fi2^0KYHDQh@ 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 - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 5,4,3,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "ROLI Ltd.\0" - VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0" - VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "5.4.3\0" - VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "5.4.3\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/examples/DemoRunner/DemoRunner.jucer b/examples/DemoRunner/DemoRunner.jucer index eff1b07473..77dd95cc1f 100644 --- a/examples/DemoRunner/DemoRunner.jucer +++ b/examples/DemoRunner/DemoRunner.jucer @@ -149,35 +149,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/DemoRunner/JuceLibraryCode/AppConfig.h b/examples/DemoRunner/JuceLibraryCode/AppConfig.h index 22050af402..7c6bfaa70f 100644 --- a/examples/DemoRunner/JuceLibraryCode/AppConfig.h +++ b/examples/DemoRunner/JuceLibraryCode/AppConfig.h @@ -195,7 +195,7 @@ #endif #ifndef JUCE_USE_CURL - //#define JUCE_USE_CURL 0 + //#define JUCE_USE_CURL 1 #endif #ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index f11f9fe62b..83671e0d75 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -53,31 +53,8 @@ - - - - - - - - - - - - - - - - - - - - - - + extraCompilerFlags="/w44265 /w44062 /bigobj"> diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java b/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java deleted file mode 100644 index 0bb31cb5d3..0000000000 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java +++ /dev/null @@ -1,971 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.android.vending.billing; -/** - * InAppBillingService is the service that provides in-app billing version 3 and beyond. - * This service provides the following features: - * 1. Provides a new API to get details of in-app items published for the app including - * price, type, title and description. - * 2. The purchase flow is synchronous and purchase information is available immediately - * after it completes. - * 3. Purchase information of in-app purchases is maintained within the Google Play system - * till the purchase is consumed. - * 4. An API to consume a purchase of an inapp item. All purchases of one-time - * in-app items are consumable and thereafter can be purchased again. - * 5. An API to get current purchases of the user immediately. This will not contain any - * consumed purchases. - * - * All calls will give a response code with the following possible values - * RESULT_OK = 0 - success - * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog - * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down - * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested - * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase - * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API - * RESULT_ERROR = 6 - Fatal error during the API action - * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned - * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned - */ -public interface IInAppBillingService extends android.os.IInterface - { - /** Local-side IPC implementation stub class. */ - public static abstract class Stub extends android.os.Binder implements com.android.vending.billing.IInAppBillingService - { - private static final java.lang.String DESCRIPTOR = "com.android.vending.billing.IInAppBillingService"; - /** Construct the stub at attach it to the interface. */ - public Stub() - { - this.attachInterface(this, DESCRIPTOR); - } - /** - * Cast an IBinder object into an com.android.vending.billing.IInAppBillingService interface, - * generating a proxy if needed. - */ - public static com.android.vending.billing.IInAppBillingService asInterface(android.os.IBinder obj) - { - if ((obj==null)) { - return null; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - if (((iin!=null)&&(iin instanceof com.android.vending.billing.IInAppBillingService))) { - return ((com.android.vending.billing.IInAppBillingService)iin); - } - return new com.android.vending.billing.IInAppBillingService.Stub.Proxy(obj); - } - @Override public android.os.IBinder asBinder() - { - return this; - } - @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException - { - switch (code) - { - case INTERFACE_TRANSACTION: - { - reply.writeString(DESCRIPTOR); - return true; - } - case TRANSACTION_isBillingSupported: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.isBillingSupported(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getSkuDetails: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - android.os.Bundle _arg3; - if ((0!=data.readInt())) { - _arg3 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg3 = null; - } - android.os.Bundle _result = this.getSkuDetails(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getBuyIntent: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - android.os.Bundle _result = this.getBuyIntent(_arg0, _arg1, _arg2, _arg3, _arg4); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getPurchases: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - android.os.Bundle _result = this.getPurchases(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_consumePurchase: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.consumePurchase(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_stub: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - int _result = this.stub(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getBuyIntentToReplaceSkus: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.util.List _arg2; - _arg2 = data.createStringArrayList(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - java.lang.String _arg5; - _arg5 = data.readString(); - android.os.Bundle _result = this.getBuyIntentToReplaceSkus(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getBuyIntentExtraParams: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - java.lang.String _arg4; - _arg4 = data.readString(); - android.os.Bundle _arg5; - if ((0!=data.readInt())) { - _arg5 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg5 = null; - } - android.os.Bundle _result = this.getBuyIntentExtraParams(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getPurchaseHistory: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - java.lang.String _arg3; - _arg3 = data.readString(); - android.os.Bundle _arg4; - if ((0!=data.readInt())) { - _arg4 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg4 = null; - } - android.os.Bundle _result = this.getPurchaseHistory(_arg0, _arg1, _arg2, _arg3, _arg4); - reply.writeNoException(); - if ((_result!=null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } - else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_isBillingSupportedExtraParams: - { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - java.lang.String _arg1; - _arg1 = data.readString(); - java.lang.String _arg2; - _arg2 = data.readString(); - android.os.Bundle _arg3; - if ((0!=data.readInt())) { - _arg3 = android.os.Bundle.CREATOR.createFromParcel(data); - } - else { - _arg3 = null; - } - int _result = this.isBillingSupportedExtraParams(_arg0, _arg1, _arg2, _arg3); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - } - return super.onTransact(code, data, reply, flags); - } - private static class Proxy implements com.android.vending.billing.IInAppBillingService - { - private android.os.IBinder mRemote; - Proxy(android.os.IBinder remote) - { - mRemote = remote; - } - @Override public android.os.IBinder asBinder() - { - return mRemote; - } - public java.lang.String getInterfaceDescriptor() - { - return DESCRIPTOR; - } - @Override public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - mRemote.transact(Stub.TRANSACTION_isBillingSupported, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Provides details of a list of SKUs - * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle - * with a list JSON strings containing the productId, price, title and description. - * This API can be called with a maximum of 20 SKUs. - * @param apiVersion billing API version that the app is using - * @param packageName the package name of the calling app - * @param type of the in-app items ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "DETAILS_LIST" with a StringArrayList containing purchase information - * in JSON format similar to: - * '{ "productId" : "exampleSku", - * "type" : "inapp", - * "price" : "$5.00", - * "price_currency": "USD", - * "price_amount_micros": 5000000, - * "title : "Example Title", - * "description" : "This is an example description" }' - */ - @Override public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - if ((skusBundle!=null)) { - _data.writeInt(1); - skusBundle.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getSkuDetails, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, - * the type, a unique purchase token and an optional developer payload. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - @Override public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(sku); - _data.writeString(type); - _data.writeString(developerPayload); - mRemote.transact(Stub.TRANSACTION_getBuyIntent, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns the current SKUs owned by the user of the type and package name specified along with - * purchase information and a signature of the data to be validated. - * This will return all SKUs that have been purchased in V3 and managed items purchased using - * V1 and V2 that have not been consumed. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus are too many, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - on failures. - * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - @Override public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - _data.writeString(continuationToken); - mRemote.transact(Stub.TRANSACTION_getPurchases, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(purchaseToken); - mRemote.transact(Stub.TRANSACTION_consumePurchase, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - mRemote.transact(Stub.TRANSACTION_stub, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for upgrading or downgrading a - * subscription. The existing owned SKU(s) should be provided along with the new SKU that - * the user is upgrading or downgrading to. - * @param apiVersion billing API version that the app is using, must be 5 or later - * @param packageName package name of the calling app - * @param oldSkus the SKU(s) that the user is upgrading or downgrading from, - * if null or empty this method will behave like {@link #getBuyIntent} - * @param newSku the SKU that the user is upgrading or downgrading to - * @param type of the item being purchased, currently must be "subs" - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - @Override public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeStringList(oldSkus); - _data.writeString(newSku); - _data.writeString(type); - _data.writeString(developerPayload); - mRemote.transact(Stub.TRANSACTION_getBuyIntentToReplaceSkus, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns a pending intent to launch the purchase flow for an in-app item. This method is - * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams} - * parameter. This parameter is a Bundle of optional keys and values that affect the - * operation of the method. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @extraParams a Bundle with the following optional keys: - * "skusToReplace" - List - an optional list of SKUs that the user is - * upgrading or downgrading from. - * Pass this field if the purchase is upgrading or downgrading - * existing subscriptions. - * The specified SKUs are replaced with the SKUs that the user is - * purchasing. Google Play replaces the specified SKUs at the start of - * the next billing cycle. - * "replaceSkusProration" - Boolean - whether the user should be credited for any unused - * subscription time on the SKUs they are upgrading or downgrading. - * If you set this field to true, Google Play swaps out the old SKUs - * and credits the user with the unused value of their subscription - * time on a pro-rated basis. - * Google Play applies this credit to the new subscription, and does - * not begin billing the user for the new subscription until after - * the credit is used up. - * If you set this field to false, the user does not receive credit for - * any unused subscription time and the recurrence date does not - * change. - * Default value is true. Ignored if you do not pass skusToReplace. - * "accountId" - String - an optional obfuscated string that is uniquely - * associated with the user's account in your app. - * If you pass this value, Google Play can use it to detect irregular - * activity, such as many devices making purchases on the same - * account in a short period of time. - * Do not use the developer ID or the user's Google ID for this field. - * In addition, this field should not contain the user's ID in - * cleartext. - * We recommend that you use a one-way hash to generate a string from - * the user's ID, and store the hashed string in this field. - * "vr" - Boolean - an optional flag indicating whether the returned intent - * should start a VR purchase flow. The apiVersion must also be 7 or - * later to use this flag. - */ - @Override public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(sku); - _data.writeString(type); - _data.writeString(developerPayload); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getBuyIntentExtraParams, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - /** - * Returns the most recent purchase made by the user for each SKU, even if that purchase is - * expired, canceled, or consumed. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus is too large, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @param extraParams a Bundle with extra params that would be appended into http request - * query string. Not used at this moment. Reserved for future functionality. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value: RESULT_OK(0) if success, - * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures. - * - * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - @Override public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.Bundle _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - _data.writeString(continuationToken); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getPurchaseHistory, _data, _reply, 0); - _reply.readException(); - if ((0!=_reply.readInt())) { - _result = android.os.Bundle.CREATOR.createFromParcel(_reply); - } - else { - _result = null; - } - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - @Override public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException - { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(apiVersion); - _data.writeString(packageName); - _data.writeString(type); - if ((extraParams!=null)) { - _data.writeInt(1); - extraParams.writeToParcel(_data, 0); - } - else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_isBillingSupportedExtraParams, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } - finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - } - static final int TRANSACTION_isBillingSupported = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); - static final int TRANSACTION_getSkuDetails = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); - static final int TRANSACTION_getBuyIntent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); - static final int TRANSACTION_getPurchases = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); - static final int TRANSACTION_consumePurchase = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); - static final int TRANSACTION_stub = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); - static final int TRANSACTION_getBuyIntentToReplaceSkus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); - static final int TRANSACTION_getBuyIntentExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); - static final int TRANSACTION_getPurchaseHistory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); - static final int TRANSACTION_isBillingSupportedExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); - } - public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException; - /** - * Provides details of a list of SKUs - * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle - * with a list JSON strings containing the productId, price, title and description. - * This API can be called with a maximum of 20 SKUs. - * @param apiVersion billing API version that the app is using - * @param packageName the package name of the calling app - * @param type of the in-app items ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "DETAILS_LIST" with a StringArrayList containing purchase information - * in JSON format similar to: - * '{ "productId" : "exampleSku", - * "type" : "inapp", - * "price" : "$5.00", - * "price_currency": "USD", - * "price_amount_micros": 5000000, - * "title : "Example Title", - * "description" : "This is an example description" }' - */ - public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, - * the type, a unique purchase token and an optional developer payload. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException; - /** - * Returns the current SKUs owned by the user of the type and package name specified along with - * purchase information and a signature of the data to be validated. - * This will return all SKUs that have been purchased in V3 and managed items purchased using - * V1 and V2 that have not been consumed. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus are too many, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - on failures. - * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException; - public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException; - public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for upgrading or downgrading a - * subscription. The existing owned SKU(s) should be provided along with the new SKU that - * the user is upgrading or downgrading to. - * @param apiVersion billing API version that the app is using, must be 5 or later - * @param packageName package name of the calling app - * @param oldSkus the SKU(s) that the user is upgrading or downgrading from, - * if null or empty this method will behave like {@link #getBuyIntent} - * @param newSku the SKU that the user is upgrading or downgrading to - * @param type of the item being purchased, currently must be "subs" - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes - * on failures. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response - * codes on failures. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - */ - public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException; - /** - * Returns a pending intent to launch the purchase flow for an in-app item. This method is - * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams} - * parameter. This parameter is a Bundle of optional keys and values that affect the - * operation of the method. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type of the in-app item being purchased ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param developerPayload optional argument to be sent back with the purchase information - * @extraParams a Bundle with the following optional keys: - * "skusToReplace" - List - an optional list of SKUs that the user is - * upgrading or downgrading from. - * Pass this field if the purchase is upgrading or downgrading - * existing subscriptions. - * The specified SKUs are replaced with the SKUs that the user is - * purchasing. Google Play replaces the specified SKUs at the start of - * the next billing cycle. - * "replaceSkusProration" - Boolean - whether the user should be credited for any unused - * subscription time on the SKUs they are upgrading or downgrading. - * If you set this field to true, Google Play swaps out the old SKUs - * and credits the user with the unused value of their subscription - * time on a pro-rated basis. - * Google Play applies this credit to the new subscription, and does - * not begin billing the user for the new subscription until after - * the credit is used up. - * If you set this field to false, the user does not receive credit for - * any unused subscription time and the recurrence date does not - * change. - * Default value is true. Ignored if you do not pass skusToReplace. - * "accountId" - String - an optional obfuscated string that is uniquely - * associated with the user's account in your app. - * If you pass this value, Google Play can use it to detect irregular - * activity, such as many devices making purchases on the same - * account in a short period of time. - * Do not use the developer ID or the user's Google ID for this field. - * In addition, this field should not contain the user's ID in - * cleartext. - * We recommend that you use a one-way hash to generate a string from - * the user's ID, and store the hashed string in this field. - * "vr" - Boolean - an optional flag indicating whether the returned intent - * should start a VR purchase flow. The apiVersion must also be 7 or - * later to use this flag. - */ - public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException; - /** - * Returns the most recent purchase made by the user for each SKU, even if that purchase is - * expired, canceled, or consumed. - * @param apiVersion billing API version that the app is using, must be 6 or later - * @param packageName package name of the calling app - * @param type of the in-app items being requested ("inapp" for one-time purchases - * and "subs" for subscriptions) - * @param continuationToken to be set as null for the first call, if the number of owned - * skus is too large, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @param extraParams a Bundle with extra params that would be appended into http request - * query string. Not used at this moment. Reserved for future functionality. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value: RESULT_OK(0) if success, - * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures. - * - * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException; - public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException; - } diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/AudioPluginHost.java b/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/AudioPluginHost.java deleted file mode 100644 index 64ef716482..0000000000 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/AudioPluginHost.java +++ /dev/null @@ -1,3166 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2017 - ROLI Ltd. - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -package com.roli.juce.pluginhost; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.hardware.camera2.*; -import android.database.ContentObserver; -import android.media.session.*; -import android.media.MediaMetadata; -import android.net.http.SslError; -import android.net.Uri; -import android.os.Bundle; -import android.os.Looper; -import android.os.Handler; -import android.os.Message; -import android.os.ParcelUuid; -import android.os.Environment; -import android.view.*; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; -import android.graphics.*; -import android.text.ClipboardManager; -import android.text.InputType; -import android.util.DisplayMetrics; -import android.util.Log; -import android.util.Pair; -import android.webkit.SslErrorHandler; -import android.webkit.WebChromeClient; -import android.webkit.WebResourceError; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import java.lang.Runnable; -import java.lang.ref.WeakReference; -import java.lang.reflect.*; -import java.util.*; -import java.io.*; -import java.net.URL; -import java.net.HttpURLConnection; -import android.media.AudioManager; -import android.Manifest; -import java.util.concurrent.CancellationException; -import java.util.concurrent.Future; -import java.util.concurrent.Executors; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.atomic.*; - -import android.media.midi.*; -import android.bluetooth.*; -import android.bluetooth.le.*; - - -//============================================================================== -public class AudioPluginHost extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("juce_jni"); - } - - //============================================================================== - public boolean isPermissionDeclaredInManifest (int permissionID) - { - return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID)); - } - - public boolean isPermissionDeclaredInManifest (String permissionToCheck) - { - try - { - PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS); - - if (info.requestedPermissions != null) - for (String permission : info.requestedPermissions) - if (permission.equals (permissionToCheck)) - return true; - } - catch (PackageManager.NameNotFoundException e) - { - Log.d ("JUCE", "isPermissionDeclaredInManifest: PackageManager.NameNotFoundException = " + e.toString()); - } - - Log.d ("JUCE", "isPermissionDeclaredInManifest: could not find requested permission " + permissionToCheck); - return false; - } - - //============================================================================== - // these have to match the values of enum PermissionID in C++ class RuntimePermissions: - private static final int JUCE_PERMISSIONS_RECORD_AUDIO = 1; - private static final int JUCE_PERMISSIONS_BLUETOOTH_MIDI = 2; - private static final int JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE = 3; - private static final int JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 4; - private static final int JUCE_PERMISSIONS_CAMERA = 5; - - private static String getAndroidPermissionName (int permissionID) - { - switch (permissionID) - { - case JUCE_PERMISSIONS_RECORD_AUDIO: return Manifest.permission.RECORD_AUDIO; - case JUCE_PERMISSIONS_BLUETOOTH_MIDI: return Manifest.permission.ACCESS_COARSE_LOCATION; - // use string value as this is not defined in SDKs < 16 - case JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE: return "android.permission.READ_EXTERNAL_STORAGE"; - case JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE: return Manifest.permission.WRITE_EXTERNAL_STORAGE; - case JUCE_PERMISSIONS_CAMERA: return Manifest.permission.CAMERA; - } - - // unknown permission ID! - assert false; - return new String(); - } - - public boolean isPermissionGranted (int permissionID) - { - return getApplicationContext().checkCallingOrSelfPermission (getAndroidPermissionName (permissionID)) == PackageManager.PERMISSION_GRANTED; - } - - private Map permissionCallbackPtrMap; - - public void requestRuntimePermission (int permissionID, long ptrToCallback) - { - String permissionName = getAndroidPermissionName (permissionID); - - if (getApplicationContext().checkCallingOrSelfPermission (permissionName) != PackageManager.PERMISSION_GRANTED) - { - // remember callbackPtr, request permissions, and let onRequestPermissionResult call callback asynchronously - permissionCallbackPtrMap.put (permissionID, ptrToCallback); - requestPermissionsCompat (new String[]{permissionName}, permissionID); - } - else - { - // permissions were already granted before, we can call callback directly - androidRuntimePermissionsCallback (true, ptrToCallback); - } - } - - private native void androidRuntimePermissionsCallback (boolean permissionWasGranted, long ptrToCallback); - - @Override - public void onRequestPermissionsResult (int permissionID, String permissions[], int[] grantResults) - { - boolean permissionsGranted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED); - - if (! permissionsGranted) - Log.d ("JUCE", "onRequestPermissionsResult: runtime permission was DENIED: " + getAndroidPermissionName (permissionID)); - - Long ptrToCallback = permissionCallbackPtrMap.get (permissionID); - permissionCallbackPtrMap.remove (permissionID); - androidRuntimePermissionsCallback (permissionsGranted, ptrToCallback); - } - - //============================================================================== - public interface JuceMidiPort - { - boolean isInputPort(); - - // start, stop does nothing on an output port - void start(); - void stop(); - - void close(); - - // send will do nothing on an input port - void sendMidi (byte[] msg, int offset, int count); - } - - //============================================================================== - //============================================================================== - public class BluetoothManager extends ScanCallback - { - BluetoothManager() - { - } - - public String[] getMidiBluetoothAddresses() - { - return bluetoothMidiDevices.toArray (new String[bluetoothMidiDevices.size()]); - } - - public String getHumanReadableStringForBluetoothAddress (String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - return btDevice.getName(); - } - - public int getBluetoothDeviceStatus (String address) - { - return getAndroidMidiDeviceManager().getBluetoothDeviceStatus (address); - } - - public void startStopScan (boolean shouldStart) - { - BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - - if (bluetoothAdapter == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get default Bluetooth adapter"); - return; - } - - BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); - - if (bluetoothLeScanner == null) - { - Log.d ("JUCE", "BluetoothManager error: could not get Bluetooth LE scanner"); - return; - } - - if (shouldStart) - { - ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder(); - scanFilterBuilder.setServiceUuid (ParcelUuid.fromString (bluetoothLEMidiServiceUUID)); - - ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder(); - scanSettingsBuilder.setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES) - .setScanMode (ScanSettings.SCAN_MODE_LOW_POWER) - .setScanMode (ScanSettings.MATCH_MODE_STICKY); - - bluetoothLeScanner.startScan (Arrays.asList (scanFilterBuilder.build()), - scanSettingsBuilder.build(), - this); - } - else - { - bluetoothLeScanner.stopScan (this); - } - } - - public boolean pairBluetoothMidiDevice(String address) - { - BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice (address); - - if (btDevice == null) - { - Log.d ("JUCE", "failed to create buletooth device from address"); - return false; - } - - return getAndroidMidiDeviceManager().pairBluetoothDevice (btDevice); - } - - public void unpairBluetoothMidiDevice (String address) - { - getAndroidMidiDeviceManager().unpairBluetoothDevice (address); - } - - public void onScanFailed (int errorCode) - { - } - - public void onScanResult (int callbackType, ScanResult result) - { - if (callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES - || callbackType == ScanSettings.CALLBACK_TYPE_FIRST_MATCH) - { - BluetoothDevice device = result.getDevice(); - - if (device != null) - bluetoothMidiDevices.add (device.getAddress()); - } - - if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) - { - Log.d ("JUCE", "ScanSettings.CALLBACK_TYPE_MATCH_LOST"); - BluetoothDevice device = result.getDevice(); - - if (device != null) - { - bluetoothMidiDevices.remove (device.getAddress()); - unpairBluetoothMidiDevice (device.getAddress()); - } - } - } - - public void onBatchScanResults (List results) - { - for (ScanResult result : results) - onScanResult (ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result); - } - - private BluetoothLeScanner scanner; - private static final String bluetoothLEMidiServiceUUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"; - - private HashSet bluetoothMidiDevices = new HashSet(); - } - - public static class JuceMidiInputPort extends MidiReceiver implements JuceMidiPort - { - private native void handleReceive (long host, byte[] msg, int offset, int count, long timestamp); - - public JuceMidiInputPort (MidiDeviceManager mm, MidiOutputPort actualPort, MidiPortPath portPathToUse, long hostToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - juceHost = hostToUse; - isConnected = false; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return true; - } - - @Override - public void start() - { - if (owner != null && androidPort != null && ! isConnected) { - androidPort.connect(this); - isConnected = true; - } - } - - @Override - public void stop() - { - if (owner != null && androidPort != null && isConnected) { - androidPort.disconnect(this); - isConnected = false; - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - @Override - public void onSend (byte[] msg, int offset, int count, long timestamp) - { - if (count > 0) - handleReceive (juceHost, msg, offset, count, timestamp); - } - - @Override - public void onFlush() - {} - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - } - - MidiDeviceManager owner; - MidiOutputPort androidPort; - MidiPortPath portPath; - long juceHost; - boolean isConnected; - } - - public static class JuceMidiOutputPort implements JuceMidiPort - { - public JuceMidiOutputPort (MidiDeviceManager mm, MidiInputPort actualPort, MidiPortPath portPathToUse) - { - owner = mm; - androidPort = actualPort; - portPath = portPathToUse; - } - - @Override - protected void finalize() throws Throwable - { - close(); - super.finalize(); - } - - @Override - public boolean isInputPort() - { - return false; - } - - @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void sendMidi (byte[] msg, int offset, int count) - { - if (androidPort != null) - { - try { - androidPort.send(msg, offset, count); - } catch (IOException exception) - { - Log.d ("JUCE", "send midi had IO exception"); - } - } - } - - @Override - public void close() - { - if (androidPort != null) { - try { - androidPort.close(); - } catch (IOException exception) { - Log.d("JUCE", "IO Exception while closing port"); - } - } - - if (owner != null) - owner.removePort (portPath); - - owner = null; - androidPort = null; - } - - MidiDeviceManager owner; - MidiInputPort androidPort; - MidiPortPath portPath; - } - - private static class MidiPortPath extends Object - { - public MidiPortPath (int deviceIdToUse, boolean direction, int androidIndex) - { - deviceId = deviceIdToUse; - isInput = direction; - portIndex = androidIndex; - - } - - public int deviceId; - public int portIndex; - public boolean isInput; - - @Override - public int hashCode() - { - Integer i = new Integer ((deviceId * 128) + (portIndex < 128 ? portIndex : 127)); - return i.hashCode() * (isInput ? -1 : 1); - } - - @Override - public boolean equals (Object obj) - { - if (obj == null) - return false; - - if (getClass() != obj.getClass()) - return false; - - MidiPortPath other = (MidiPortPath) obj; - return (portIndex == other.portIndex && isInput == other.isInput && deviceId == other.deviceId); - } - } - - //============================================================================== - public class MidiDeviceManager extends MidiManager.DeviceCallback implements MidiManager.OnDeviceOpenedListener - { - //============================================================================== - private class DummyBluetoothGattCallback extends BluetoothGattCallback - { - public DummyBluetoothGattCallback (MidiDeviceManager mm) - { - super(); - owner = mm; - } - - public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) - { - if (newState == BluetoothProfile.STATE_CONNECTED) - { - gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); - owner.pairBluetoothDeviceStepTwo (gatt.getDevice()); - } - } - public void onServicesDiscovered(BluetoothGatt gatt, int status) {} - public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {} - public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {} - public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {} - public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {} - public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {} - public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {} - - private MidiDeviceManager owner; - } - - //============================================================================== - private class MidiDeviceOpenTask extends java.util.TimerTask - { - public MidiDeviceOpenTask (MidiDeviceManager deviceManager, MidiDevice device, BluetoothGatt gattToUse) - { - owner = deviceManager; - midiDevice = device; - btGatt = gattToUse; - } - - @Override - public boolean cancel() - { - synchronized (MidiDeviceOpenTask.class) - { - owner = null; - boolean retval = super.cancel(); - - if (btGatt != null) - { - btGatt.disconnect(); - btGatt.close(); - - btGatt = null; - } - - if (midiDevice != null) - { - try - { - midiDevice.close(); - } - catch (IOException e) - {} - - midiDevice = null; - } - - return retval; - } - } - - public String getBluetoothAddress() - { - synchronized (MidiDeviceOpenTask.class) - { - if (midiDevice != null) - { - MidiDeviceInfo info = midiDevice.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - return btDevice.getAddress(); - } - } - } - - return ""; - } - - public BluetoothGatt getGatt() { return btGatt; } - - public int getID() - { - return midiDevice.getInfo().getId(); - } - - @Override - public void run() - { - synchronized (MidiDeviceOpenTask.class) - { - if (owner != null && midiDevice != null) - owner.onDeviceOpenedDelayed (midiDevice); - } - } - - private MidiDeviceManager owner; - private MidiDevice midiDevice; - private BluetoothGatt btGatt; - } - - //============================================================================== - public MidiDeviceManager() - { - manager = (MidiManager) getSystemService (MIDI_SERVICE); - - if (manager == null) - { - Log.d ("JUCE", "MidiDeviceManager error: could not get MidiManager system service"); - return; - } - - openPorts = new HashMap> (); - midiDevices = new ArrayList>(); - openTasks = new HashMap(); - btDevicesPairing = new HashMap(); - - MidiDeviceInfo[] foundDevices = manager.getDevices(); - for (MidiDeviceInfo info : foundDevices) - onDeviceAdded (info); - - manager.registerDeviceCallback (this, null); - } - - protected void finalize() throws Throwable - { - manager.unregisterDeviceCallback (this); - - synchronized (MidiDeviceManager.class) - { - btDevicesPairing.clear(); - - for (Integer deviceID : openTasks.keySet()) - openTasks.get (deviceID).cancel(); - - openTasks = null; - } - - for (MidiPortPath key : openPorts.keySet()) - openPorts.get (key).get().close(); - - openPorts = null; - - for (Pair device : midiDevices) - { - if (device.second != null) - { - device.second.disconnect(); - device.second.close(); - } - - device.first.close(); - } - - midiDevices.clear(); - - super.finalize(); - } - - public String[] getJuceAndroidMidiInputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - } - - public String[] getJuceAndroidMidiOutputDevices() - { - return getJuceAndroidMidiDevices (MidiDeviceInfo.PortInfo.TYPE_INPUT); - } - - private String[] getJuceAndroidMidiDevices (int portType) - { - // only update the list when JUCE asks for a new list - synchronized (MidiDeviceManager.class) - { - deviceInfos = getDeviceInfos(); - } - - ArrayList portNames = new ArrayList(); - - int index = 0; - for (MidiPortPath portInfo = getPortPathForJuceIndex (portType, index); portInfo != null; portInfo = getPortPathForJuceIndex (portType, ++index)) - portNames.add (getPortName (portInfo)); - - String[] names = new String[portNames.size()]; - return portNames.toArray (names); - } - - private JuceMidiPort openMidiPortWithJuceIndex (int index, long host, boolean isInput) - { - synchronized (MidiDeviceManager.class) - { - int portTypeToFind = (isInput ? MidiDeviceInfo.PortInfo.TYPE_OUTPUT : MidiDeviceInfo.PortInfo.TYPE_INPUT); - MidiPortPath portInfo = getPortPathForJuceIndex (portTypeToFind, index); - - if (portInfo != null) - { - // ports must be opened exclusively! - if (openPorts.containsKey (portInfo)) - return null; - - Pair devicePair = getMidiDevicePairForId (portInfo.deviceId); - - if (devicePair != null) - { - MidiDevice device = devicePair.first; - if (device != null) - { - JuceMidiPort juceMidiPort = null; - - if (isInput) - { - MidiOutputPort outputPort = device.openOutputPort(portInfo.portIndex); - - if (outputPort != null) - juceMidiPort = new JuceMidiInputPort(this, outputPort, portInfo, host); - } - else - { - MidiInputPort inputPort = device.openInputPort(portInfo.portIndex); - - if (inputPort != null) - juceMidiPort = new JuceMidiOutputPort(this, inputPort, portInfo); - } - - if (juceMidiPort != null) - { - openPorts.put(portInfo, new WeakReference(juceMidiPort)); - - return juceMidiPort; - } - } - } - } - } - - return null; - } - - public JuceMidiPort openMidiInputPortWithJuceIndex (int index, long host) - { - return openMidiPortWithJuceIndex (index, host, true); - } - - public JuceMidiPort openMidiOutputPortWithJuceIndex (int index) - { - return openMidiPortWithJuceIndex (index, 0, false); - } - - /* 0: unpaired, 1: paired, 2: pairing */ - public int getBluetoothDeviceStatus (String address) - { - synchronized (MidiDeviceManager.class) - { - if (! address.isEmpty()) - { - if (findMidiDeviceForBluetoothAddress (address) != null) - return 1; - - if (btDevicesPairing.containsKey (address)) - return 2; - - if (findOpenTaskForBluetoothAddress (address) != null) - return 2; - } - } - - return 0; - } - - public boolean pairBluetoothDevice (BluetoothDevice btDevice) - { - String btAddress = btDevice.getAddress(); - if (btAddress.isEmpty()) - return false; - - synchronized (MidiDeviceManager.class) - { - if (getBluetoothDeviceStatus (btAddress) != 0) - return false; - - - btDevicesPairing.put (btDevice.getAddress(), null); - BluetoothGatt gatt = btDevice.connectGatt (getApplicationContext(), true, new DummyBluetoothGattCallback (this)); - - if (gatt != null) - { - btDevicesPairing.put (btDevice.getAddress(), gatt); - } - else - { - pairBluetoothDeviceStepTwo (btDevice); - } - } - - return true; - } - - public void pairBluetoothDeviceStepTwo (BluetoothDevice btDevice) - { - manager.openBluetoothDevice(btDevice, this, null); - } - - public void unpairBluetoothDevice (String address) - { - if (address.isEmpty()) - return; - - synchronized (MidiDeviceManager.class) - { - if (btDevicesPairing.containsKey (address)) - { - BluetoothGatt gatt = btDevicesPairing.get (address); - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - btDevicesPairing.remove (address); - } - - MidiDeviceOpenTask openTask = findOpenTaskForBluetoothAddress (address); - if (openTask != null) - { - int deviceID = openTask.getID(); - openTask.cancel(); - openTasks.remove (deviceID); - } - - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (address); - if (midiDevicePair != null) - { - MidiDevice midiDevice = midiDevicePair.first; - onDeviceRemoved (midiDevice.getInfo()); - - try { - midiDevice.close(); - } - catch (IOException exception) - { - Log.d ("JUCE", "IOException while closing midi device"); - } - } - } - } - - private Pair findMidiDeviceForBluetoothAddress (String address) - { - for (Pair midiDevice : midiDevices) - { - MidiDeviceInfo info = midiDevice.first.getInfo(); - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null && btDevice.getAddress().equals (address)) - return midiDevice; - } - } - - return null; - } - - private MidiDeviceOpenTask findOpenTaskForBluetoothAddress (String address) - { - for (Integer deviceID : openTasks.keySet()) - { - MidiDeviceOpenTask openTask = openTasks.get (deviceID); - if (openTask.getBluetoothAddress().equals (address)) - return openTask; - } - - return null; - } - - public void removePort (MidiPortPath path) - { - openPorts.remove (path); - } - - public String getInputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_OUTPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public String getOutputPortNameForJuceIndex (int index) - { - MidiPortPath portInfo = getPortPathForJuceIndex (MidiDeviceInfo.PortInfo.TYPE_INPUT, index); - if (portInfo != null) - return getPortName (portInfo); - - return ""; - } - - public void onDeviceAdded (MidiDeviceInfo info) - { - // only add standard midi devices - if (info.getType() == info.TYPE_BLUETOOTH) - return; - - manager.openDevice (info, this, null); - } - - public void onDeviceRemoved (MidiDeviceInfo info) - { - synchronized (MidiDeviceManager.class) - { - Pair devicePair = getMidiDevicePairForId (info.getId()); - - if (devicePair != null) - { - MidiDevice midiDevice = devicePair.first; - BluetoothGatt gatt = devicePair.second; - - // close all ports that use this device - boolean removedPort = true; - - while (removedPort == true) - { - removedPort = false; - for (MidiPortPath key : openPorts.keySet()) - { - if (key.deviceId == info.getId()) - { - openPorts.get(key).get().close(); - removedPort = true; - break; - } - } - } - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - - midiDevices.remove (devicePair); - } - } - } - - public void onDeviceStatusChanged (MidiDeviceStatus status) - { - } - - @Override - public void onDeviceOpened (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo info = theDevice.getInfo(); - int deviceID = info.getId(); - BluetoothGatt gatt = null; - boolean isBluetooth = false; - - if (! openTasks.containsKey (deviceID)) - { - if (info.getType() == MidiDeviceInfo.TYPE_BLUETOOTH) - { - isBluetooth = true; - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - if (btDevicesPairing.containsKey (btAddress)) - { - gatt = btDevicesPairing.get (btAddress); - btDevicesPairing.remove (btAddress); - } - else - { - // unpair was called in the mean time - try - { - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - - theDevice.close(); - } - catch (IOException e) - {} - - return; - } - } - } - - MidiDeviceOpenTask openTask = new MidiDeviceOpenTask (this, theDevice, gatt); - openTasks.put (deviceID, openTask); - - new java.util.Timer().schedule (openTask, (isBluetooth ? 2000 : 100)); - } - } - } - - public void onDeviceOpenedDelayed (MidiDevice theDevice) - { - synchronized (MidiDeviceManager.class) - { - int deviceID = theDevice.getInfo().getId(); - - if (openTasks.containsKey (deviceID)) - { - if (! midiDevices.contains(theDevice)) - { - BluetoothGatt gatt = openTasks.get (deviceID).getGatt(); - openTasks.remove (deviceID); - midiDevices.add (new Pair (theDevice, gatt)); - } - } - else - { - // unpair was called in the mean time - MidiDeviceInfo info = theDevice.getInfo(); - BluetoothDevice btDevice = (BluetoothDevice) info.getProperties().get (info.PROPERTY_BLUETOOTH_DEVICE); - if (btDevice != null) - { - String btAddress = btDevice.getAddress(); - Pair midiDevicePair = findMidiDeviceForBluetoothAddress (btDevice.getAddress()); - if (midiDevicePair != null) - { - BluetoothGatt gatt = midiDevicePair.second; - - if (gatt != null) - { - gatt.disconnect(); - gatt.close(); - } - } - } - - try - { - theDevice.close(); - } - catch (IOException e) - {} - } - } - } - - public String getPortName(MidiPortPath path) - { - int portTypeToFind = (path.isInput ? MidiDeviceInfo.PortInfo.TYPE_INPUT : MidiDeviceInfo.PortInfo.TYPE_OUTPUT); - - synchronized (MidiDeviceManager.class) - { - for (MidiDeviceInfo info : deviceInfos) - { - int localIndex = 0; - if (info.getId() == path.deviceId) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - int portType = portInfo.getType(); - if (portType == portTypeToFind) - { - int portIndex = portInfo.getPortNumber(); - if (portIndex == path.portIndex) - { - String portName = portInfo.getName(); - if (portName.isEmpty()) - portName = (String) info.getProperties().get(info.PROPERTY_NAME); - - return portName; - } - } - } - } - } - } - - return ""; - } - - public MidiPortPath getPortPathForJuceIndex (int portType, int juceIndex) - { - int portIdx = 0; - for (MidiDeviceInfo info : deviceInfos) - { - for (MidiDeviceInfo.PortInfo portInfo : info.getPorts()) - { - if (portInfo.getType() == portType) - { - if (portIdx == juceIndex) - return new MidiPortPath (info.getId(), - (portType == MidiDeviceInfo.PortInfo.TYPE_INPUT), - portInfo.getPortNumber()); - - portIdx++; - } - } - } - - return null; - } - - private MidiDeviceInfo[] getDeviceInfos() - { - synchronized (MidiDeviceManager.class) - { - MidiDeviceInfo[] infos = new MidiDeviceInfo[midiDevices.size()]; - - int idx = 0; - for (Pair midiDevice : midiDevices) - infos[idx++] = midiDevice.first.getInfo(); - - return infos; - } - } - - private Pair getMidiDevicePairForId (int deviceId) - { - synchronized (MidiDeviceManager.class) - { - for (Pair midiDevice : midiDevices) - if (midiDevice.first.getInfo().getId() == deviceId) - return midiDevice; - } - - return null; - } - - private MidiManager manager; - private HashMap btDevicesPairing; - private HashMap openTasks; - private ArrayList> midiDevices; - private MidiDeviceInfo[] deviceInfos; - private HashMap> openPorts; - } - - public MidiDeviceManager getAndroidMidiDeviceManager() - { - if (getSystemService (MIDI_SERVICE) == null) - return null; - - synchronized (AudioPluginHost.class) - { - if (midiDeviceManager == null) - midiDeviceManager = new MidiDeviceManager(); - } - - return midiDeviceManager; - } - - public BluetoothManager getAndroidBluetoothManager() - { - BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - - if (adapter == null) - return null; - - if (adapter.getBluetoothLeScanner() == null) - return null; - - synchronized (AudioPluginHost.class) - { - if (bluetoothManager == null) - bluetoothManager = new BluetoothManager(); - } - - return bluetoothManager; - } - - //============================================================================== - @Override - public void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - isScreenSaverEnabled = true; - hideActionBar(); - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - - setVolumeControlStream (AudioManager.STREAM_MUSIC); - - permissionCallbackPtrMap = new HashMap(); - appPausedResumedListeners = new HashMap(); - } - - @Override - protected void onDestroy() - { - quitApp(); - super.onDestroy(); - - clearDataCache(); - } - - @Override - protected void onPause() - { - suspendApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appPaused(); - - try - { - Thread.sleep (1000); // This is a bit of a hack to avoid some hard-to-track-down - // openGL glitches when pausing/resuming apps.. - } catch (InterruptedException e) {} - - super.onPause(); - } - - @Override - protected void onResume() - { - super.onResume(); - resumeApp(); - - Long[] keys = appPausedResumedListeners.keySet().toArray (new Long[appPausedResumedListeners.keySet().size()]); - - for (Long k : keys) - appPausedResumedListeners.get (k).appResumed(); - } - - @Override - public void onConfigurationChanged (Configuration cfg) - { - super.onConfigurationChanged (cfg); - setContentView (viewHolder); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - // Need to override this as the default implementation always finishes the activity. - @Override - public void onBackPressed() - { - ComponentPeerView focusedView = getViewWithFocusOrDefaultView(); - - if (focusedView == null) - return; - - focusedView.backButtonPressed(); - } - - private ComponentPeerView getViewWithFocusOrDefaultView() - { - for (int i = 0; i < viewHolder.getChildCount(); ++i) - { - if (viewHolder.getChildAt (i).hasFocus()) - return (ComponentPeerView) viewHolder.getChildAt (i); - } - - if (viewHolder.getChildCount() > 0) - return (ComponentPeerView) viewHolder.getChildAt (0); - - return null; - } - - //============================================================================== - private void hideActionBar() - { - // get "getActionBar" method - java.lang.reflect.Method getActionBarMethod = null; - try - { - getActionBarMethod = this.getClass().getMethod ("getActionBar"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (getActionBarMethod == null) return; - - // invoke "getActionBar" method - Object actionBar = null; - try - { - actionBar = getActionBarMethod.invoke (this); - } - catch (java.lang.IllegalArgumentException e) { return; } - catch (java.lang.IllegalAccessException e) { return; } - catch (java.lang.reflect.InvocationTargetException e) { return; } - if (actionBar == null) return; - - // get "hide" method - java.lang.reflect.Method actionBarHideMethod = null; - try - { - actionBarHideMethod = actionBar.getClass().getMethod ("hide"); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (actionBarHideMethod == null) return; - - // invoke "hide" method - try - { - actionBarHideMethod.invoke (actionBar); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - void requestPermissionsCompat (String[] permissions, int requestCode) - { - Method requestPermissionsMethod = null; - try - { - requestPermissionsMethod = this.getClass().getMethod ("requestPermissions", - String[].class, int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (requestPermissionsMethod == null) return; - - try - { - requestPermissionsMethod.invoke (this, permissions, requestCode); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void suspendApp(); - private native void resumeApp(); - private native void setScreenSize (int screenWidth, int screenHeight, int dpi); - private native void appActivityResult (int requestCode, int resultCode, Intent data); - private native void appNewIntent (Intent intent); - - //============================================================================== - private ViewHolder viewHolder; - private MidiDeviceManager midiDeviceManager = null; - private BluetoothManager bluetoothManager = null; - private boolean isScreenSaverEnabled; - private java.util.Timer keepAliveTimer; - - public final ComponentPeerView createNewView (boolean opaque, long host) - { - ComponentPeerView v = new ComponentPeerView (this, opaque, host); - viewHolder.addView (v); - addAppPausedResumedListener (v, host); - return v; - } - - public final void deleteView (ComponentPeerView view) - { - removeAppPausedResumedListener (view, view.host); - - view.host = 0; - - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - public final void deleteNativeSurfaceView (NativeSurfaceView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - final class ViewHolder extends ViewGroup - { - public ViewHolder (Context context) - { - super (context); - setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); - setFocusable (false); - } - - protected final void onLayout (boolean changed, int left, int top, int right, int bottom) - { - setScreenSize (getWidth(), getHeight(), getDPI()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - private final int getDPI() - { - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics (metrics); - return metrics.densityDpi; - } - - private boolean isFirstResize = true; - } - - public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom) - { - canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE); - } - - //============================================================================== - public final void setScreenSaver (boolean enabled) - { - if (isScreenSaverEnabled != enabled) - { - isScreenSaverEnabled = enabled; - - if (keepAliveTimer != null) - { - keepAliveTimer.cancel(); - keepAliveTimer = null; - } - - if (enabled) - { - getWindow().clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } - else - { - getWindow().addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - - // If no user input is received after about 3 seconds, the OS will lower the - // task's priority, so this timer forces it to be kept active. - keepAliveTimer = new java.util.Timer(); - - keepAliveTimer.scheduleAtFixedRate (new TimerTask() - { - @Override - public void run() - { - android.app.Instrumentation instrumentation = new android.app.Instrumentation(); - - try - { - instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_UNKNOWN); - } - catch (Exception e) - { - } - } - }, 2000, 2000); - } - } - } - - public final boolean getScreenSaver() - { - return isScreenSaverEnabled; - } - - //============================================================================== - public final String getClipboardContent() - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - - CharSequence content = clipboard.getText(); - return content != null ? content.toString() : new String(); - } - - public final void setClipboardContent (String newText) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - clipboard.setText (newText); - } - - //============================================================================== - public final void showMessageBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - AudioPluginHost.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showOkCancelBox (String title, String message, final long callback, - String okButtonText, String cancelButtonText) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - AudioPluginHost.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton (okButtonText.isEmpty() ? "OK" : okButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton (cancelButtonText.isEmpty() ? "Cancel" : cancelButtonText, new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showYesNoCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setOnCancelListener (new DialogInterface.OnCancelListener() - { - public void onCancel (DialogInterface dialog) - { - AudioPluginHost.this.alertDismissed (callback, 0); - } - }) - .setPositiveButton ("Yes", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("No", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 2); - } - }) - .setNeutralButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.dismiss(); - AudioPluginHost.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public native void alertDismissed (long callback, int id); - - //============================================================================== - public interface AppPausedResumedListener - { - void appPaused(); - void appResumed(); - } - - private Map appPausedResumedListeners; - - public void addAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.put (new Long (listenerHost), l); - } - - public void removeAppPausedResumedListener (AppPausedResumedListener l, long listenerHost) - { - appPausedResumedListeners.remove (new Long (listenerHost)); - } - - //============================================================================== - public final class ComponentPeerView extends ViewGroup - implements View.OnFocusChangeListener, AppPausedResumedListener - { - public ComponentPeerView (Context context, boolean opaque_, long host) - { - super (context); - this.host = host; - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - - // swap red and blue colours to match internal opengl texture format - ColorMatrix colorMatrix = new ColorMatrix(); - - float[] colorTransform = { 0, 0, 1.0f, 0, 0, - 0, 1.0f, 0, 0, 0, - 1.0f, 0, 0, 0, 0, - 0, 0, 0, 1.0f, 0 }; - - colorMatrix.set (colorTransform); - paint.setColorFilter (new ColorMatrixColorFilter (colorMatrix)); - - java.lang.reflect.Method method = null; - - try - { - method = getClass().getMethod ("setLayerType", int.class, Paint.class); - } - catch (SecurityException e) {} - catch (NoSuchMethodException e) {} - - if (method != null) - { - try - { - int layerTypeNone = 0; - method.invoke (this, layerTypeNone, null); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - } - - //============================================================================== - private native void handlePaint (long host, Canvas canvas, Paint paint); - - @Override - public void onDraw (Canvas canvas) - { - if (host == 0) - return; - - handlePaint (host, canvas, paint); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - private long host; - private Paint paint = new Paint(); - - //============================================================================== - private native void handleMouseDown (long host, int index, float x, float y, long time); - private native void handleMouseDrag (long host, int index, float x, float y, long time); - private native void handleMouseUp (long host, int index, float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - if (host == 0) - return false; - - int action = event.getAction(); - long time = event.getEventTime(); - - switch (action & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - handleMouseDown (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - handleMouseUp (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_MOVE: - { - int n = event.getPointerCount(); - for (int i = 0; i < n; ++i) - handleMouseDrag (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - - return true; - } - - case MotionEvent.ACTION_POINTER_UP: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseUp (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - case MotionEvent.ACTION_POINTER_DOWN: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseDown (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - default: - break; - } - - return false; - } - - //============================================================================== - private native void handleKeyDown (long host, int keycode, int textchar); - private native void handleKeyUp (long host, int keycode, int textchar); - private native void handleBackButton (long host); - private native void handleKeyboardHidden (long host); - - public void showKeyboard (String type) - { - InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) - { - if (type.length() > 0) - { - imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT); - imm.setInputMethod (getWindowToken(), type); - keyboardDismissListener.startListening(); - } - else - { - imm.hideSoftInputFromWindow (getWindowToken(), 0); - keyboardDismissListener.stopListening(); - } - } - } - - public void backButtonPressed() - { - if (host == 0) - return; - - handleBackButton (host); - } - - @Override - public boolean onKeyDown (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - switch (keyCode) - { - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_DOWN: - return super.onKeyDown (keyCode, event); - case KeyEvent.KEYCODE_BACK: - { - ((Activity) getContext()).onBackPressed(); - return true; - } - - default: - break; - } - - handleKeyDown (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyUp (int keyCode, KeyEvent event) - { - if (host == 0) - return false; - - handleKeyUp (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) - { - if (host == 0) - return false; - - if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction() != KeyEvent.ACTION_MULTIPLE) - return super.onKeyMultiple (keyCode, count, event); - - if (event.getCharacters() != null) - { - int utf8Char = event.getCharacters().codePointAt (0); - handleKeyDown (host, utf8Char, utf8Char); - return true; - } - - return false; - } - - //============================================================================== - private final class KeyboardDismissListener - { - public KeyboardDismissListener (ComponentPeerView viewToUse) - { - view = viewToUse; - } - - private void startListening() - { - view.getViewTreeObserver().addOnGlobalLayoutListener(viewTreeObserver); - } - - private void stopListening() - { - view.getViewTreeObserver().removeGlobalOnLayoutListener(viewTreeObserver); - } - - private class TreeObserver implements ViewTreeObserver.OnGlobalLayoutListener - { - TreeObserver() - { - keyboardShown = false; - } - - @Override - public void onGlobalLayout() - { - Rect r = new Rect(); - - ViewGroup parentView = (ViewGroup) getParent(); - - if (parentView == null) - return; - - parentView.getWindowVisibleDisplayFrame (r); - - int diff = parentView.getHeight() - (r.bottom - r.top); - - // Arbitrary threshold, surely keyboard would take more than 20 pix. - if (diff < 20 && keyboardShown) - { - keyboardShown = false; - handleKeyboardHidden (view.host); - } - - if (! keyboardShown && diff > 20) - keyboardShown = true; - }; - - private boolean keyboardShown; - }; - - private ComponentPeerView view; - private TreeObserver viewTreeObserver = new TreeObserver(); - } - - private KeyboardDismissListener keyboardDismissListener = new KeyboardDismissListener(this); - - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 - @Override - public InputConnection onCreateInputConnection (EditorInfo outAttrs) - { - outAttrs.actionLabel = ""; - outAttrs.hintText = ""; - outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; - outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - if (host == 0) - return; - - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged (host); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - for (int i = getChildCount(); --i >= 0;) - requestTransparentRegion (getChildAt (i)); - } - - private native void viewSizeChanged (long host); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (host == 0) - return; - - if (v == this) - focusChanged (host, hasFocus); - } - - private native void focusChanged (long host, boolean hasFocus); - - public void setViewName (String newName) {} - - public void setSystemUiVisibilityCompat (int visibility) - { - Method systemUIVisibilityMethod = null; - try - { - systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class); - } - catch (SecurityException e) { return; } - catch (NoSuchMethodException e) { return; } - if (systemUIVisibilityMethod == null) return; - - try - { - systemUIVisibilityMethod.invoke (this, visibility); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - } - - public boolean isVisible() { return getVisibility() == VISIBLE; } - public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); } - - public boolean containsPoint (int x, int y) - { - return true; //xxx needs to check overlapping views - } - - //============================================================================== - private native void handleAppPaused (long host); - private native void handleAppResumed (long host); - - @Override - public void appPaused() - { - if (host == 0) - return; - - handleAppPaused (host); - } - - @Override - public void appResumed() - { - if (host == 0) - return; - - // Ensure that navigation/status bar visibility is correctly restored. - handleAppResumed (host); - } - } - - //============================================================================== - public static class NativeSurfaceView extends SurfaceView - implements SurfaceHolder.Callback - { - private long nativeContext = 0; - private boolean forVideo; - - NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo) - { - super (context); - nativeContext = nativeContextPtr; - forVideo = createdForVideo; - } - - public Surface getNativeSurface() - { - Surface retval = null; - - SurfaceHolder holder = getHolder(); - if (holder != null) - retval = holder.getSurface(); - - return retval; - } - - //============================================================================== - @Override - public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) - { - if (forVideo) - surfaceChangedNativeVideo (nativeContext, holder, format, width, height); - else - surfaceChangedNative (nativeContext, holder, format, width, height); - } - - @Override - public void surfaceCreated (SurfaceHolder holder) - { - if (forVideo) - surfaceCreatedNativeVideo (nativeContext, holder); - else - surfaceCreatedNative (nativeContext, holder); - } - - @Override - public void surfaceDestroyed (SurfaceHolder holder) - { - if (forVideo) - surfaceDestroyedNativeVideo (nativeContext, holder); - else - surfaceDestroyedNative (nativeContext, holder); - } - - @Override - protected void dispatchDraw (Canvas canvas) - { - super.dispatchDraw (canvas); - - if (forVideo) - dispatchDrawNativeVideo (nativeContext, canvas); - else - dispatchDrawNative (nativeContext, canvas); - } - - //============================================================================== - @Override - protected void onAttachedToWindow() - { - super.onAttachedToWindow(); - getHolder().addCallback (this); - } - - @Override - protected void onDetachedFromWindow() - { - super.onDetachedFromWindow(); - getHolder().removeCallback (this); - } - - //============================================================================== - private native void dispatchDrawNative (long nativeContextPtr, Canvas canvas); - private native void surfaceCreatedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder); - private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder, - int format, int width, int height); - - private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas); - private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder); - private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder); - private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder, - int format, int width, int height); - } - - public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo) - { - return new NativeSurfaceView (this, nativeSurfacePtr, forVideo); - } - - //============================================================================== - public final int[] renderGlyph (char glyph1, char glyph2, Paint paint, android.graphics.Matrix matrix, Rect bounds) - { - Path p = new Path(); - - char[] str = { glyph1, glyph2 }; - paint.getTextPath (str, 0, (glyph2 != 0 ? 2 : 1), 0.0f, 0.0f, p); - - RectF boundsF = new RectF(); - p.computeBounds (boundsF, true); - matrix.mapRect (boundsF); - - boundsF.roundOut (bounds); - bounds.left--; - bounds.right++; - - final int w = bounds.width(); - final int h = Math.max (1, bounds.height()); - - Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); - - Canvas c = new Canvas (bm); - matrix.postTranslate (-bounds.left, -bounds.top); - c.setMatrix (matrix); - c.drawPath (p, paint); - - final int sizeNeeded = w * h; - if (cachedRenderArray.length < sizeNeeded) - cachedRenderArray = new int [sizeNeeded]; - - bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h); - bm.recycle(); - return cachedRenderArray; - } - - private int[] cachedRenderArray = new int [256]; - - //============================================================================== - public static class NativeInvocationHandler implements InvocationHandler - { - public NativeInvocationHandler (Activity activityToUse, long nativeContextRef) - { - activity = activityToUse; - nativeContext = nativeContextRef; - } - - public void nativeContextDeleted() - { - nativeContext = 0; - } - - @Override - public void finalize() - { - activity.runOnUiThread (new Runnable() - { - @Override - public void run() - { - if (nativeContext != 0) - dispatchFinalize (nativeContext); - } - }); - } - - @Override - public Object invoke (Object proxy, Method method, Object[] args) throws Throwable - { - return dispatchInvoke (nativeContext, proxy, method, args); - } - - //============================================================================== - Activity activity; - private long nativeContext = 0; - - private native void dispatchFinalize (long nativeContextRef); - private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args); - } - - public InvocationHandler createInvocationHandler (long nativeContextRef) - { - return new NativeInvocationHandler (this, nativeContextRef); - } - - public void invocationHandlerContextDeleted (InvocationHandler handler) - { - ((NativeInvocationHandler) handler).nativeContextDeleted(); - } - - //============================================================================== - public static class HTTPStream - { - public HTTPStream (String address, boolean isPostToUse, byte[] postDataToUse, - String headersToUse, int timeOutMsToUse, - int[] statusCodeToUse, StringBuffer responseHeadersToUse, - int numRedirectsToFollowToUse, String httpRequestCmdToUse) throws IOException - { - isPost = isPostToUse; - postData = postDataToUse; - headers = headersToUse; - timeOutMs = timeOutMsToUse; - statusCode = statusCodeToUse; - responseHeaders = responseHeadersToUse; - totalLength = -1; - numRedirectsToFollow = numRedirectsToFollowToUse; - httpRequestCmd = httpRequestCmdToUse; - - connection = createConnection (address, isPost, postData, headers, timeOutMs, httpRequestCmd); - } - - private final HttpURLConnection createConnection (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, String httpRequestCmdToUse) throws IOException - { - HttpURLConnection newConnection = (HttpURLConnection) (new URL(address).openConnection()); - - try - { - newConnection.setInstanceFollowRedirects (false); - newConnection.setConnectTimeout (timeOutMs); - newConnection.setReadTimeout (timeOutMs); - - // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines. - // So convert headers string to an array, with an element for each line - String headerLines[] = headers.split("\\n"); - - // Set request headers - for (int i = 0; i < headerLines.length; ++i) - { - int pos = headerLines[i].indexOf (":"); - - if (pos > 0 && pos < headerLines[i].length()) - { - String field = headerLines[i].substring (0, pos); - String value = headerLines[i].substring (pos + 1); - - if (value.length() > 0) - newConnection.setRequestProperty (field, value); - } - } - - newConnection.setRequestMethod (httpRequestCmd); - - if (isPost) - { - newConnection.setDoOutput (true); - - if (postData != null) - { - OutputStream out = newConnection.getOutputStream(); - out.write(postData); - out.flush(); - } - } - - return newConnection; - } - catch (Throwable e) - { - newConnection.disconnect(); - throw new IOException ("Connection error"); - } - } - - private final InputStream getCancellableStream (final boolean isInput) throws ExecutionException - { - synchronized (createFutureLock) - { - if (hasBeenCancelled.get()) - return null; - - streamFuture = executor.submit (new Callable() - { - @Override - public BufferedInputStream call() throws IOException - { - return new BufferedInputStream (isInput ? connection.getInputStream() - : connection.getErrorStream()); - } - }); - } - - try - { - return streamFuture.get(); - } - catch (InterruptedException e) - { - return null; - } - catch (CancellationException e) - { - return null; - } - } - - public final boolean connect() - { - boolean result = false; - int numFollowedRedirects = 0; - - while (true) - { - result = doConnect(); - - if (! result) - return false; - - if (++numFollowedRedirects > numRedirectsToFollow) - break; - - int status = statusCode[0]; - - if (status == 301 || status == 302 || status == 303 || status == 307) - { - // Assumes only one occurrence of "Location" - int pos1 = responseHeaders.indexOf ("Location:") + 10; - int pos2 = responseHeaders.indexOf ("\n", pos1); - - if (pos2 > pos1) - { - String currentLocation = connection.getURL().toString(); - String newLocation = responseHeaders.substring (pos1, pos2); - - try - { - // Handle newLocation whether it's absolute or relative - URL baseUrl = new URL (currentLocation); - URL newUrl = new URL (baseUrl, newLocation); - String transformedNewLocation = newUrl.toString(); - - if (transformedNewLocation != currentLocation) - { - // Clear responseHeaders before next iteration - responseHeaders.delete (0, responseHeaders.length()); - - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - connection.disconnect(); - - try - { - connection = createConnection (transformedNewLocation, isPost, - postData, headers, timeOutMs, - httpRequestCmd); - } - catch (Throwable e) - { - return false; - } - } - } - else - { - break; - } - } - catch (Throwable e) - { - return false; - } - } - else - { - break; - } - } - else - { - break; - } - } - - return result; - } - - private final boolean doConnect() - { - synchronized (createStreamLock) - { - if (hasBeenCancelled.get()) - return false; - - try - { - try - { - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - { - if (connection.getResponseCode() < 400) - { - statusCode[0] = connection.getResponseCode(); - connection.disconnect(); - return false; - } - } - finally - { - statusCode[0] = connection.getResponseCode(); - } - - try - { - if (statusCode[0] >= 400) - inputStream = getCancellableStream (false); - else - inputStream = getCancellableStream (true); - } - catch (ExecutionException e) - {} - - for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) - { - if (entry.getKey() != null && entry.getValue() != null) - { - responseHeaders.append(entry.getKey() + ": " - + android.text.TextUtils.join(",", entry.getValue()) + "\n"); - - if (entry.getKey().compareTo ("Content-Length") == 0) - totalLength = Integer.decode (entry.getValue().get (0)); - } - } - - return true; - } - catch (IOException e) - { - return false; - } - } - } - - static class DisconnectionRunnable implements Runnable - { - public DisconnectionRunnable (HttpURLConnection theConnection, - InputStream theInputStream, - ReentrantLock theCreateStreamLock, - Object theCreateFutureLock, - Future theStreamFuture) - { - connectionToDisconnect = theConnection; - inputStream = theInputStream; - createStreamLock = theCreateStreamLock; - createFutureLock = theCreateFutureLock; - streamFuture = theStreamFuture; - } - - public void run() - { - try - { - if (! createStreamLock.tryLock()) - { - synchronized (createFutureLock) - { - if (streamFuture != null) - streamFuture.cancel (true); - } - - createStreamLock.lock(); - } - - if (connectionToDisconnect != null) - connectionToDisconnect.disconnect(); - - if (inputStream != null) - inputStream.close(); - } - catch (IOException e) - {} - finally - { - createStreamLock.unlock(); - } - } - - private HttpURLConnection connectionToDisconnect; - private InputStream inputStream; - private ReentrantLock createStreamLock; - private Object createFutureLock; - Future streamFuture; - } - - public final void release() - { - DisconnectionRunnable disconnectionRunnable = new DisconnectionRunnable (connection, - inputStream, - createStreamLock, - createFutureLock, - streamFuture); - - synchronized (createStreamLock) - { - hasBeenCancelled.set (true); - - connection = null; - } - - Thread disconnectionThread = new Thread(disconnectionRunnable); - disconnectionThread.start(); - } - - public final int read (byte[] buffer, int numBytes) - { - int num = 0; - - try - { - synchronized (createStreamLock) - { - if (inputStream != null) - num = inputStream.read (buffer, 0, numBytes); - } - } - catch (IOException e) - {} - - if (num > 0) - position += num; - - return num; - } - - public final long getPosition() { return position; } - public final long getTotalLength() { return totalLength; } - public final boolean isExhausted() { return false; } - public final boolean setPosition (long newPos) { return false; } - - private boolean isPost; - private byte[] postData; - private String headers; - private int timeOutMs; - String httpRequestCmd; - private HttpURLConnection connection; - private int[] statusCode; - private StringBuffer responseHeaders; - private int totalLength; - private int numRedirectsToFollow; - private InputStream inputStream; - private long position; - private final ReentrantLock createStreamLock = new ReentrantLock(); - private final Object createFutureLock = new Object(); - private AtomicBoolean hasBeenCancelled = new AtomicBoolean(); - - private final ExecutorService executor = Executors.newCachedThreadPool (Executors.defaultThreadFactory()); - Future streamFuture; - } - - public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData, - String headers, int timeOutMs, int[] statusCode, - StringBuffer responseHeaders, int numRedirectsToFollow, - String httpRequestCmd) - { - // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL) - if (timeOutMs < 0) - timeOutMs = 0; - else if (timeOutMs == 0) - timeOutMs = 30000; - - for (;;) - { - try - { - HTTPStream httpStream = new HTTPStream (address, isPost, postData, headers, - timeOutMs, statusCode, responseHeaders, - numRedirectsToFollow, httpRequestCmd); - - return httpStream; - } - catch (Throwable e) {} - - return null; - } - } - - public final void launchURL (String url) - { - startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url))); - } - - private native boolean webViewPageLoadStarted (long host, WebView view, String url); - private native void webViewPageLoadFinished (long host, WebView view, String url); - private native void webViewReceivedError (long host, WebView view, WebResourceRequest request, WebResourceError error); private native void webViewReceivedHttpError (long host, WebView view, WebResourceRequest request, WebResourceResponse errorResponse); private native void webViewReceivedSslError (long host, WebView view, SslErrorHandler handler, SslError error); - private native void webViewCloseWindowRequest (long host, WebView view); - private native void webViewCreateWindowRequest (long host, WebView view); - - //============================================================================== - public class JuceWebViewClient extends WebViewClient - { - public JuceWebViewClient (long hostToUse) - { - host = hostToUse; - } - - public void hostDeleted() - { - synchronized (hostLock) - { - host = 0; - } - } - - @Override - public void onPageFinished (WebView view, String url) - { - if (host == 0) - return; - - webViewPageLoadFinished (host, view, url); - } - - @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) - { - if (host == 0) - return; - - webViewReceivedSslError (host, view, handler, error); - } - - @Override - public void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error) - { - if (host == 0) - return; - - webViewReceivedError (host, view, request, error); - } - - @Override - public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) - { - if (host == 0) - return; - - webViewReceivedHttpError (host, view, request, errorResponse); - } - - @Override - public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) - { - synchronized (hostLock) - { - if (host != 0) - { - boolean shouldLoad = webViewPageLoadStarted (host, view, request.getUrl().toString()); - - if (shouldLoad) - return null; - } - } - - return new WebResourceResponse ("text/html", null, null); - } - - private long host; - private final Object hostLock = new Object(); - } - - public class JuceWebChromeClient extends WebChromeClient - { - public JuceWebChromeClient (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onCloseWindow (WebView window) - { - webViewCloseWindowRequest (host, window); - } - - @Override - public boolean onCreateWindow (WebView view, boolean isDialog, - boolean isUserGesture, Message resultMsg) - { - webViewCreateWindowRequest (host, view); - return false; - } - - private long host; - private final Object hostLock = new Object(); - } - - - //============================================================================== - public class CameraDeviceStateCallback extends CameraDevice.StateCallback - { - private native void cameraDeviceStateClosed (long host, CameraDevice camera); - private native void cameraDeviceStateDisconnected (long host, CameraDevice camera); - private native void cameraDeviceStateError (long host, CameraDevice camera, int error); - private native void cameraDeviceStateOpened (long host, CameraDevice camera); - - CameraDeviceStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onClosed (CameraDevice camera) - { - cameraDeviceStateClosed (host, camera); - } - - @Override - public void onDisconnected (CameraDevice camera) - { - cameraDeviceStateDisconnected (host, camera); - } - - @Override - public void onError (CameraDevice camera, int error) - { - cameraDeviceStateError (host, camera, error); - } - - @Override - public void onOpened (CameraDevice camera) - { - cameraDeviceStateOpened (host, camera); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback - { - private native void cameraCaptureSessionActive (long host, CameraCaptureSession session); - private native void cameraCaptureSessionClosed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigureFailed (long host, CameraCaptureSession session); - private native void cameraCaptureSessionConfigured (long host, CameraCaptureSession session); - private native void cameraCaptureSessionReady (long host, CameraCaptureSession session); - - CameraCaptureSessionStateCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onActive (CameraCaptureSession session) - { - cameraCaptureSessionActive (host, session); - } - - @Override - public void onClosed (CameraCaptureSession session) - { - cameraCaptureSessionClosed (host, session); - } - - @Override - public void onConfigureFailed (CameraCaptureSession session) - { - cameraCaptureSessionConfigureFailed (host, session); - } - - @Override - public void onConfigured (CameraCaptureSession session) - { - cameraCaptureSessionConfigured (host, session); - } - - @Override - public void onReady (CameraCaptureSession session) - { - cameraCaptureSessionReady (host, session); - } - - private long host; - } - - //============================================================================== - public class CameraCaptureSessionCaptureCallback extends CameraCaptureSession.CaptureCallback - { - private native void cameraCaptureSessionCaptureCompleted (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result); - private native void cameraCaptureSessionCaptureFailed (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, CaptureFailure failure); - private native void cameraCaptureSessionCaptureProgressed (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult); - private native void cameraCaptureSessionCaptureStarted (long host, boolean isPreview, CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber); - private native void cameraCaptureSessionCaptureSequenceAborted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId); - private native void cameraCaptureSessionCaptureSequenceCompleted (long host, boolean isPreview, CameraCaptureSession session, int sequenceId, long frameNumber); - - CameraCaptureSessionCaptureCallback (long hostToUse, boolean shouldBePreview) - { - host = hostToUse; - preview = shouldBePreview; - } - - @Override - public void onCaptureCompleted (CameraCaptureSession session, CaptureRequest request, - TotalCaptureResult result) - { - cameraCaptureSessionCaptureCompleted (host, preview, session, request, result); - } - - @Override - public void onCaptureFailed (CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) - { - cameraCaptureSessionCaptureFailed (host, preview, session, request, failure); - } - - @Override - public void onCaptureProgressed (CameraCaptureSession session, CaptureRequest request, - CaptureResult partialResult) - { - cameraCaptureSessionCaptureProgressed (host, preview, session, request, partialResult); - } - - @Override - public void onCaptureSequenceAborted (CameraCaptureSession session, int sequenceId) - { - cameraCaptureSessionCaptureSequenceAborted (host, preview, session, sequenceId); - } - - @Override - public void onCaptureSequenceCompleted (CameraCaptureSession session, int sequenceId, long frameNumber) - { - cameraCaptureSessionCaptureSequenceCompleted (host, preview, session, sequenceId, frameNumber); - } - - @Override - public void onCaptureStarted (CameraCaptureSession session, CaptureRequest request, long timestamp, - long frameNumber) - { - cameraCaptureSessionCaptureStarted (host, preview, session, request, timestamp, frameNumber); - } - - private long host; - private boolean preview; - } - - //============================================================================== - public class JuceOrientationEventListener extends OrientationEventListener - { - private native void deviceOrientationChanged (long host, int orientation); - - public JuceOrientationEventListener (long hostToUse, Context context, int rate) - { - super (context, rate); - - host = hostToUse; - } - - @Override - public void onOrientationChanged (int orientation) - { - deviceOrientationChanged (host, orientation); - } - - private long host; - } - - - //============================================================================== - public class MediaControllerCallback extends MediaController.Callback - { - private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info); - private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata); - private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state); - private native void mediaControllerSessionDestroyed (long host); - - MediaControllerCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onAudioInfoChanged (MediaController.PlaybackInfo info) - { - mediaControllerAudioInfoChanged (host, info); - } - - @Override - public void onMetadataChanged (MediaMetadata metadata) - { - mediaControllerMetadataChanged (host, metadata); - } - - @Override - public void onPlaybackStateChanged (PlaybackState state) - { - mediaControllerPlaybackStateChanged (host, state); - } - - @Override - public void onQueueChanged (List queue) {} - - @Override - public void onSessionDestroyed() - { - mediaControllerSessionDestroyed (host); - } - - private long host; - } - - //============================================================================== - public class MediaSessionCallback extends MediaSession.Callback - { - private native void mediaSessionPause (long host); - private native void mediaSessionPlay (long host); - private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras); - private native void mediaSessionSeekTo (long host, long pos); - private native void mediaSessionStop (long host); - - - MediaSessionCallback (long hostToUse) - { - host = hostToUse; - } - - @Override - public void onPause() - { - mediaSessionPause (host); - } - - @Override - public void onPlay() - { - mediaSessionPlay (host); - } - - @Override - public void onPlayFromMediaId (String mediaId, Bundle extras) - { - mediaSessionPlayFromMediaId (host, mediaId, extras); - } - - @Override - public void onSeekTo (long pos) - { - mediaSessionSeekTo (host, pos); - } - - @Override - public void onStop() - { - mediaSessionStop (host); - } - - @Override - public void onFastForward() {} - - @Override - public boolean onMediaButtonEvent (Intent mediaButtonIntent) - { - return true; - } - - @Override - public void onRewind() {} - - @Override - public void onSkipToNext() {} - - @Override - public void onSkipToPrevious() {} - - @Override - public void onSkipToQueueItem (long id) {} - - private long host; - } - - //============================================================================== - public class SystemVolumeObserver extends ContentObserver - { - private native void mediaSessionSystemVolumeChanged (long host); - - SystemVolumeObserver (Activity activityToUse, long hostToUse) - { - super (null); - - activity = activityToUse; - host = hostToUse; - } - - void setEnabled (boolean shouldBeEnabled) - { - if (shouldBeEnabled) - activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this); - else - activity.getApplicationContext().getContentResolver().unregisterContentObserver (this); - } - - @Override - public void onChange (boolean selfChange, Uri uri) - { - if (uri.toString().startsWith ("content://settings/system/volume_music")) - mediaSessionSystemVolumeChanged (host); - } - - private Activity activity; - private long host; - } - - - //============================================================================== - public static final String getLocaleValue (boolean isRegion) - { - java.util.Locale locale = java.util.Locale.getDefault(); - - return isRegion ? locale.getCountry() - : locale.getLanguage(); - } - - private static final String getFileLocation (String type) - { - return Environment.getExternalStoragePublicDirectory (type).getAbsolutePath(); - } - - public static final String getDocumentsFolder() - { - if (getAndroidSDKVersion() >= 19) - return getFileLocation ("Documents"); - - return Environment.getDataDirectory().getAbsolutePath(); - } - - public static final String getPicturesFolder() { return getFileLocation (Environment.DIRECTORY_PICTURES); } - public static final String getMusicFolder() { return getFileLocation (Environment.DIRECTORY_MUSIC); } - public static final String getMoviesFolder() { return getFileLocation (Environment.DIRECTORY_MOVIES); } - public static final String getDownloadsFolder() { return getFileLocation (Environment.DIRECTORY_DOWNLOADS); } - - //============================================================================== - @Override - protected void onActivityResult (int requestCode, int resultCode, Intent data) - { - appActivityResult (requestCode, resultCode, data); - } - - @Override - protected void onNewIntent (Intent intent) - { - super.onNewIntent(intent); - setIntent(intent); - - appNewIntent (intent); - } - - //============================================================================== - public final Typeface getTypeFaceFromAsset (String assetName) - { - try - { - return Typeface.createFromAsset (this.getResources().getAssets(), assetName); - } - catch (Throwable e) {} - - return null; - } - - final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); - - public static String bytesToHex (byte[] bytes) - { - char[] hexChars = new char[bytes.length * 2]; - - for (int j = 0; j < bytes.length; ++j) - { - int v = bytes[j] & 0xff; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0f]; - } - - return new String (hexChars); - } - - final private java.util.Map dataCache = new java.util.HashMap(); - - synchronized private final File getDataCacheFile (byte[] data) - { - try - { - java.security.MessageDigest digest = java.security.MessageDigest.getInstance ("MD5"); - digest.update (data); - - String key = bytesToHex (digest.digest()); - - if (dataCache.containsKey (key)) - return (File) dataCache.get (key); - - File f = new File (this.getCacheDir(), "bindata_" + key); - f.delete(); - FileOutputStream os = new FileOutputStream (f); - os.write (data, 0, data.length); - dataCache.put (key, f); - return f; - } - catch (Throwable e) {} - - return null; - } - - private final void clearDataCache() - { - java.util.Iterator it = dataCache.values().iterator(); - - while (it.hasNext()) - { - File f = (File) it.next(); - f.delete(); - } - } - - public final Typeface getTypeFaceFromByteArray (byte[] data) - { - try - { - File f = getDataCacheFile (data); - - if (f != null) - return Typeface.createFromFile (f); - } - catch (Exception e) - { - Log.e ("JUCE", e.toString()); - } - - return null; - } - - public static final int getAndroidSDKVersion() - { - return android.os.Build.VERSION.SDK_INT; - } - - public final String audioManagerGetProperty (String property) - { - Object obj = getSystemService (AUDIO_SERVICE); - if (obj == null) - return null; - - java.lang.reflect.Method method; - - try - { - method = obj.getClass().getMethod ("getProperty", String.class); - } - catch (SecurityException e) { return null; } - catch (NoSuchMethodException e) { return null; } - - if (method == null) - return null; - - try - { - return (String) method.invoke (obj, property); - } - catch (java.lang.IllegalArgumentException e) {} - catch (java.lang.IllegalAccessException e) {} - catch (java.lang.reflect.InvocationTargetException e) {} - - return null; - } - - public final boolean hasSystemFeature (String property) - { - return getPackageManager().hasSystemFeature (property); - } -} diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/SharingContentProvider.java b/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/SharingContentProvider.java deleted file mode 100644 index f8dd82b0d5..0000000000 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/java/com/roli/juce/pluginhost/SharingContentProvider.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.roli.juce.pluginhost; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.res.AssetFileDescriptor; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.net.Uri; -import android.os.FileObserver; -import android.os.ParcelFileDescriptor; -import java.lang.String; - -public final class SharingContentProvider extends ContentProvider -{ - private Object lock = new Object(); - - private native void contentSharerFileObserverEvent (long host, int event, String path); - - private native Cursor contentSharerQuery (Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder); - - private native void contentSharerCursorClosed (long host); - - private native AssetFileDescriptor contentSharerOpenFile (Uri uri, String mode); - private native String[] contentSharerGetStreamTypes (Uri uri, String mimeTypeFilter); - - public final class ProviderFileObserver extends FileObserver - { - public ProviderFileObserver (long hostToUse, String path, int mask) - { - super (path, mask); - - host = hostToUse; - } - - public void onEvent (int event, String path) - { - contentSharerFileObserverEvent (host, event, path); - } - - private long host; - } - - public final class ProviderCursor extends MatrixCursor - { - ProviderCursor (long hostToUse, String[] columnNames) - { - super (columnNames); - - host = hostToUse; - } - - @Override - public void close() - { - super.close(); - - contentSharerCursorClosed (host); - } - - private long host; - } - - @Override - public boolean onCreate() - { - return true; - } - - @Override - public Cursor query (Uri url, String[] projection, String selection, - String[] selectionArgs, String sortOrder) - { - synchronized (lock) - { - return contentSharerQuery (url, projection, selection, selectionArgs, sortOrder); - } - } - - @Override - public Uri insert (Uri uri, ContentValues values) - { - return null; - } - - @Override - public int update (Uri uri, ContentValues values, String selection, - String[] selectionArgs) - { - return 0; - } - - @Override - public int delete (Uri uri, String selection, String[] selectionArgs) - { - return 0; - } - - @Override - public String getType (Uri uri) - { - return null; - } - - @Override - public AssetFileDescriptor openAssetFile (Uri uri, String mode) - { - synchronized (lock) - { - return contentSharerOpenFile (uri, mode); - } - } - - @Override - public ParcelFileDescriptor openFile (Uri uri, String mode) - { - synchronized (lock) - { - AssetFileDescriptor result = contentSharerOpenFile (uri, mode); - - if (result != null) - return result.getParcelFileDescriptor(); - - return null; - } - } - - @Override - public String[] getStreamTypes (Uri uri, String mimeTypeFilter) - { - synchronized (lock) - { - return contentSharerGetStreamTypes (uri, mimeTypeFilter); - } - } - -} diff --git a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost.sln b/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost.sln deleted file mode 100644 index 4b182719dc..0000000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost.sln +++ /dev/null @@ -1,20 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2013 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioPluginHost - App", "AudioPluginHost_App.vcxproj", "{5666EAA2-C82B-D06A-5228-D0E810428536}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.ActiveCfg = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.Build.0 = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.ActiveCfg = Release|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj deleted file mode 100644 index b2e9e6a442..0000000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj +++ /dev/null @@ -1,2650 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {5666EAA2-C82B-D06A-5228-D0E810428536} - - - - Application - false - false - v120 - 8.1 - - - Application - false - true - v120 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /w44265 /w44062 %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\AudioPluginHost.pdb - Windows - true - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /w44265 /w44062 %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\AudioPluginHost.pdb - Windows - true - true - true - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj.filters deleted file mode 100644 index 6f57dc95b9..0000000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2013/AudioPluginHost_App.vcxproj.filters +++ /dev/null @@ -1,4532 +0,0 @@ - - - - - - {01436C03-42F4-5952-30EF-7F9E81D997C6} - - - {8C61EB30-11E6-7029-4CC8-56C52EB1F1C3} - - - {57E59C1B-8971-243F-9A1A-8EABFD456232} - - - {297DEAC9-184C-CA1D-D75C-DAA34116691C} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {02D37B85-7DE2-C8E7-A274-A5A0FBE99D69} - - - {DAF3BAAF-5207-4C34-61B9-A97DDC930D50} - - - {C7885588-8436-4C21-DC1E-58879BF53BDC} - - - {E4ECEA39-0EFF-2443-91B3-1E5DA7AD5AE4} - - - {210B8D25-68E0-32C3-1449-6A40F109C5E9} - - - {378AD911-E8E4-D230-E76B-34542849509D} - - - {F6CED5B6-0A8C-56D2-C1AC-DED6BE774A13} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {CB8DF3B2-0409-6D59-C5D4-A034EBB7F973} - - - {7774F72F-C951-B8AB-E927-E34AD23C52C8} - - - {658BADF8-7095-C722-F9EC-9F36E8818187} - - - {2C58F450-CD01-0231-2F16-0D4D68565164} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\Filters - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.2\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/extras/AudioPluginHost/Builds/VisualStudio2013/icon.ico b/extras/AudioPluginHost/Builds/VisualStudio2013/icon.ico deleted file mode 100644 index 09d32ad703e414097a17e969e7d765325e912c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33530 zcmeFZ2Ur!!);7AyAV`*=L_t770Tn?cqhv{nfQsY{l9S{l5(ET9KynU(A_9^(ISWdV zoO6zwv^RabnZq2%qchHY=lh@g-23F|q zFbNn8#=!8~b0+vc4}8bP^{?l1Fxb6Q;0NFZeUFrc!4COhFgEZR{1kli+j}sBiGbz) zx360zW{mnxo?+30Z$@$^$_}9f-jC`vdxguE8K3<#`FE@B^s)y_5RJK=K!$ArP~cYy zbmi#-tqD@VP{Rx0&2YhvO0Av2kLrNRep=}R-g=e+k@wS%(p!&Gpfl?MQ2m_sD0O70 z0UfLT!1r}XRv9v+4U{7sjhBI{ycr-?FZ(~r*N0yL=6Z^O;l_L*cdTUR+qUR7dxoYb zt^tYyvw*t9-0yW9%ResLTbc-T6~zG411$j5AII&89?Tgsf4F#5{2)>J%{6_7NCqD)>E(wH5== zxcs|(Das~!1u%ZS^n0>NUIs=Mk-+E<3UFE21gz#Zeos%p=Wolu>dzU{2wwmMTxX7w zq|YqyrVRo3lx_nqojbsr`8_~+autvqUpY#8GwTrkkz@I~%^o3fRjYp}`!IC_a4y^i ztlJTQB7Ex)btJ8B0+5a!mzSw9p-&wy-!_e1I+6>Oy_2y1dwGe9&EM;=0o##2UV(u0 z^te2f-+^1}w6F96E=Ai%Wxp>E)nNs;>C?(r0MfN@%O2lDb)=7!Z)bLH0hVvKerx~d z9T4j_kTik-(niY>KP!7&2hW+5x}bcmVu%NwUJkMee=9iT?=>$ufiMGF7HSVFMWeRR6-rGEkq= z4rDtO0Wq4HKyT#`XanB@wJ$CKZOQV$P?ayRG5Z-<-dhJE1~LJ#?1)sEiNHU>0QTdf z2Mtg5y4D7P#jzD2->3X{|8eX`8q+&~(YoN@{m8LD>CAcvY|eKBJ?q23!v^Pli3$^) zzk>nnI}OkepccV??x`3AqBJu8LpFrrXYwH&H6iT4bVuq@zZtZ6AO0!^sZt|8sNIlk z=qh}@Rp4qr9gi?r1(j{^DEt zDpl?T4;r11eg`kv0aBtj|1z~T>>hm&{n%Wb1m^l%|1zyk4IGt$eAc&q^I=IK{;~YR zPYB>;$;Mx%`o4e5Z`s)gUaunlG8J#_{ZKyC7q{USNBuA1GxvMEdK|ZYpBqFk0`nUv zpmpK^XkJ1B^LvMYH5fl0$FV=lZ%_PYQMKrd?XPvsxWcKomf zB)9GY@xyz7SqtKqFc{Bnfcgi<+hF_v$^7;L?NV&TTni9cy75!_-^zyK;A8nv4E!q? zqQNnO;s+>(`BpY`587TuuWoRT%pUwu{`a!Km;Wmm2KJBu6vIGq)c5jLvQ@Ch!B>PA{=z~E2+t&%Mg$uy-m2<|*k)A`k2Fd$AeLMb;+;7vd zKKL$f0fn2p02D_-u^bdn{!IQ6hB9Lw^?IjW$QDCaU?t)|KrsvyM?taN&*s_Rk$?OxWFH_K1=&f+Rzv;* z@>x)Vd^c#*dY~8vilZRR$L0PvbI5P1WV;jmZ_4=JuKQ>V58VL(jsejI07yQ$BVjP% zT^Njh4F)3`gTZj11c$*ezE2(?wE(5>-$T!1|0)O70o4W73DphBIFbd)1TToE-~y8t zn11IeK<@PaUjP5-0nQKwV!7JKbP&IGF;e#b2$%CudRD$p=j5$wGe(Jz#)=Z)}Ed;!S7&9^}x(RHib_#xy=eig$%`A+784m}iOE7n*eZ90O1HjuwQKq7(d zwH;u7XbEV|{Q|rL`K)+@H^3X$5@2h28(c#!038|XK>f>W;NHkXV5}hwSfA+x-!B3v zi>$i9TMKg5(0=WaMOs@lNd0j_5Q1qkB z|KNh=1{Q&>`5vG;nC%Z-TulfE(2=eRwj~1CS{eZB+66w&HUNgLKF}JZ2b?2!euUwl zzLP99xd-a&yvvt}!&z|b_jdPzPx(DSvf108a(EDrG26EQY|eH40sAqRc+BNBMGFDr zjS;}X-qum9S6kS z^!K+M+^^t2Zc9z@d7%59G025Y0o&lXhV-WbpiJcdv<={zMjq6exxlYUM;sS4CmS<5 z{}T6cJN~NwkMSSp5YG%Fs54N%A72CYW5ADe{TTDN z`QO10@xpW6xyNFT#^GPO)bmf~v{a=@ydF4LXLc5W#d#zUAHD&Uyhi|tP2|y>jnT^b z%W?Qs{1DGSS{Di+_qKu6seWJ<m22zyEV5%wdFvG_GGKiGa`TOt1d&V{aD@zW9&#*aY1y4k$k4NQYPn*N=I|KL5L zamY#9I?^R*9Db%te}?~Comm|D{CmHD%a8U|rUAQ~D@Q&K^3zbP@uNOJekWXILIAci z#ro58VE+IGyh+~reZK(e`)|{?x&-;KAL-K1@c&F_zQqpRL;DNR7@$zdqgdl8Uiy=m z4~licc{^GGu9w%qH9d4b;9Jb!-~W{^{Rsb`>I{ha`!+!Q^}#OUC|-hMJ}7QI?(gq& zFs78g-{5p)bB6m5fP0{>e~@A3bN&U}v_n$L*U`6F%uid&)B`+MBS&mfNw z{N!^uu)ej~{xTA80#@TcOw+T0b1){XUm0H>nQ? z_gDA87}(S1k9$?eSbvuPNSBWB|6QH=z75bG7ZiI#>j!8J^gZt5XVBj+rHvII`9K}T z|FkuCr-#A|$yU*)+K9;83{Q@`ntS=`be z_By`b>-yQVu=@<~x?%%Z-#I*L0}>=*H^3ih>pOtl#Bb-hezp(xv-cL@9vXB(@ff5( z5I6HZe&`wGKEU}~bo8xK;QZglFXAx+q}Oc%o8XRL#;09i7~I1f+d=_xAb-6Hw&C5z z?mue7-O05hOc1XjU1_@cBka&SF!rep>(2n~=RRNyo~Qd+AOGmRxaTbJx_sjZ`@8Nv z;9k-?&^w0&2EhGDsme_teRTh*4XNN-Umo1|`B`88=)E1dM|E&`aKz0>mK(SI48LTV zagfuI|Jnr7>b8CvzX+%^F(7tm?=&6kcL+PQmvM|A+Ov@c+YmdrceI}gwc+pR67)U9 z%|QH;M7hz+pW(k*Y$T~(?+DBw7J&h9|3cjBx4pI>_4o0+Z*>O3uAcnwJ)v*$Lv4_& z+B#~(-_a$goqgc`B*Ym(9GS#N1I3@=hwKtK2S%WIz6$EC`CrW8AL-2T9@6*yf4qkW zjlC9i@ z|2w)Q3-&!^xAsB*0r7m$Iuhbre}*4=55~_Aq~T^8jZ2?_$z>#P_xXR?p+D1^U%~&Y zy7X{r4VVD^2E_A0TqPL)YyBB^=y&3I8e~#c#_f;W1CIEftcEQBvgybD{#QEltN4${ z;b*!e4W9kY1p6N1`5>+mjQu}Dobg}bhkk#n#8640#%lllbTxng+wY#e3J8K{jekXF z{to`*HvGsgd4c=e2o&mwtAzMgh%^2b?8o1L^B`KM*#nqHEC7q3U5qZ<0E#<6{tfg^ z-`kmQF@Jmiz5Rjk{wRHGm#Vh+fcP~8umHvk5LXHDtF&@@$1KD7VjsW!?;wmA&72=E`-up*b{^>hNm!SCo z&1uLkLHaqnjso(&>;Z1Y+kkq?zvG7Eap+$_9-W(z{BGXLfw*nJb2u4e`@rNj>WJt2 z0LI1;-wJWYk`+es{}kt+m4oIqWS1b@3i$`f$L)g)EhyF>0oQBqy7mB{vTZ;=YZGuS z+B(v;74Qt4J!rSo>$ZU>ojX7l*w=%gJzE9e?}PRc;`t!165?AS&KTmo{|v)_<9CpM zfP5U}r!ByCK=Be3^R4f19>w0rw(9#F;x!;{2GSFVBZGK8h^vJ7)>|NF{NKR#t93wr z8q}u;kZp!yJ}7R5VsB{u0Ih+bbsV%7h4!@|P5|OHAZ`Zw2I9ydo)0XW0-Zk+DANAd zUxfXt^#9&>P|OF#tx)U@tskH@5VVei)}qjQ8sY??dx)EX_$7!VgLpou48*to_mKQ| zYl7C(5GMd7h@1KE*8YEM`+rLh{AMGd!$Z&ov_W;iqK{?bQ@CSGn2|SGigMr1sg8$0tVKA^bcv=bkJ1Qs#|CZ`FAA_F3Q)R!J z!=dlNzsdSpJ_h~%Z`5~;<2XOY`3L-9JC550K=p$^es4GYU;QxluYLh5poe~c+;7nR zQ9AC|<9_}v_g9pcJbB_YG`~(tOWjn4PHRC47dlDt&^prq%rI@lr0?Q_mkX}mGZ>5k zCVf-%u4C+SoP#4xPY+P#U{GZ0&{L+T9%-&#^sxGruGdKxJSuc5DK@kXQW*wDVg|fs zS@iL9&73~*B1VkeB3#2)@5ouzRyaI(|3uxma6rgrbv2}r0Ij_(Qr*~rCt-HHI%IYw zu3)5O^!m<-O$VCoKfjd8FArhQ8Fd6vUm0vH4L1<(A@IwM?i&phwP!Wds?`N!-JTy#R5A81;f**`#36$tYUjoy}g zV2dWDu-me?=c{t%gvkYiDb+J?YSd)rjcSsD)*ePzw@u@-e3EwzX2paBx;#_1U+R#t zM7j%8gx$;{Pkwa%W?3q+IhGU|tK~^i1tZPbyh@CA(;GXh4?ho}i*zGjFEF3dfGNku zoQ|?K49U$EN^{KaVWh$Fl9tHfdh`zW7L5WQ3pZB_JejI5Mhq6r#2|o{qLt(^M|x1} ze7>IWd|fa7{u|w{6`~ss_A5(E^g6A!IwF)F6s#gL8NvE64}&qSLk=g5k^-}B@#jl3*-)K_KDk-ZW*UZgN9Yl}u@U}B<`jeLY^ z%XY%bAf^j!BkZz$#K0n*s#LOQjE3eIkD)I|u=UhlxkYHMZ`{pr`O5PgTOw`8&sbVi znF2|d4QGg2D6Y4@F+5|A6!TVLOVsAydW^Ibg*_T$c*?BMN&9Gi6~C%<{pHi?GEHMM z+Q(fIr%Pc3Bs^DaXd5-ucQi~Z=MU~>Xfu-Vv7ef^eEpKtQUDD@Oi0yI1x|Lj)9cP# z@gDVDe7V;As}$H`y~`L+uT%<8rh0LIYUSvE+I1bnkUqdk00TppfPkDpGY?57CL#hS zA>>22)0nr4FnV%(c%GdI4oyiI4|cuQ4_2OryYK8pzg3JGzq_?AZc+T$X!{(hfr(rL z76uPW>v?&nQqwNF`U0|3k5WQbdwFz=fFMFzE2tVytqd?G2Mob2QBq3EJea(U$&sTI0 zHd(GQypf(|qS1hnrlzMiTwRW=NxPoboAA2ec~_z1AW`{?0s{F6!{^l>m(FKe2T7Kg z6D&2DoqQutCzMZraYWo`ZK=L;Bp1v?EjqDajRL_p$1n*QH65#}ZtRX_XA}vS0JN%_ zHF3dOwrJ17lkWtWv1;!OW{gioa*XjkIcb>-$WG5oy0sZbo&+zc+7(ty* zECz`H7Rr8kRQoP_!Nx`26WDnXGV3LK7&f~P?=Z4Vx7SP|uV-4xd-)d|nOT`Ie&Hf? zMrb|QIc+w7-`8G~43}|?c+}R@5;N%iBTa{~>ScxE;T(KXvpIC)b9Q!I@&`T0)}{KH z2UrD))f1<83C@Ox8eXdV;I$W}^bVG?G|BUtJ%j1uNNwNH_Vr35fY`iJ!qO+C^$Onw zOhMP&L+5*=1Uoz~BEJ?lrmQ1izB{K<xO zZv+hT?>u>|hUns957RbeNyLXUbjPd2@Xk)GR~4L!d8+{X# zl~}4Dw^i2!*jVZ`J7`mwN#}?7mM7+khn6D5O-4^&#RM)xprC z7OHT%w&-Ep9M_({9=&NaTC1gO8QQ_^A^qaeiRl?PWw|*ypCPSdqoXAvpP?bvr)o3N z{xfl}gNu*D>3B)Ms_QI_V~$>-3Par=at{KE-SVx(l?mjo*rLIjutGY@SS*4j0ocql zgm{GXJ8BxWhfYE>uj2Fe5VZJCjCM;;``({YUc9F0a3zY0kH1rQh$oRWXi~w`X@p0K zhlm$>rWysnbToW)ubw4{MT<=%clo5ZR&oVysDREr)6o0s1S#42tpiEN#kH=v6CWB_ zFlq4023_1A?RAa|UwvbSYhtpj{0iJ2wE&Ux^9 z6svf4B;Y4$QG9%pe|nqVpMAG{+nmF~5j#Hg#==FF8j@$CrPFJr!LlPIc3t;w2T6-d zyn)3YG{vU*PSUuu(liHNTgS$zkDaJjyS%T=clAli=Xh)%qPJqZofkSs(o;NFoBi>} zmTooiA5>e&pQ;qoYPDdre=FO9LOa2A;?qOSN-a8qTchZ+nLSen*v#}JrbymJ$*8-%-D@*#2ySgQ?`pWuE)$7@YT3edncJ(`nVKO&52V+{MgNP&KD1p0h6N-D}Peg=fMaz zv%6l7(lbuSY`AiOQ`#sRhGl036F)ny6<_Nc%IDX!`ifCK4Lw%FeCv^X^*IfxSp_v;Dt_+nGw8F!% zXyv__r>T5BT|Z-0(4vetMcn_&eVB>C4F4xoWBKg+6K$%>{#lhZ=UBAu*RwvB9@Y6aJDq;Sxv#*A)}4Y}JUOAZ#Q+cQ*H1oyOCKKl9w#_g$F(BAJ_@n4lq6{0S~wp=(##-3fJfk@YyV$Hd= z#myDv#C|Ee0eBKA5Gk1NqryeleZKpIB)kZ6u&%$!iTr9TQ)cgW)nb}!ruARU{$o|BU%lKUv3k^JNr7; zpnYZk2To7U(6H1A&NyPwIT&h-nj;2%Ld6P;B9vn9JE2{Qvn1mXyBFl3gG;}QS$PV; zS#NrpqFsERAM9IGG%AJ-3pqh&hHF*S(vKIY=)>EwKRuhr+8pPa(J}1UHxkl$PpKYx zubtCuczxi-^Y#9?nA8nU+AFh%=AXVKA$r z38Ti>9^~>UPhk-WTsRC zPYuUGh2ctIx1-oeK9_36K-5IvG8D`S=cnFZF`-cW9U6#3zK-w zW%xz?<)_=6G*4977yZ0#QE6x}S^8*K^Yzr&gPt#TN-X2fJ;F87J+B(Cj%Em+T&p}N zOR+#*wb{X8n#6)SY@0{S%$2Czm4Hun3r{IKj!a4CjBmR}OP5On><;!bk%7Z6v%*5F zlD>ug?uOZDLIjiwyI5ez;hzO`<`s`0tSM-TDm*{ z+&;K5?mEfhL*!0qNqrSpg5Sq)Y6NSvlwI@yA%V)@cw;hj6(!V1(Bhw**%W%?!s4e* zx;O{@@=jk0YK%EWU}#5|gEV9OIT?a$DkpGI`H+dV$$hn-00|FGWk2lt!PUR2SY#OP%!!ShUeGde?j%XD@M4066<{=tTy zoW^!1Nx7}qr18fo03b)z~D z5#3Q140g0I{Jn{5imby7p+keZhj%^G2!s>%DXI9TX-Iq$Qw@|x&e-9f&=J(SJe67w zdk8w9D&GE+hUaPL)8uN-OOSYt@Z*|<0j?J|`t%;GxcSQQjg+XbO>D+k27_wBF~y+wtxICKdj%_hIlBTWxECo4Y_hrUN&TOMQyX{9%H_X^nX6xuR!T+Mnp z%WBIh^!D`4XPn!wHU&GDX+1f2^nx%x>&v(_ z4s_C8q*amO%%Pr(3)bmyIhhl1r z;mpU)b?Eu0;H7h_`}ee1YT4w-+z3amD-~S2UNh;=G7|7GTnzmJcGR01X-Yv}Ks9Dq zjY)aISa@&tPRogg>-6`s`^2MtS{K~>#R7GtL>{i4+kO{sopT928aIWj=MjE^i`#@rf7lR5MSaT+M_MrIz)`n7VnP z2wPloph!A5*KTX&>kkhi2C^;3KQ1z!&%@yoR|hBNtqk&W8BbkkQrqqvqFCiW4(QD) zyiAbc?$%SNp;i$NDpjDElbnM;!7Ot17&|OX92vQ^ zk^I@Wgco+;n}W^FYNhd56i`Sq-* z7-5A%PKvGS?d}f7k{eUQ4r1^+hKCBnU`N|!yPin9qxCrhWB%3~@2ce|ip^Mi<05c1 z7>c$E{bjd8P-K60e(Jt*{Wh$+Ddd4|ZPWvm8?u*c_wRmS#Co&AG zylHho%bH3-2*@Y<^t_h%HdP*Lbi{3kk=mOqH*|8nXlJ`0rVWtb<9yz%u^{Dd&rrbm z63ci7tY^(0z>>4hDiSC`(nJ`lu=k0-xY4pd8%BNZvp#!Il(thqhqKwIXam1>=8{EH zGONe!D(~>#pTTHcD+jphKGot4l6TmOjM7S>J#|?l8tTP=yU3Zn>{v5dWA&B25j$!x z`_5xJXV)5u`sz^OYLIQ2xvMvv_F+vGTy90*!dE#sK|4aQnoY^mI_7M~Zwb|e|I~O* zk^%RiO5~k;iAn1P$%`|Q9Fc-tbV{y131vZ_{4@~q~*EyFZ*Z?!Ot$i1UBQTdfgYeBXBZc@r;M)FvIY@q1p#eUF9LUUwW98nQ%$Su-aS|V)~uf88RXs$>PuQBOucrV zdp9Je#%rx)<&OC)eane570TvIxR)EW+Icm3W;e2x?hj_xg$fmBAgza9Vh1W-au|kF z=j&~yWuu-g|brk!kbqmsq4?5k_97SHitT@p|>b%@qD{%upX-Oyt_EWV>W`g4ak<< zXK02h04^yRPQ@oG?~9|h{fbY}#1S9jZ8h4b%U`^DS;gT^i_iW^X}Pg#ThQlpk%`G` z(#D%(9zwKK_mu6|=qob1pL-l&_1Jfvm`ORCBT>I* z{TbxIu)5?4;8P;viV)^3-Ok$8pCbtgd_|Qh%-f9ww&YJfcUyk*pl+%N$Z2d2x+yuR+oaxbt)7T zEr|AoUG3F!5DiyoJH35L8J>f+c!gS=OAWn`rQ_8lsd;u4OA%W(cs)BQlOtj)!)BfK z4n6*UEsb0TYn>n_^2PYjz(i!G$|5&@j%vNe| z?X?_&D<>$xWvR-N_mk4G(KQ1ZidE!gGqnUlBQel)3Z4Q7i2EJ2j%9|3-G6XR zL^&QF6J0`>)5TD>Ye@1wI6EFasHS*dxVChao*f*}Aib?I9GF+=4u;BW$r~n0I^je> zvEJ)+dIzUv=Gs3zsiXw|&_xEWRX-9{SRPUvs6cs_ACi`4<;4ED1(qfSV_t zq%!W?iujUT-ep?DMO5MSUq4g|X6KW>=FO!`;Pv7Lr8FOU&fXnf6VEGy6IU;VmBkxg zYM}D7b~0F)m(UtLoqPL?^47cu0h7s^WN6Lv><3=`=`P)Rt^$Q+q3I3JJ6YRYZMPM*H*MQ<;SO@{Z zl^_kZ)Jh9FrWj%K{69Fb%eBSpxgYK$@0{&TsiQu_aa9LL7)I=aOz_T6 z)XCW|S10D1O#Div%SGk1om)Wlc}qGc$NRI(M*3xP8e)p@*UHR9Dv8DP{r-xg*bb$Qv$ya3C1KjLLPw^MpGOH;&}er88p?!qBX zk!z?r5uhYtHjL&9x(9SI6#L!Rw>e|q-j#lqb0cGd{9^l;ExeqlxT>fYOyJqwI&e=Q z+jY0tJ>msA%!S9y(I=L+69;f7Av8nRZIK*couMN-YqR1jLm-heK6rm1b-wGCBS%b5)ccIqE@0jL6C$N{DhUH#^0c za+@uRC)fV{Jr-lc-P;1LTW0aB-gKtPa$>F{96dtlWkStSJ?=b}9O9AMXSvp9Le92! zJv)t*#KY;u2;~gKfst7oiX>ki^gLU;dne#(D@kHMnTqo38=6@Y3eO83t#5L4hFESs z&TW&%zkF%%-3lT{tp1YJxOjkhHZ7T6g}wx}BgU&I=pxjw*&PtVtz$RUdyVQl{7x5p z`bOZh>z$>(;~+wh{4Dxxf#2g+lURPPGNQElLYt3-t|}N+n`ph~3%WC%r>fWE!P-)S z^afE4bn(dV6vo@gq6ZS?GkuQKeRZ2EG^E~STy ze7k_-Bb$R!gQ^N%mH7&uZZ_^&b-(J z&4^4|JYnvao11|kU)Z^TO+fHcCM`6C^l|H(F8BK+iz^-%`_Crg>=|L78mx}mC~|P> zHR`{rO{4IU+eWs5#YD13LAEEz>vS+ZGAl(+%s*EK8ukaZEDw&)0uT*+jn1T|mgOkJ zaJejqHoW|mTmqFiZcu;iR_}?X`d%*oBt0F(8oo&V2c(IFevlr4Z{+3rj=($?S2RUm z?F7QP$5jYobm_bDPhJ~ddisLC+z2;~fW=SLeu4HPp76P+9NKS&C=xw+&vv{KxJ^

(u1;L6(cQ?)GnM#vbq;}_8j8w4Fi2^0KYHDQh@ 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 - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 1,0,0,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "ROLI Ltd.\0" - VALUE "LegalCopyright", "ROLI Ltd.\0" - VALUE "FileDescription", "AudioPluginHost\0" - VALUE "FileVersion", "1.0.0\0" - VALUE "ProductName", "AudioPluginHost\0" - VALUE "ProductVersion", "1.0.0\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj index a2abea34e0..1f2a99cba5 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj @@ -74,7 +74,7 @@ Level4 true true - /w44265 /w44062 %(AdditionalOptions) + /w44265 /w44062 /bigobj %(AdditionalOptions) stdcpp14 @@ -116,7 +116,7 @@ Level4 true true - /w44265 /w44062 %(AdditionalOptions) + /w44265 /w44062 /bigobj %(AdditionalOptions) stdcpp14 diff --git a/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h b/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h index c102354e7c..f2c41a734b 100644 --- a/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h +++ b/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h @@ -191,7 +191,7 @@ #endif #ifndef JUCE_USE_CURL - //#define JUCE_USE_CURL 0 + //#define JUCE_USE_CURL 1 #endif #ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer.sln b/extras/Projucer/Builds/VisualStudio2013/Projucer.sln deleted file mode 100644 index 8c3cf0cb3a..0000000000 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer.sln +++ /dev/null @@ -1,20 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2013 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Projucer - App", "Projucer_App.vcxproj", "{E4CFCE31-1AF5-C360-751D-9682E333BE4D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.ActiveCfg = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.Build.0 = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.ActiveCfg = Release|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj deleted file mode 100644 index b05ee51a98..0000000000 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj +++ /dev/null @@ -1,2107 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {E4CFCE31-1AF5-C360-751D-9682E333BE4D} - - - - Application - false - false - v120 - 8.1 - - - Application - false - false - v120 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.3;JUCE_APP_VERSION_HEX=0x50403;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\Projucer.pdb - Windows - true - - - true - $(IntDir)\Projucer.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.3;JUCE_APP_VERSION_HEX=0x50403;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\Projucer.pdb - Windows - true - true - true - - - true - $(IntDir)\Projucer.bsc - - - - - - true - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters deleted file mode 100644 index fdff3f7640..0000000000 --- a/extras/Projucer/Builds/VisualStudio2013/Projucer_App.vcxproj.filters +++ /dev/null @@ -1,3758 +0,0 @@ - - - - - - {DC7E18A5-E854-3D99-627F-AAA88246B712} - - - {4F8BCD36-CE20-D951-FB82-2CCEDD0C5898} - - - {661FA330-2192-FAA3-E7B2-FAF8EBB783C6} - - - {3A77FAA0-7E92-6D59-9C5F-BAAA2BF82833} - - - {D8DD148A-AB2B-B485-520B-8924DA606099} - - - {FE290DF2-C600-4159-D484-7F48DB498EBE} - - - {DE3E40F0-B495-2AC0-52AF-AA073FFE8E4C} - - - {A61A4546-CC78-CCFD-CC99-D5CD03650B08} - - - {485EE240-BE7D-E5FD-07C2-760B7401D5F3} - - - {35957741-E3A5-47F8-86DC-FDE691866C74} - - - {16DF510D-120E-D924-C478-E1E82643ED83} - - - {3207865A-047C-278E-870A-BC204B74ECB3} - - - {5F21E507-E5E8-0A74-F1AE-874BB67C26CC} - - - {E5D23B90-895E-EB0B-AC18-C7EBB25546AE} - - - {E880260F-D9FB-64B6-244B-6F06B70FE9EE} - - - {0A3B9446-F50B-3D4E-230F-7ED493541A07} - - - {A0A94AE6-B447-151A-D0DA-FAE9B5410EBF} - - - {D2E33EF7-EDDC-06BA-9343-EF957E30A158} - - - {BBF7BD20-FB7D-59E5-D1DD-3E6F1455CA02} - - - {C4676327-23FA-ED8F-1881-BC5E53840936} - - - {FAD9788E-4FE6-172B-0E32-913C0C8FC2FB} - - - {A353D068-8C43-A573-8460-59B6BA167F83} - - - {A4B9C07E-05B1-BCE9-E075-7E573FFD23B0} - - - {ACCBC32A-58D5-1EC6-FC4D-B3B32CB6588E} - - - {A90A32B8-1A07-8900-6E90-EC981F56EC9D} - - - {F77CA057-8DE4-E076-7EB6-D2646794864B} - - - {4BBA3556-B2A1-3008-8BE1-F82DE6666552} - - - {7DBEF27C-2AFE-DA02-1DBF-E80FAAC99EA7} - - - {E3CEC08A-FA14-D343-5BFF-3D6A4A4FD713} - - - {B3BC836A-3932-C1E4-CA3C-A1C0D83281BA} - - - {97F7F593-75F8-D6B2-DC96-C946C3976226} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Licenses - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Wizards - - - Projucer\Wizards - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Licenses - - - Projucer\Licenses - - - Projucer\Licenses - - - Projucer\LiveBuildEngine\UI - - - Projucer\LiveBuildEngine\UI - - - Projucer\LiveBuildEngine\UI - - - Projucer\LiveBuildEngine\UI - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\LiveBuildEngine - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\Project - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - Projucer\Wizards - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/extras/Projucer/Builds/VisualStudio2013/icon.ico b/extras/Projucer/Builds/VisualStudio2013/icon.ico deleted file mode 100644 index 09d32ad703e414097a17e969e7d765325e912c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33530 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

(u1;L6(cQ?)GnM#vbq;}_8j8w4Fi2^0KYHDQh@ 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 - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 5,4,3,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "ROLI Ltd.\0" - VALUE "LegalCopyright", "ROLI Ltd.\0" - VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "5.4.3\0" - VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "5.4.3\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index 045abc6d69..db7510ce8b 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -26,24 +26,6 @@ - - - - - - - - - - - - - - - - ProjectExporter::getExporterTypes() addType (types, MSVCProjectExporterVC2019::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize); addType (types, MSVCProjectExporterVC2017::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize); addType (types, MSVCProjectExporterVC2015::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize); - addType (types, MSVCProjectExporterVC2013::getName(), BinaryData::export_visualStudio_svg, BinaryData::export_visualStudio_svgSize); addType (types, MakefileProjectExporter::getNameLinux(), BinaryData::export_linux_svg, BinaryData::export_linux_svgSize); addType (types, AndroidProjectExporter::getName(), BinaryData::export_android_svg, BinaryData::export_android_svgSize); addType (types, CodeBlocksProjectExporter::getNameWindows(), BinaryData::export_codeBlocks_svg, BinaryData::export_codeBlocks_svgSize); @@ -76,12 +75,11 @@ ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int case 2: exp = new MSVCProjectExporterVC2019 (project, ValueTree (MSVCProjectExporterVC2019 ::getValueTreeTypeName())); break; case 3: exp = new MSVCProjectExporterVC2017 (project, ValueTree (MSVCProjectExporterVC2017 ::getValueTreeTypeName())); break; case 4: exp = new MSVCProjectExporterVC2015 (project, ValueTree (MSVCProjectExporterVC2015 ::getValueTreeTypeName())); break; - case 5: exp = new MSVCProjectExporterVC2013 (project, ValueTree (MSVCProjectExporterVC2013 ::getValueTreeTypeName())); break; - case 6: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter ::getValueTreeTypeName())); break; - case 7: exp = new AndroidProjectExporter (project, ValueTree (AndroidProjectExporter ::getValueTreeTypeName())); break; - case 8: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::windowsTarget)), CodeBlocksProjectExporter::windowsTarget); break; - case 9: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::linuxTarget)), CodeBlocksProjectExporter::linuxTarget); break; - case 10: exp = new CLionProjectExporter (project, ValueTree (CLionProjectExporter ::getValueTreeTypeName())); break; + case 5: exp = new MakefileProjectExporter (project, ValueTree (MakefileProjectExporter ::getValueTreeTypeName())); break; + case 6: exp = new AndroidProjectExporter (project, ValueTree (AndroidProjectExporter ::getValueTreeTypeName())); break; + case 7: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::windowsTarget)), CodeBlocksProjectExporter::windowsTarget); break; + case 8: exp = new CodeBlocksProjectExporter (project, ValueTree (CodeBlocksProjectExporter ::getValueTreeTypeName (CodeBlocksProjectExporter::linuxTarget)), CodeBlocksProjectExporter::linuxTarget); break; + case 9: exp = new CLionProjectExporter (project, ValueTree (CLionProjectExporter ::getValueTreeTypeName())); break; } exp->createDefaultConfigs(); @@ -127,9 +125,6 @@ String ProjectExporter::getValueTreeNameForExporter (const String& exporterName) if (exporterName == MSVCProjectExporterVC2015::getName()) return MSVCProjectExporterVC2015::getValueTreeTypeName(); - if (exporterName == MSVCProjectExporterVC2013::getName()) - return MSVCProjectExporterVC2013::getValueTreeTypeName(); - if (exporterName == MakefileProjectExporter::getNameLinux()) return MakefileProjectExporter::getValueTreeTypeName(); @@ -155,7 +150,6 @@ String ProjectExporter::getTargetFolderForExporter (const String& exporterValueT if (exporterValueTreeName == "VS2019") return "VisualStudio2019"; if (exporterValueTreeName == "VS2017") return "VisualStudio2017"; if (exporterValueTreeName == "VS2015") return "VisualStudio2015"; - if (exporterValueTreeName == "VS2013") return "VisualStudio2013"; if (exporterValueTreeName == "LINUX_MAKE") return "LinuxMakefile"; if (exporterValueTreeName == "ANDROIDSTUDIO") return "Android"; if (exporterValueTreeName == "CODEBLOCKS_WINDOWS") return "CodeBlocksWindows"; @@ -174,7 +168,6 @@ StringArray ProjectExporter::getAllDefaultBuildsFolders() folders.add (getDefaultBuildsRootFolder() + "VisualStudio2019"); folders.add (getDefaultBuildsRootFolder() + "VisualStudio2017"); folders.add (getDefaultBuildsRootFolder() + "VisualStudio2015"); - folders.add (getDefaultBuildsRootFolder() + "VisualStudio2013"); folders.add (getDefaultBuildsRootFolder() + "LinuxMakefile"); folders.add (getDefaultBuildsRootFolder() + "CodeBlocksWindows"); folders.add (getDefaultBuildsRootFolder() + "CodeBlocksLinux"); @@ -207,7 +200,6 @@ ProjectExporter* ProjectExporter::createExporter (Project& project, const ValueT ProjectExporter* exp = MSVCProjectExporterVC2019 ::createForSettings (project, settings); if (exp == nullptr) exp = MSVCProjectExporterVC2017 ::createForSettings (project, settings); if (exp == nullptr) exp = MSVCProjectExporterVC2015 ::createForSettings (project, settings); - if (exp == nullptr) exp = MSVCProjectExporterVC2013 ::createForSettings (project, settings); if (exp == nullptr) exp = XcodeProjectExporter ::createForSettings (project, settings); if (exp == nullptr) exp = MakefileProjectExporter ::createForSettings (project, settings); if (exp == nullptr) exp = AndroidProjectExporter ::createForSettings (project, settings); @@ -231,7 +223,6 @@ bool ProjectExporter::canProjectBeLaunched (Project* project) MSVCProjectExporterVC2019::getValueTreeTypeName(), MSVCProjectExporterVC2017::getValueTreeTypeName(), MSVCProjectExporterVC2015::getValueTreeTypeName(), - MSVCProjectExporterVC2013::getValueTreeTypeName(), #elif JUCE_LINUX // (this doesn't currently launch.. not really sure what it would do on linux) //MakefileProjectExporter::getValueTreeTypeName(),