Browse Source

Android: better audio latency reporting. Introjucer: improved android icon generation.

tags/2021-05-28
jules 13 years ago
parent
commit
6d865420ee
6 changed files with 56 additions and 36 deletions
  1. +18
    -10
      extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h
  2. BIN
      extras/JuceDemo/Builds/Android/res/drawable-hdpi/icon.png
  3. BIN
      extras/JuceDemo/Builds/Android/res/drawable-ldpi/icon.png
  4. BIN
      extras/JuceDemo/Builds/Android/res/drawable-mdpi/icon.png
  5. +10
    -8
      extras/JuceDemo/Juce Demo.jucer
  6. +28
    -18
      modules/juce_audio_devices/native/juce_android_Audio.cpp

+ 18
- 10
extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h View File

@@ -108,9 +108,6 @@ public:
createDirectoryOrThrow (target.getChildFile ("src/com")); createDirectoryOrThrow (target.getChildFile ("src/com"));
createDirectoryOrThrow (jniFolder); createDirectoryOrThrow (jniFolder);
createDirectoryOrThrow (target.getChildFile ("res/drawable-hdpi"));
createDirectoryOrThrow (target.getChildFile ("res/drawable-mdpi"));
createDirectoryOrThrow (target.getChildFile ("res/drawable-ldpi"));
createDirectoryOrThrow (target.getChildFile ("res/values")); createDirectoryOrThrow (target.getChildFile ("res/values"));
createDirectoryOrThrow (target.getChildFile ("libs")); createDirectoryOrThrow (target.getChildFile ("libs"));
createDirectoryOrThrow (target.getChildFile ("bin")); createDirectoryOrThrow (target.getChildFile ("bin"));
@@ -130,12 +127,23 @@ public:
writeProjectPropertiesFile (target.getChildFile ("project.properties")); writeProjectPropertiesFile (target.getChildFile ("project.properties"));
writeLocalPropertiesFile (target.getChildFile ("local.properties")); writeLocalPropertiesFile (target.getChildFile ("local.properties"));
writeStringsFile (target.getChildFile ("res/values/strings.xml"));
writeIcon (target.getChildFile ("res/drawable-hdpi/icon.png"), 72);
writeIcon (target.getChildFile ("res/drawable-mdpi/icon.png"), 48);
writeIcon (target.getChildFile ("res/drawable-ldpi/icon.png"), 36);
const Image bigIcon (getBigIcon());
const Image smallIcon (getSmallIcon());
writeStringsFile (target.getChildFile ("res/values/strings.xml"));
if (bigIcon.isValid() && smallIcon.isValid())
{
const int step = jmax (bigIcon.getWidth(), bigIcon.getHeight()) / 8;
writeIcon (target.getChildFile ("res/drawable-xhdpi/icon.png"), getBestIconForSize (step * 8, false));
writeIcon (target.getChildFile ("res/drawable-hdpi/icon.png"), getBestIconForSize (step * 6, false));
writeIcon (target.getChildFile ("res/drawable-mdpi/icon.png"), getBestIconForSize (step * 4, false));
writeIcon (target.getChildFile ("res/drawable-ldpi/icon.png"), getBestIconForSize (step * 3, false));
}
else
{
writeIcon (target.getChildFile ("res/drawable-mdpi/icon.png"), bigIcon.isValid() ? bigIcon : smallIcon);
}
} }
protected: protected:
@@ -424,12 +432,12 @@ private:
overwriteFileIfDifferentOrThrow (file, mo); overwriteFileIfDifferentOrThrow (file, mo);
} }
void writeIcon (const File& file, int size)
void writeIcon (const File& file, const Image& im)
{ {
Image im (getBestIconForSize (size, false));
if (im.isValid()) if (im.isValid())
{ {
createDirectoryOrThrow (file.getParentDirectory());
PNGImageFormat png; PNGImageFormat png;
MemoryOutputStream mo; MemoryOutputStream mo;


BIN
extras/JuceDemo/Builds/Android/res/drawable-hdpi/icon.png View File

Before After
Width: 72  |  Height: 72  |  Size: 6.9KB

BIN
extras/JuceDemo/Builds/Android/res/drawable-ldpi/icon.png View File

Before After
Width: 36  |  Height: 36  |  Size: 2.2KB

BIN
extras/JuceDemo/Builds/Android/res/drawable-mdpi/icon.png View File

Before After
Width: 48  |  Height: 48  |  Size: 3.6KB Width: 128  |  Height: 128  |  Size: 17KB

+ 10
- 8
extras/JuceDemo/Juce Demo.jucer View File

@@ -36,9 +36,9 @@
bigIcon="f4hwldS"> bigIcon="f4hwldS">
<CONFIGURATIONS> <CONFIGURATIONS>
<CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
</CONFIGURATIONS> </CONFIGURATIONS>
</VS2005> </VS2005>
<VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4" <VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4"
@@ -46,18 +46,18 @@
bigIcon="f4hwldS"> bigIcon="f4hwldS">
<CONFIGURATIONS> <CONFIGURATIONS>
<CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
</CONFIGURATIONS> </CONFIGURATIONS>
</VS2008> </VS2008>
<LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce" <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"
bigIcon="f4hwldS"> bigIcon="f4hwldS">
<CONFIGURATIONS> <CONFIGURATIONS>
<CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" libraryPath="/usr/X11R6/lib/"/>
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" libraryPath="/usr/X11R6/lib/"/>
</CONFIGURATIONS> </CONFIGURATIONS>
</LINUX_MAKE> </LINUX_MAKE>
<VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4" <VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4"
@@ -65,9 +65,11 @@
bigIcon="f4hwldS"> bigIcon="f4hwldS">
<CONFIGURATIONS> <CONFIGURATIONS>
<CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo" <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit"/>
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit" winWarningLevel="4"
generateManifest="1"/>
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo" <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="JuceDemo"
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit"/>
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit" winWarningLevel="4"
generateManifest="1"/>
</CONFIGURATIONS> </CONFIGURATIONS>
</VS2010> </VS2010>
<ANDROID targetFolder="Builds/Android" androidSDKPath="${user.home}/SDKs/android-sdk-macosx" <ANDROID targetFolder="Builds/Android" androidSDKPath="${user.home}/SDKs/android-sdk-macosx"


+ 28
- 18
modules/juce_audio_devices/native/juce_android_Audio.cpp View File

@@ -75,7 +75,7 @@ public:
callback (0), sampleRate (0), callback (0), sampleRate (0),
numClientInputChannels (0), numDeviceInputChannels (0), numDeviceInputChannelsAvailable (2), numClientInputChannels (0), numDeviceInputChannels (0), numDeviceInputChannelsAvailable (2),
numClientOutputChannels (0), numDeviceOutputChannels (0), numClientOutputChannels (0), numDeviceOutputChannels (0),
minbufferSize (0), actualBufferSize (0),
minBufferSizeOut (0), minBufferSizeIn (0), actualBufferSize (0),
isRunning (false), isRunning (false),
outputChannelBuffer (1, 1), outputChannelBuffer (1, 1),
inputChannelBuffer (1, 1) inputChannelBuffer (1, 1)
@@ -83,22 +83,20 @@ public:
JNIEnv* env = getEnv(); JNIEnv* env = getEnv();
sampleRate = env->CallStaticIntMethod (AudioTrack, AudioTrack.getNativeOutputSampleRate, MODE_STREAM); sampleRate = env->CallStaticIntMethod (AudioTrack, AudioTrack.getNativeOutputSampleRate, MODE_STREAM);
const jint outMinBuffer = env->CallStaticIntMethod (AudioTrack, AudioTrack.getMinBufferSize, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT);
minBufferSizeOut = (int) env->CallStaticIntMethod (AudioTrack, AudioTrack.getMinBufferSize, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT);
minBufferSizeIn = (int) env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_STEREO, ENCODING_PCM_16BIT);
jint inMinBuffer = env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_STEREO, ENCODING_PCM_16BIT);
if (inMinBuffer <= 0)
if (minBufferSizeIn <= 0)
{ {
inMinBuffer = env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_MONO, ENCODING_PCM_16BIT);
minBufferSizeIn = env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_MONO, ENCODING_PCM_16BIT);
if (inMinBuffer > 0)
if (minBufferSizeIn > 0)
numDeviceInputChannelsAvailable = 1; numDeviceInputChannelsAvailable = 1;
else else
numDeviceInputChannelsAvailable = 0; numDeviceInputChannelsAvailable = 0;
} }
minbufferSize = jmax (outMinBuffer, inMinBuffer) / 4;
DBG ("Audio device - min buffers: " << outMinBuffer << ", " << inMinBuffer << "; "
DBG ("Audio device - min buffers: " << minBufferSizeOut << ", " << minBufferSizeIn << "; "
<< sampleRate << " Hz; input chans: " << numDeviceInputChannelsAvailable); << sampleRate << " Hz; input chans: " << numDeviceInputChannelsAvailable);
} }
@@ -135,9 +133,21 @@ public:
int getNumSampleRates() { return 1;} int getNumSampleRates() { return 1;}
double getSampleRate (int index) { return sampleRate; } double getSampleRate (int index) { return sampleRate; }
int getDefaultBufferSize() { return minbufferSize; }
int getNumBufferSizesAvailable() { return 10; }
int getBufferSizeSamples (int index) { return getDefaultBufferSize() + index * 128; }
int getDefaultBufferSize() { return 2048; }
int getNumBufferSizesAvailable() { return 50; }
int getBufferSizeSamples (int index)
{
int n = 16;
for (int i = 0; i < index; ++i)
n += n < 64 ? 16
: (n < 512 ? 32
: (n < 1024 ? 64
: (n < 2048 ? 128 : 256)));
return n;
}
String open (const BigInteger& inputChannels, String open (const BigInteger& inputChannels,
const BigInteger& outputChannels, const BigInteger& outputChannels,
@@ -150,7 +160,7 @@ public:
return "Sample rate not allowed"; return "Sample rate not allowed";
lastError = String::empty; lastError = String::empty;
int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : jmax (minbufferSize, bufferSize);
int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize;
numDeviceInputChannels = 0; numDeviceInputChannels = 0;
numDeviceOutputChannels = 0; numDeviceOutputChannels = 0;
@@ -176,7 +186,7 @@ public:
numDeviceOutputChannels = 2; numDeviceOutputChannels = 2;
outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor, outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor,
STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT, STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT,
(jint) (actualBufferSize * numDeviceOutputChannels * sizeof (int16)), MODE_STREAM));
(jint) (minBufferSizeOut * numDeviceOutputChannels * sizeof (int16)), MODE_STREAM));
if (env->CallIntMethod (outputDevice, AudioTrack.getState) != STATE_UNINITIALIZED) if (env->CallIntMethod (outputDevice, AudioTrack.getState) != STATE_UNINITIALIZED)
isRunning = true; isRunning = true;
@@ -191,7 +201,7 @@ public:
0 /* (default audio source) */, sampleRate, 0 /* (default audio source) */, sampleRate,
numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO, numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO,
ENCODING_PCM_16BIT, ENCODING_PCM_16BIT,
(jint) (actualBufferSize * numDeviceInputChannels * sizeof (int16))));
(jint) (minBufferSizeIn * numDeviceInputChannels * sizeof (int16))));
if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED) if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED)
isRunning = true; isRunning = true;
@@ -227,8 +237,8 @@ public:
} }
} }
int getOutputLatencyInSamples() { return 0; } // TODO
int getInputLatencyInSamples() { return 0; } // TODO
int getOutputLatencyInSamples() { return minBufferSizeOut; }
int getInputLatencyInSamples() { return minBufferSizeIn; }
bool isOpen() { return isRunning; } bool isOpen() { return isRunning; }
int getCurrentBufferSizeSamples() { return actualBufferSize; } int getCurrentBufferSizeSamples() { return actualBufferSize; }
int getCurrentBitDepth() { return 16; } int getCurrentBitDepth() { return 16; }
@@ -355,7 +365,7 @@ private:
jint sampleRate; jint sampleRate;
int numClientInputChannels, numDeviceInputChannels, numDeviceInputChannelsAvailable; int numClientInputChannels, numDeviceInputChannels, numDeviceInputChannelsAvailable;
int numClientOutputChannels, numDeviceOutputChannels; int numClientOutputChannels, numDeviceOutputChannels;
int minbufferSize, actualBufferSize;
int minBufferSizeOut, minBufferSizeIn, actualBufferSize;
bool isRunning; bool isRunning;
String lastError; String lastError;
BigInteger activeOutputChans, activeInputChans; BigInteger activeOutputChans, activeInputChans;


Loading…
Cancel
Save