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 (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 ("libs"));
createDirectoryOrThrow (target.getChildFile ("bin"));
@@ -130,12 +127,23 @@ public:
writeProjectPropertiesFile (target.getChildFile ("project.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:
@@ -424,12 +432,12 @@ private:
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())
{
createDirectoryOrThrow (file.getParentDirectory());
PNGImageFormat png;
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">
<CONFIGURATIONS>
<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"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
</CONFIGURATIONS>
</VS2005>
<VS2008 targetFolder="Builds/VisualStudio2008" vstFolder="c:\SDKs\vstsdk2.4"
@@ -46,18 +46,18 @@
bigIcon="f4hwldS">
<CONFIGURATIONS>
<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"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" winWarningLevel="4" generateManifest="1"/>
</CONFIGURATIONS>
</VS2008>
<LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="../../../juce"
bigIcon="f4hwldS">
<CONFIGURATIONS>
<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"
defines="JUCE_UNIT_TESTS=1"/>
defines="JUCE_UNIT_TESTS=1" libraryPath="/usr/X11R6/lib/"/>
</CONFIGURATIONS>
</LINUX_MAKE>
<VS2010 targetFolder="Builds/VisualStudio2010" vstFolder="c:\SDKs\vstsdk2.4"
@@ -65,9 +65,11 @@
bigIcon="f4hwldS">
<CONFIGURATIONS>
<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"
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit"/>
defines="JUCE_UNIT_TESTS=1" winArchitecture="32-bit" winWarningLevel="4"
generateManifest="1"/>
</CONFIGURATIONS>
</VS2010>
<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),
numClientInputChannels (0), numDeviceInputChannels (0), numDeviceInputChannelsAvailable (2),
numClientOutputChannels (0), numDeviceOutputChannels (0),
minbufferSize (0), actualBufferSize (0),
minBufferSizeOut (0), minBufferSizeIn (0), actualBufferSize (0),
isRunning (false),
outputChannelBuffer (1, 1),
inputChannelBuffer (1, 1)
@@ -83,22 +83,20 @@ public:
JNIEnv* env = getEnv();
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;
else
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);
}
@@ -135,9 +133,21 @@ public:
int getNumSampleRates() { return 1;}
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,
const BigInteger& outputChannels,
@@ -150,7 +160,7 @@ public:
return "Sample rate not allowed";
lastError = String::empty;
int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : jmax (minbufferSize, bufferSize);
int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize;
numDeviceInputChannels = 0;
numDeviceOutputChannels = 0;
@@ -176,7 +186,7 @@ public:
numDeviceOutputChannels = 2;
outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor,
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)
isRunning = true;
@@ -191,7 +201,7 @@ public:
0 /* (default audio source) */, sampleRate,
numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO,
ENCODING_PCM_16BIT,
(jint) (actualBufferSize * numDeviceInputChannels * sizeof (int16))));
(jint) (minBufferSizeIn * numDeviceInputChannels * sizeof (int16))));
if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED)
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; }
int getCurrentBufferSizeSamples() { return actualBufferSize; }
int getCurrentBitDepth() { return 16; }
@@ -355,7 +365,7 @@ private:
jint sampleRate;
int numClientInputChannels, numDeviceInputChannels, numDeviceInputChannelsAvailable;
int numClientOutputChannels, numDeviceOutputChannels;
int minbufferSize, actualBufferSize;
int minBufferSizeOut, minBufferSizeIn, actualBufferSize;
bool isRunning;
String lastError;
BigInteger activeOutputChans, activeInputChans;


Loading…
Cancel
Save