@@ -61,7 +61,7 @@ ifeq ($(MACOS),true) | |||
# No C++11 support; force 32bit per default | |||
BUILD_C_FLAGS = $(BASE_FLAGS) $(32BIT_FLAGS) -std=gnu99 $(CFLAGS) | |||
BUILD_CXX_FLAGS = $(BASE_FLAGS) $(32BIT_FLAGS) $(CXXFLAGS) | |||
LINK_FLAGS = $(LDFLAGS) | |||
LINK_FLAGS = $(32BIT_FLAGS) $(LDFLAGS) | |||
endif | |||
# -------------------------------------------------------------- | |||
@@ -37,6 +37,10 @@ POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu | |||
POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu | |||
POSIX_LINK_FLAGS = $(LINK_FLAGS) $(EXTRA_LIBS) -ldl -lpthread | |||
ifeq ($(MACOS),true) | |||
POSIX_LINK_FLAGS += -framework Cocoa -framework IOKit | |||
endif | |||
WIN_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | |||
WIN_32BIT_FLAGS = $(32BIT_FLAGS) | |||
WIN_64BIT_FLAGS = $(64BIT_FLAGS) | |||
@@ -71,9 +71,9 @@ public: | |||
{ | |||
public: | |||
template <class SampleFormatType> static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatBE(); } | |||
template <class SampleFormatType> static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatBE (newValue); } | |||
template <class SampleFormatType> static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatBE (newValue); } | |||
template <class SampleFormatType> static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32BE(); } | |||
template <class SampleFormatType> static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32BE (newValue); } | |||
template <class SampleFormatType> static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32BE (newValue); } | |||
template <class SourceType, class DestType> static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromBE (source); } | |||
enum { isBigEndian = 1 }; | |||
}; | |||
@@ -82,9 +82,9 @@ public: | |||
{ | |||
public: | |||
template <class SampleFormatType> static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatLE(); } | |||
template <class SampleFormatType> static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatLE (newValue); } | |||
template <class SampleFormatType> static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatLE (newValue); } | |||
template <class SampleFormatType> static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32LE(); } | |||
template <class SampleFormatType> static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32LE (newValue); } | |||
template <class SampleFormatType> static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32LE (newValue); } | |||
template <class SourceType, class DestType> static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromLE (source); } | |||
enum { isBigEndian = 0 }; | |||
}; | |||
@@ -205,11 +205,11 @@ public: | |||
inline void skip (int numSamples) noexcept { data += numSamples; } | |||
inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } | |||
inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } | |||
inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } | |||
inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } | |||
inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } | |||
inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data); } | |||
inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data); } | |||
inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data); } | |||
inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue); } | |||
inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue); } | |||
inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue); } | |||
inline void clear() noexcept { *data = 0; } | |||
inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} | |||
@@ -221,6 +221,27 @@ public: | |||
enum { bytesPerSample = 4, maxValue = 0x7fffffff, resolution = 1, isFloat = 0 }; | |||
}; | |||
/** A 32-bit integer type, of which only the bottom 24 bits are used. */ | |||
class Int24in32 : public Int32 | |||
{ | |||
public: | |||
inline Int24in32 (void* d) noexcept : Int32 (d) {} | |||
inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } | |||
inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } | |||
inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } | |||
inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } | |||
inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data) << 8; } | |||
inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data) << 8; } | |||
inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue >> 8); } | |||
inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue >> 8); } | |||
template <class SourceType> inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } | |||
template <class SourceType> inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } | |||
inline void copyFromSameType (Int24in32& source) noexcept { *data = *source.data; } | |||
enum { bytesPerSample = 4, maxValue = 0x7fffff, resolution = (1 << 8), isFloat = 0 }; | |||
}; | |||
class Float32 | |||
{ | |||
public: | |||
@@ -591,9 +612,7 @@ public: | |||
: sourceChannels (numSourceChannels), destChannels (numDestChannels) | |||
{} | |||
~ConverterInstance() {} | |||
void convertSamples (void* dest, const void* source, int numSamples) const | |||
void convertSamples (void* dest, const void* source, int numSamples) const override | |||
{ | |||
SourceSampleType s (source, sourceChannels); | |||
DestSampleType d (dest, destChannels); | |||
@@ -601,7 +620,7 @@ public: | |||
} | |||
void convertSamples (void* dest, int destSubChannel, | |||
const void* source, int sourceSubChannel, int numSamples) const | |||
const void* source, int sourceSubChannel, int numSamples) const override | |||
{ | |||
jassert (destSubChannel < destChannels && sourceSubChannel < sourceChannels); | |||
@@ -158,8 +158,8 @@ void AudioSampleBuffer::setSize (const int newNumChannels, | |||
if (newNumSamples != size || newNumChannels != numChannels) | |||
{ | |||
const size_t allocatedSamplesPerChannel = (newNumSamples + 3) & ~3; | |||
const size_t channelListSize = ((sizeof (float*) * (size_t) (newNumChannels + 1)) + 15) & ~15; | |||
const size_t allocatedSamplesPerChannel = ((size_t) newNumSamples + 3) & ~3u; | |||
const size_t channelListSize = ((sizeof (float*) * (size_t) (newNumChannels + 1)) + 15) & ~15u; | |||
const size_t newTotalBytes = ((size_t) newNumChannels * (size_t) allocatedSamplesPerChannel * sizeof (float)) | |||
+ channelListSize + 32; | |||
@@ -168,7 +168,7 @@ void AudioSampleBuffer::setSize (const int newNumChannels, | |||
HeapBlock <char, true> newData; | |||
newData.allocate (newTotalBytes, clearExtraSpace); | |||
const size_t numSamplesToCopy = jmin (newNumSamples, size); | |||
const size_t numSamplesToCopy = (size_t) jmin (newNumSamples, size); | |||
float** const newChannels = reinterpret_cast <float**> (newData.getData()); | |||
float* newChan = reinterpret_cast <float*> (newData + channelListSize); | |||
@@ -162,7 +162,7 @@ namespace FloatVectorHelpers | |||
void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept | |||
{ | |||
#if JUCE_USE_VDSP_FRAMEWORK | |||
vDSP_vclr (dest, 1, num); | |||
vDSP_vclr (dest, 1, (size_t) num); | |||
#else | |||
zeromem (dest, num * sizeof (float)); | |||
#endif | |||
@@ -171,7 +171,7 @@ void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept | |||
void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, int num) noexcept | |||
{ | |||
#if JUCE_USE_VDSP_FRAMEWORK | |||
vDSP_vfill (&valueToFill, dest, 1, num); | |||
vDSP_vfill (&valueToFill, dest, 1, (size_t) num); | |||
#else | |||
#if JUCE_USE_SSE_INTRINSICS | |||
const __m128 val = _mm_load1_ps (&valueToFill); | |||
@@ -183,7 +183,7 @@ void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, | |||
void JUCE_CALLTYPE FloatVectorOperations::copy (float* dest, const float* src, int num) noexcept | |||
{ | |||
memcpy (dest, src, num * sizeof (float)); | |||
memcpy (dest, src, (size_t) num * sizeof (float)); | |||
} | |||
void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept | |||
@@ -25,6 +25,7 @@ | |||
#ifndef JUCE_DECIBELS_H_INCLUDED | |||
#define JUCE_DECIBELS_H_INCLUDED | |||
//============================================================================== | |||
/** | |||
This class contains some helpful static methods for dealing with decibel values. | |||
@@ -31,19 +31,19 @@ | |||
//============================================================================== | |||
IIRCoefficients::IIRCoefficients() noexcept | |||
{ | |||
zeromem (c, sizeof (c)); | |||
zeromem (coefficients, sizeof (coefficients)); | |||
} | |||
IIRCoefficients::~IIRCoefficients() noexcept {} | |||
IIRCoefficients::IIRCoefficients (const IIRCoefficients& other) noexcept | |||
{ | |||
memcpy (c, other.c, sizeof (c)); | |||
memcpy (coefficients, other.coefficients, sizeof (coefficients)); | |||
} | |||
IIRCoefficients& IIRCoefficients::operator= (const IIRCoefficients& other) noexcept | |||
{ | |||
memcpy (c, other.c, sizeof (c)); | |||
memcpy (coefficients, other.coefficients, sizeof (coefficients)); | |||
return *this; | |||
} | |||
@@ -52,11 +52,11 @@ IIRCoefficients::IIRCoefficients (double c1, double c2, double c3, | |||
{ | |||
const double a = 1.0 / c4; | |||
c[0] = (float) (c1 * a); | |||
c[1] = (float) (c2 * a); | |||
c[2] = (float) (c3 * a); | |||
c[3] = (float) (c5 * a); | |||
c[4] = (float) (c6 * a); | |||
coefficients[0] = (float) (c1 * a); | |||
coefficients[1] = (float) (c2 * a); | |||
coefficients[2] = (float) (c3 * a); | |||
coefficients[3] = (float) (c5 * a); | |||
coefficients[4] = (float) (c6 * a); | |||
} | |||
IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, | |||
@@ -69,7 +69,7 @@ IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, | |||
const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); | |||
return IIRCoefficients (c1, | |||
c1 * 2.0f, | |||
c1 * 2.0, | |||
c1, | |||
1.0, | |||
c1 * 2.0 * (1.0 - nSquared), | |||
@@ -84,7 +84,7 @@ IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, | |||
const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); | |||
return IIRCoefficients (c1, | |||
c1 * -2.0f, | |||
c1 * -2.0, | |||
c1, | |||
1.0, | |||
c1 * 2.0 * (nSquared - 1.0), | |||
@@ -203,28 +203,27 @@ void IIRFilter::reset() noexcept | |||
float IIRFilter::processSingleSampleRaw (const float in) noexcept | |||
{ | |||
float out = coefficients.c[0] * in + v1; | |||
float out = coefficients.coefficients[0] * in + v1; | |||
JUCE_SNAP_TO_ZERO (out); | |||
v1 = coefficients.c[1] * in - coefficients.c[3] * out + v2; | |||
v2 = coefficients.c[2] * in - coefficients.c[4] * out; | |||
v1 = coefficients.coefficients[1] * in - coefficients.coefficients[3] * out + v2; | |||
v2 = coefficients.coefficients[2] * in - coefficients.coefficients[4] * out; | |||
return out; | |||
} | |||
void IIRFilter::processSamples (float* const samples, | |||
const int numSamples) noexcept | |||
void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept | |||
{ | |||
const SpinLock::ScopedLockType sl (processLock); | |||
if (active) | |||
{ | |||
const float c0 = coefficients.c[0]; | |||
const float c1 = coefficients.c[1]; | |||
const float c2 = coefficients.c[2]; | |||
const float c3 = coefficients.c[3]; | |||
const float c4 = coefficients.c[4]; | |||
const float c0 = coefficients.coefficients[0]; | |||
const float c1 = coefficients.coefficients[1]; | |||
const float c2 = coefficients.coefficients[2]; | |||
const float c3 = coefficients.coefficients[3]; | |||
const float c4 = coefficients.coefficients[4]; | |||
float lv1 = v1, lv2 = v2; | |||
for (int i = 0; i < numSamples; ++i) | |||
@@ -98,9 +98,11 @@ public: | |||
double Q, | |||
float gainFactor) noexcept; | |||
private: | |||
friend class IIRFilter; | |||
float c[5]; | |||
//============================================================================== | |||
/** The raw coefficients. | |||
You should leave these numbers alone unless you really know what you're doing. | |||
*/ | |||
float coefficients[5]; | |||
}; | |||
//============================================================================== | |||
@@ -83,7 +83,7 @@ int LagrangeInterpolator::process (const double actualRatio, const float* in, | |||
{ | |||
if (actualRatio == 1.0) | |||
{ | |||
memcpy (out, in, numOut * sizeof (float)); | |||
memcpy (out, in, (size_t) numOut * sizeof (float)); | |||
if (numOut >= 4) | |||
{ | |||
@@ -25,6 +25,7 @@ | |||
#ifndef JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED | |||
#define JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED | |||
//============================================================================== | |||
/** | |||
Interpolator for resampling a stream of floats using 4-point lagrange interpolation. | |||
@@ -48,19 +48,24 @@ | |||
#include <emmintrin.h> | |||
#endif | |||
#if JUCE_MAC || JUCE_IOS | |||
#ifndef JUCE_USE_VDSP_FRAMEWORK | |||
#define JUCE_USE_VDSP_FRAMEWORK 1 | |||
#endif | |||
#if (JUCE_MAC || JUCE_IOS) && JUCE_USE_VDSP_FRAMEWORK | |||
#include <Accelerate/Accelerate.h> | |||
#else | |||
#undef JUCE_USE_VDSP_FRAMEWORK | |||
#endif | |||
namespace juce | |||
{ | |||
// START_AUTOINCLUDE buffers/*.cpp, effects/*.cpp, midi/*.cpp, sources/*.cpp, synthesisers/*.cpp | |||
#include "buffers/juce_AudioDataConverters.cpp" | |||
#include "buffers/juce_AudioSampleBuffer.cpp" | |||
#include "buffers/juce_FloatVectorOperations.cpp" | |||
#include "effects/juce_IIRFilter.cpp" | |||
#include "effects/juce_IIRFilterOld.cpp" | |||
#include "effects/juce_LagrangeInterpolator.cpp" | |||
#include "midi/juce_MidiBuffer.cpp" | |||
#include "midi/juce_MidiFile.cpp" | |||
@@ -75,6 +80,5 @@ namespace juce | |||
#include "sources/juce_ReverbAudioSource.cpp" | |||
#include "sources/juce_ToneGeneratorAudioSource.cpp" | |||
#include "synthesisers/juce_Synthesiser.cpp" | |||
// END_AUTOINCLUDE | |||
} |
@@ -31,30 +31,29 @@ | |||
namespace juce | |||
{ | |||
// START_AUTOINCLUDE buffers, effects, midi, sources, synthesisers | |||
#include "buffers/juce_AudioDataConverters.h" | |||
#include "buffers/juce_AudioSampleBuffer.h" | |||
#include "buffers/juce_FloatVectorOperations.h" | |||
#include "effects/juce_Decibels.h" | |||
#include "effects/juce_IIRFilter.h" | |||
#include "effects/juce_IIRFilterOld.h" | |||
#include "effects/juce_LagrangeInterpolator.h" | |||
#include "effects/juce_Reverb.h" | |||
#include "midi/juce_MidiMessage.h" | |||
#include "midi/juce_MidiBuffer.h" | |||
#include "midi/juce_MidiMessageSequence.h" | |||
#include "midi/juce_MidiFile.h" | |||
#include "midi/juce_MidiKeyboardState.h" | |||
#include "midi/juce_MidiMessage.h" | |||
#include "midi/juce_MidiMessageSequence.h" | |||
#include "sources/juce_AudioSource.h" | |||
#include "sources/juce_PositionableAudioSource.h" | |||
#include "sources/juce_BufferingAudioSource.h" | |||
#include "sources/juce_ChannelRemappingAudioSource.h" | |||
#include "sources/juce_IIRFilterAudioSource.h" | |||
#include "sources/juce_MixerAudioSource.h" | |||
#include "sources/juce_PositionableAudioSource.h" | |||
#include "sources/juce_ResamplingAudioSource.h" | |||
#include "sources/juce_ReverbAudioSource.h" | |||
#include "sources/juce_ToneGeneratorAudioSource.h" | |||
#include "synthesisers/juce_Synthesiser.h" | |||
// END_AUTOINCLUDE | |||
} | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_MIDIBUFFER_H_INCLUDED | |||
#define JUCE_MIDIBUFFER_H_INCLUDED | |||
#include "juce_MidiMessage.h" | |||
//============================================================================== | |||
/** | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_MIDIFILE_H_INCLUDED | |||
#define JUCE_MIDIFILE_H_INCLUDED | |||
#include "juce_MidiMessageSequence.h" | |||
//============================================================================== | |||
/** | |||
@@ -25,7 +25,6 @@ | |||
#ifndef JUCE_MIDIKEYBOARDSTATE_H_INCLUDED | |||
#define JUCE_MIDIKEYBOARDSTATE_H_INCLUDED | |||
#include "juce_MidiBuffer.h" | |||
class MidiKeyboardState; | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED | |||
#define JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED | |||
#include "juce_MidiMessage.h" | |||
//============================================================================== | |||
/** | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_AUDIOSOURCE_H_INCLUDED | |||
#define JUCE_AUDIOSOURCE_H_INCLUDED | |||
#include "../buffers/juce_AudioSampleBuffer.h" | |||
//============================================================================== | |||
/** | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED | |||
#include "juce_PositionableAudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -76,7 +74,7 @@ public: | |||
void releaseResources() override; | |||
/** Implementation of the AudioSource method. */ | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override; | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
//============================================================================== | |||
/** Implements the PositionableAudioSource method. */ | |||
@@ -104,7 +102,7 @@ private: | |||
bool readNextBufferChunk(); | |||
void readBufferSection (int64 start, int length, int bufferOffset); | |||
int useTimeSlice(); | |||
int useTimeSlice() override; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioSource) | |||
}; | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -113,32 +111,29 @@ public: | |||
//============================================================================== | |||
/** Returns an XML object to encapsulate the state of the mappings. | |||
@see restoreFromXml | |||
*/ | |||
XmlElement* createXml() const; | |||
/** Restores the mappings from an XML object created by createXML(). | |||
@see createXml | |||
*/ | |||
void restoreFromXml (const XmlElement& e); | |||
void restoreFromXml (const XmlElement&); | |||
//============================================================================== | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void releaseResources(); | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
void releaseResources() override; | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
//============================================================================== | |||
OptionalScopedPointer<AudioSource> source; | |||
Array <int> remappedInputs, remappedOutputs; | |||
Array<int> remappedInputs, remappedOutputs; | |||
int requiredNumberOfChannels; | |||
AudioSampleBuffer buffer; | |||
AudioSourceChannelInfo remappedInfo; | |||
CriticalSection lock; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelRemappingAudioSource) | |||
@@ -25,9 +25,6 @@ | |||
#ifndef JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
#include "../effects/juce_IIRFilter.h" | |||
//============================================================================== | |||
/** | |||
@@ -57,14 +54,14 @@ public: | |||
void makeInactive(); | |||
//============================================================================== | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void releaseResources(); | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
void releaseResources() override; | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
//============================================================================== | |||
OptionalScopedPointer<AudioSource> input; | |||
OwnedArray <IIRFilter> iirFilters; | |||
OwnedArray<IIRFilter> iirFilters; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource) | |||
}; | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_MIXERAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_MIXERAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -76,20 +74,20 @@ public: | |||
/** Implementation of the AudioSource method. | |||
This will call prepareToPlay() on all its input sources. | |||
*/ | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
/** Implementation of the AudioSource method. | |||
This will call releaseResources() on all its input sources. | |||
*/ | |||
void releaseResources(); | |||
void releaseResources() override; | |||
/** Implementation of the AudioSource method. */ | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
//============================================================================== | |||
Array <AudioSource*> inputs; | |||
Array<AudioSource*> inputs; | |||
BigInteger inputsToDelete; | |||
CriticalSection lock; | |||
AudioSampleBuffer tempBuffer; | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -69,9 +67,9 @@ public: | |||
double getResamplingRatio() const noexcept { return ratio; } | |||
//============================================================================== | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void releaseResources(); | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
void releaseResources() override; | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
//============================================================================== | |||
@@ -25,9 +25,6 @@ | |||
#ifndef JUCE_REVERBAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_REVERBAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
#include "../effects/juce_Reverb.h" | |||
//============================================================================== | |||
/** | |||
@@ -61,9 +58,9 @@ public: | |||
bool isBypassed() const noexcept { return bypass; } | |||
//============================================================================== | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void releaseResources(); | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
void releaseResources() override; | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
//============================================================================== | |||
@@ -25,8 +25,6 @@ | |||
#ifndef JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED | |||
#define JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED | |||
#include "juce_AudioSource.h" | |||
//============================================================================== | |||
/** | |||
@@ -53,13 +51,13 @@ public: | |||
//============================================================================== | |||
/** Implementation of the AudioSource method. */ | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; | |||
/** Implementation of the AudioSource method. */ | |||
void releaseResources(); | |||
void releaseResources() override; | |||
/** Implementation of the AudioSource method. */ | |||
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||
void getNextAudioBlock (const AudioSourceChannelInfo&) override; | |||
private: | |||
@@ -25,9 +25,6 @@ | |||
#ifndef JUCE_SYNTHESISER_H_INCLUDED | |||
#define JUCE_SYNTHESISER_H_INCLUDED | |||
#include "../buffers/juce_AudioSampleBuffer.h" | |||
#include "../midi/juce_MidiBuffer.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_ABSTRACTFIFO_H_INCLUDED | |||
#define JUCE_ABSTRACTFIFO_H_INCLUDED | |||
#include "../memory/juce_Atomic.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_ARRAY_H_INCLUDED | |||
#define JUCE_ARRAY_H_INCLUDED | |||
#include "juce_ArrayAllocationBase.h" | |||
#include "juce_ElementComparator.h" | |||
#include "../threads/juce_CriticalSection.h" | |||
//============================================================================== | |||
/** | |||
@@ -1025,9 +1021,11 @@ public: | |||
//============================================================================== | |||
#ifndef DOXYGEN | |||
// Note that the swapWithArray method has been replaced by a more flexible templated version, | |||
// and renamed "swapWith" to be more consistent with the names used in other classes. | |||
JUCE_DEPRECATED_WITH_BODY (void swapWithArray (Array& other) noexcept, { swapWith (other); }) | |||
#endif | |||
private: | |||
//============================================================================== | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_ARRAYALLOCATIONBASE_H_INCLUDED | |||
#define JUCE_ARRAYALLOCATIONBASE_H_INCLUDED | |||
#include "../memory/juce_HeapBlock.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_DYNAMICOBJECT_H_INCLUDED | |||
#define JUCE_DYNAMICOBJECT_H_INCLUDED | |||
#include "juce_NamedValueSet.h" | |||
#include "../memory/juce_ReferenceCountedObject.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,6 +29,27 @@ | |||
#ifndef JUCE_ELEMENTCOMPARATOR_H_INCLUDED | |||
#define JUCE_ELEMENTCOMPARATOR_H_INCLUDED | |||
#ifndef DOXYGEN | |||
/** This is an internal helper class which converts a juce ElementComparator style | |||
class (using a "compareElements" method) into a class that's compatible with | |||
std::sort (i.e. using an operator() to compare the elements) | |||
*/ | |||
template <typename ElementComparator> | |||
struct SortFunctionConverter | |||
{ | |||
SortFunctionConverter (ElementComparator& e) : comparator (e) {} | |||
template <typename Type> | |||
bool operator() (Type a, Type b) { return comparator.compareElements (a, b) < 0; } | |||
private: | |||
ElementComparator& comparator; | |||
SortFunctionConverter& operator= (const SortFunctionConverter&) JUCE_DELETED_FUNCTION; | |||
}; | |||
#endif | |||
//============================================================================== | |||
/** | |||
@@ -65,117 +86,12 @@ static void sortArray (ElementComparator& comparator, | |||
int lastElement, | |||
const bool retainOrderOfEquivalentItems) | |||
{ | |||
(void) comparator; // if you pass in an object with a static compareElements() method, this | |||
// avoids getting warning messages about the parameter being unused | |||
if (lastElement > firstElement) | |||
{ | |||
if (retainOrderOfEquivalentItems) | |||
{ | |||
for (int i = firstElement; i < lastElement; ++i) | |||
{ | |||
if (comparator.compareElements (array[i], array [i + 1]) > 0) | |||
{ | |||
std::swap (array[i], array[i + 1]); | |||
if (i > firstElement) | |||
i -= 2; | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
int fromStack[30], toStack[30]; | |||
int stackIndex = 0; | |||
SortFunctionConverter<ElementComparator> converter (comparator); | |||
for (;;) | |||
{ | |||
const int size = (lastElement - firstElement) + 1; | |||
if (size <= 8) | |||
{ | |||
int j = lastElement; | |||
int maxIndex; | |||
while (j > firstElement) | |||
{ | |||
maxIndex = firstElement; | |||
for (int k = firstElement + 1; k <= j; ++k) | |||
if (comparator.compareElements (array[k], array [maxIndex]) > 0) | |||
maxIndex = k; | |||
std::swap (array[j], array[maxIndex]); | |||
--j; | |||
} | |||
} | |||
else | |||
{ | |||
const int mid = firstElement + (size >> 1); | |||
std::swap (array[mid], array[firstElement]); | |||
int i = firstElement; | |||
int j = lastElement + 1; | |||
for (;;) | |||
{ | |||
while (++i <= lastElement | |||
&& comparator.compareElements (array[i], array [firstElement]) <= 0) | |||
{} | |||
while (--j > firstElement | |||
&& comparator.compareElements (array[j], array [firstElement]) >= 0) | |||
{} | |||
if (j < i) | |||
break; | |||
std::swap (array[i], array[j]); | |||
} | |||
std::swap (array[j], array[firstElement]); | |||
if (j - 1 - firstElement >= lastElement - i) | |||
{ | |||
if (firstElement + 1 < j) | |||
{ | |||
fromStack [stackIndex] = firstElement; | |||
toStack [stackIndex] = j - 1; | |||
++stackIndex; | |||
} | |||
if (i < lastElement) | |||
{ | |||
firstElement = i; | |||
continue; | |||
} | |||
} | |||
else | |||
{ | |||
if (i < lastElement) | |||
{ | |||
fromStack [stackIndex] = i; | |||
toStack [stackIndex] = lastElement; | |||
++stackIndex; | |||
} | |||
if (firstElement + 1 < j) | |||
{ | |||
lastElement = j - 1; | |||
continue; | |||
} | |||
} | |||
} | |||
if (--stackIndex < 0) | |||
break; | |||
jassert (stackIndex < numElementsInArray (fromStack)); | |||
firstElement = fromStack [stackIndex]; | |||
lastElement = toStack [stackIndex]; | |||
} | |||
} | |||
} | |||
if (retainOrderOfEquivalentItems) | |||
std::stable_sort (array + firstElement, array + lastElement + 1, converter); | |||
else | |||
std::sort (array + firstElement, array + lastElement + 1, converter); | |||
} | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_HASHMAP_H_INCLUDED | |||
#define JUCE_HASHMAP_H_INCLUDED | |||
#include "juce_OwnedArray.h" | |||
#include "juce_LinkedListPointer.h" | |||
#include "../memory/juce_ScopedPointer.h" | |||
//============================================================================== | |||
/** | |||
@@ -109,11 +105,10 @@ public: | |||
//============================================================================== | |||
/** Creates an empty hash-map. | |||
The numberOfSlots parameter specifies the number of hash entries the map will | |||
use. This will be the "upperLimit" parameter that is passed to your generateHash() | |||
function. The number of hash slots will grow automatically if necessary, or | |||
it can be remapped manually using remapTable(). | |||
@param numberOfSlots Specifies the number of hash entries the map will use. This will be | |||
the "upperLimit" parameter that is passed to your generateHash() | |||
function. The number of hash slots will grow automatically if necessary, | |||
or it can be remapped manually using remapTable(). | |||
@param hashFunction An instance of HashFunctionType, which will be copied and | |||
stored to use with the HashMap. This parameter can be omitted | |||
if HashFunctionType has a default constructor. | |||
@@ -29,13 +29,6 @@ | |||
#ifndef JUCE_NAMEDVALUESET_H_INCLUDED | |||
#define JUCE_NAMEDVALUESET_H_INCLUDED | |||
#include "juce_Variant.h" | |||
#include "../containers/juce_LinkedListPointer.h" | |||
class XmlElement; | |||
#ifndef DOXYGEN | |||
class JSONFormatter; | |||
#endif | |||
//============================================================================== | |||
/** Holds a set of named var objects. | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_OWNEDARRAY_H_INCLUDED | |||
#define JUCE_OWNEDARRAY_H_INCLUDED | |||
#include "juce_ArrayAllocationBase.h" | |||
#include "juce_ElementComparator.h" | |||
#include "../threads/juce_CriticalSection.h" | |||
//============================================================================== | |||
/** An array designed for holding objects. | |||
@@ -389,7 +385,7 @@ public: | |||
{ | |||
if (indexToChange >= 0) | |||
{ | |||
ObjectClass* toDelete = nullptr; | |||
ScopedPointer<ObjectClass> toDelete; | |||
{ | |||
const ScopedLockType lock (getLock()); | |||
@@ -401,7 +397,7 @@ public: | |||
toDelete = data.elements [indexToChange]; | |||
if (toDelete == newObject) | |||
toDelete = nullptr; | |||
toDelete.release(); | |||
} | |||
data.elements [indexToChange] = const_cast <ObjectClass*> (newObject); | |||
@@ -412,10 +408,6 @@ public: | |||
data.elements [numUsed++] = const_cast <ObjectClass*> (newObject); | |||
} | |||
} | |||
delete toDelete; // don't want to use a ScopedPointer here because if the | |||
// object has a private destructor, both OwnedArray and | |||
// ScopedPointer would need to be friend classes.. | |||
} | |||
else | |||
{ | |||
@@ -575,7 +567,7 @@ public: | |||
void remove (const int indexToRemove, | |||
const bool deleteObject = true) | |||
{ | |||
ObjectClass* toDelete = nullptr; | |||
ScopedPointer<ObjectClass> toDelete; | |||
{ | |||
const ScopedLockType lock (getLock()); | |||
@@ -595,10 +587,6 @@ public: | |||
} | |||
} | |||
delete toDelete; // don't want to use a ScopedPointer here because if the | |||
// object has a private destructor, both OwnedArray and | |||
// ScopedPointer would need to be friend classes.. | |||
if ((numUsed << 1) < data.numAllocated) | |||
minimiseStorageOverheads(); | |||
} | |||
@@ -686,7 +674,7 @@ public: | |||
{ | |||
for (int i = startIndex; i < endIndex; ++i) | |||
{ | |||
delete data.elements [i]; | |||
ContainerDeletePolicy<ObjectClass>::destroy (data.elements [i]); | |||
data.elements [i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) | |||
} | |||
} | |||
@@ -875,9 +863,11 @@ public: | |||
//============================================================================== | |||
#ifndef DOXYGEN | |||
// Note that the swapWithArray method has been replaced by a more flexible templated version, | |||
// and renamed "swapWith" to be more consistent with the names used in other classes. | |||
JUCE_DEPRECATED_WITH_BODY (void swapWithArray (OwnedArray& other) noexcept, { swapWith (other); }) | |||
#endif | |||
private: | |||
//============================================================================== | |||
@@ -887,7 +877,7 @@ private: | |||
void deleteAllObjects() | |||
{ | |||
while (numUsed > 0) | |||
delete data.elements [--numUsed]; | |||
ContainerDeletePolicy<ObjectClass>::destroy (data.elements [--numUsed]); | |||
} | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray) | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_PROPERTYSET_H_INCLUDED | |||
#define JUCE_PROPERTYSET_H_INCLUDED | |||
#include "../text/juce_StringPairArray.h" | |||
#include "../xml/juce_XmlElement.h" | |||
#include "../containers/juce_Variant.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,15 +29,18 @@ | |||
#ifndef JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED | |||
#define JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED | |||
#include "../memory/juce_ReferenceCountedObject.h" | |||
#include "juce_ArrayAllocationBase.h" | |||
#include "juce_ElementComparator.h" | |||
#include "../threads/juce_CriticalSection.h" | |||
//============================================================================== | |||
/** | |||
Holds a list of objects derived from ReferenceCountedObject. | |||
Holds a list of objects derived from ReferenceCountedObject, or which implement basic | |||
reference-count handling methods. | |||
The template parameter specifies the class of the object you want to point to - the easiest | |||
way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject | |||
or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable | |||
class by implementing a set of mathods called incReferenceCount(), decReferenceCount(), and | |||
decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods | |||
should behave. | |||
A ReferenceCountedArray holds objects derived from ReferenceCountedObject, | |||
and takes care of incrementing and decrementing their ref counts when they | |||
@@ -130,7 +133,7 @@ public: | |||
while (numUsed > 0) | |||
if (ObjectClass* o = data.elements [--numUsed]) | |||
o->decReferenceCount(); | |||
releaseObject (o); | |||
jassert (numUsed == 0); | |||
data.setAllocatedSize (0); | |||
@@ -392,7 +395,7 @@ public: | |||
if (indexToChange < numUsed) | |||
{ | |||
if (ObjectClass* o = data.elements [indexToChange]) | |||
o->decReferenceCount(); | |||
releaseObject (o); | |||
data.elements [indexToChange] = newObject; | |||
} | |||
@@ -542,7 +545,7 @@ public: | |||
ObjectClass** const e = data.elements + indexToRemove; | |||
if (ObjectClass* o = *e) | |||
o->decReferenceCount(); | |||
releaseObject (o); | |||
--numUsed; | |||
const int numberToShift = numUsed - indexToRemove; | |||
@@ -576,7 +579,7 @@ public: | |||
if (ObjectClass* o = *e) | |||
{ | |||
removedItem = o; | |||
o->decReferenceCount(); | |||
releaseObject (o); | |||
} | |||
--numUsed; | |||
@@ -636,7 +639,7 @@ public: | |||
{ | |||
if (ObjectClass* o = data.elements[i]) | |||
{ | |||
o->decReferenceCount(); | |||
releaseObject (o); | |||
data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) | |||
} | |||
} | |||
@@ -858,14 +861,22 @@ public: | |||
//============================================================================== | |||
#ifndef DOXYGEN | |||
// Note that the swapWithArray method has been replaced by a more flexible templated version, | |||
// and renamed "swapWith" to be more consistent with the names used in other classes. | |||
JUCE_DEPRECATED_WITH_BODY (void swapWithArray (ReferenceCountedArray& other) noexcept, { swapWith (other); }) | |||
#endif | |||
private: | |||
//============================================================================== | |||
ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse> data; | |||
int numUsed; | |||
static void releaseObject (ObjectClass* o) | |||
{ | |||
if (o->decReferenceCountWithoutDeleting()) | |||
ContainerDeletePolicy<ObjectClass>::destroy (o); | |||
} | |||
}; | |||
@@ -29,15 +29,11 @@ | |||
#ifndef JUCE_SORTEDSET_H_INCLUDED | |||
#define JUCE_SORTEDSET_H_INCLUDED | |||
#include "juce_ArrayAllocationBase.h" | |||
#include "../threads/juce_CriticalSection.h" | |||
#if JUCE_MSVC | |||
#pragma warning (push) | |||
#pragma warning (disable: 4512) | |||
#pragma warning (push) | |||
#pragma warning (disable: 4512) | |||
#endif | |||
//============================================================================== | |||
/** | |||
Holds a set of unique primitive objects, such as ints or doubles. | |||
@@ -491,7 +487,7 @@ private: | |||
}; | |||
#if JUCE_MSVC | |||
#pragma warning (pop) | |||
#pragma warning (pop) | |||
#endif | |||
#endif // JUCE_SORTEDSET_H_INCLUDED |
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_SPARSESET_H_INCLUDED | |||
#define JUCE_SPARSESET_H_INCLUDED | |||
#include "../maths/juce_Range.h" | |||
#include "../threads/juce_CriticalSection.h" | |||
//============================================================================== | |||
/** | |||
@@ -678,12 +678,12 @@ var var::readFromStream (InputStream& input) | |||
case varMarker_Binary: | |||
{ | |||
MemoryBlock mb (numBytes - 1); | |||
MemoryBlock mb ((size_t) numBytes - 1); | |||
if (numBytes > 1) | |||
{ | |||
const int numRead = input.read (mb.getData(), numBytes - 1); | |||
mb.setSize (numRead); | |||
mb.setSize ((size_t) numRead); | |||
} | |||
return var (mb); | |||
@@ -29,15 +29,6 @@ | |||
#ifndef JUCE_VARIANT_H_INCLUDED | |||
#define JUCE_VARIANT_H_INCLUDED | |||
#include "../text/juce_Identifier.h" | |||
#include "../streams/juce_OutputStream.h" | |||
#include "../streams/juce_InputStream.h" | |||
#include "../containers/juce_Array.h" | |||
#ifndef DOXYGEN | |||
class ReferenceCountedObject; | |||
class DynamicObject; | |||
#endif | |||
//============================================================================== | |||
/** | |||
@@ -109,8 +109,8 @@ bool DirectoryIterator::next (bool* const isDirResult, bool* const isHiddenResul | |||
matches = (whatToLookFor & File::findFiles) != 0; | |||
} | |||
// if recursive, we're not relying on the OS iterator to do the wildcard match, so do it now.. | |||
if (matches && isRecursive) | |||
// if we're not relying on the OS iterator to do the wildcard match, do it now.. | |||
if (matches && (isRecursive || wildCards.size() > 1)) | |||
matches = fileMatches (wildCards, filename); | |||
if (matches && (whatToLookFor & File::ignoreHiddenFiles) != 0) | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_DIRECTORYITERATOR_H_INCLUDED | |||
#define JUCE_DIRECTORYITERATOR_H_INCLUDED | |||
#include "juce_File.h" | |||
#include "../memory/juce_ScopedPointer.h" | |||
//============================================================================== | |||
/** | |||
@@ -135,13 +132,13 @@ private: | |||
private: | |||
friend class DirectoryIterator; | |||
friend class ScopedPointer<Pimpl>; | |||
friend struct ContainerDeletePolicy<Pimpl>; | |||
ScopedPointer<Pimpl> pimpl; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator) | |||
}; | |||
friend class ScopedPointer<NativeIterator::Pimpl>; | |||
friend struct ContainerDeletePolicy<NativeIterator::Pimpl>; | |||
StringArray wildCards; | |||
NativeIterator fileFinder; | |||
String wildCard, path; | |||
@@ -150,7 +147,7 @@ private: | |||
const int whatToLookFor; | |||
const bool isRecursive; | |||
bool hasBeenAdvanced; | |||
ScopedPointer <DirectoryIterator> subIterator; | |||
ScopedPointer<DirectoryIterator> subIterator; | |||
File currentFile; | |||
static StringArray parseWildcards (const String& pattern); | |||
@@ -665,7 +665,7 @@ FileInputStream* File::createInputStream() const | |||
return nullptr; | |||
} | |||
FileOutputStream* File::createOutputStream (const int bufferSize) const | |||
FileOutputStream* File::createOutputStream (const size_t bufferSize) const | |||
{ | |||
ScopedPointer<FileOutputStream> out (new FileOutputStream (*this, bufferSize)); | |||
@@ -29,15 +29,6 @@ | |||
#ifndef JUCE_FILE_H_INCLUDED | |||
#define JUCE_FILE_H_INCLUDED | |||
#include "../containers/juce_Array.h" | |||
#include "../time/juce_Time.h" | |||
#include "../text/juce_StringArray.h" | |||
#include "../memory/juce_MemoryBlock.h" | |||
#include "../memory/juce_ScopedPointer.h" | |||
#include "../misc/juce_Result.h" | |||
class FileInputStream; | |||
class FileOutputStream; | |||
//============================================================================== | |||
/** | |||
@@ -589,7 +580,7 @@ public: | |||
end of the file), or nullptr if the file can't be opened for some reason | |||
@see createInputStream, appendData, appendText | |||
*/ | |||
FileOutputStream* createOutputStream (int bufferSize = 0x8000) const; | |||
FileOutputStream* createOutputStream (size_t bufferSize = 0x8000) const; | |||
//============================================================================== | |||
/** Loads a file's contents into memory as a block of binary data. | |||
@@ -771,6 +762,15 @@ public: | |||
/** The folder that contains the user's desktop objects. */ | |||
userDesktopDirectory, | |||
/** The most likely place where a user might store their music files. */ | |||
userMusicDirectory, | |||
/** The most likely place where a user might store their movie files. */ | |||
userMoviesDirectory, | |||
/** The most likely place where a user might store their picture files. */ | |||
userPicturesDirectory, | |||
/** The folder in which applications store their persistent user-specific settings. | |||
On Windows, this might be "\Documents and Settings\username\Application Data". | |||
On the Mac, it might be "~/Library". If you're going to store your settings in here, | |||
@@ -788,6 +788,13 @@ public: | |||
*/ | |||
commonApplicationDataDirectory, | |||
/** A place to put documents which are shared by all users of the machine. | |||
On Windows this may be somewhere like "C:\Users\Public\Documents", on OSX it | |||
will be something like "/Users/Shared". Other OSes may have no such concept | |||
though, so be careful. | |||
*/ | |||
commonDocumentsDirectory, | |||
/** The folder that should be used for temporary files. | |||
Always delete them when you're finished, to keep the user's computer tidy! | |||
*/ | |||
@@ -830,16 +837,7 @@ public: | |||
So on windows, this would be something like "c:\program files", on the | |||
Mac "/Applications", or "/usr" on linux. | |||
*/ | |||
globalApplicationsDirectory, | |||
/** The most likely place where a user might store their music files. */ | |||
userMusicDirectory, | |||
/** The most likely place where a user might store their movie files. */ | |||
userMoviesDirectory, | |||
/** The most likely place where a user might store their picture files. */ | |||
userPicturesDirectory | |||
globalApplicationsDirectory | |||
}; | |||
/** Finds the location of a special type of file or directory, such as a home folder or | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_FILEINPUTSTREAM_H_INCLUDED | |||
#define JUCE_FILEINPUTSTREAM_H_INCLUDED | |||
#include "juce_File.h" | |||
#include "../streams/juce_InputStream.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,14 +29,14 @@ | |||
int64 juce_fileSetPosition (void* handle, int64 pos); | |||
//============================================================================== | |||
FileOutputStream::FileOutputStream (const File& f, const int bufferSize_) | |||
FileOutputStream::FileOutputStream (const File& f, const size_t bufferSizeToUse) | |||
: file (f), | |||
fileHandle (nullptr), | |||
status (Result::ok()), | |||
currentPosition (0), | |||
bufferSize (bufferSize_), | |||
bufferSize (bufferSizeToUse), | |||
bytesInBuffer (0), | |||
buffer ((size_t) jmax (bufferSize_, 16)) | |||
buffer (jmax (bufferSizeToUse, (size_t) 16)) | |||
{ | |||
openHandle(); | |||
} | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_FILEOUTPUTSTREAM_H_INCLUDED | |||
#define JUCE_FILEOUTPUTSTREAM_H_INCLUDED | |||
#include "juce_File.h" | |||
#include "../streams/juce_OutputStream.h" | |||
//============================================================================== | |||
/** | |||
@@ -57,7 +54,7 @@ public: | |||
@see TemporaryFile | |||
*/ | |||
FileOutputStream (const File& fileToWriteTo, | |||
int bufferSizeToUse = 16384); | |||
size_t bufferSizeToUse = 16384); | |||
/** Destructor. */ | |||
~FileOutputStream(); | |||
@@ -26,9 +26,8 @@ | |||
============================================================================== | |||
*/ | |||
FileSearchPath::FileSearchPath() | |||
{ | |||
} | |||
FileSearchPath::FileSearchPath() {} | |||
FileSearchPath::~FileSearchPath() {} | |||
FileSearchPath::FileSearchPath (const String& path) | |||
{ | |||
@@ -36,12 +35,14 @@ FileSearchPath::FileSearchPath (const String& path) | |||
} | |||
FileSearchPath::FileSearchPath (const FileSearchPath& other) | |||
: directories (other.directories) | |||
: directories (other.directories) | |||
{ | |||
} | |||
FileSearchPath::~FileSearchPath() | |||
FileSearchPath& FileSearchPath::operator= (const FileSearchPath& other) | |||
{ | |||
directories = other.directories; | |||
return *this; | |||
} | |||
FileSearchPath& FileSearchPath::operator= (const String& path) | |||
@@ -29,13 +29,10 @@ | |||
#ifndef JUCE_FILESEARCHPATH_H_INCLUDED | |||
#define JUCE_FILESEARCHPATH_H_INCLUDED | |||
#include "juce_File.h" | |||
#include "../text/juce_StringArray.h" | |||
//============================================================================== | |||
/** | |||
Encapsulates a set of folders that make up a search path. | |||
Represents a set of folders that make up a search path. | |||
@see File | |||
*/ | |||
@@ -56,7 +53,10 @@ public: | |||
FileSearchPath (const String& path); | |||
/** Creates a copy of another search path. */ | |||
FileSearchPath (const FileSearchPath& other); | |||
FileSearchPath (const FileSearchPath&); | |||
/** Copies another search path. */ | |||
FileSearchPath& operator= (const FileSearchPath&); | |||
/** Destructor. */ | |||
~FileSearchPath(); | |||
@@ -70,15 +70,12 @@ public: | |||
//============================================================================== | |||
/** Returns the number of folders in this search path. | |||
@see operator[] | |||
*/ | |||
int getNumPaths() const; | |||
/** Returns one of the folders in this search path. | |||
The file returned isn't guaranteed to actually be a valid directory. | |||
@see getNumPaths | |||
*/ | |||
File operator[] (int index) const; | |||
@@ -102,7 +99,6 @@ public: | |||
void remove (int indexToRemove); | |||
/** Merges another search path into this one. | |||
This will remove any duplicate directories. | |||
*/ | |||
void addPath (const FileSearchPath& other); | |||
@@ -161,7 +157,7 @@ private: | |||
//============================================================================== | |||
StringArray directories; | |||
void init (const String& path); | |||
void init (const String&); | |||
JUCE_LEAK_DETECTOR (FileSearchPath) | |||
}; | |||
@@ -29,7 +29,6 @@ | |||
#ifndef JUCE_MEMORYMAPPEDFILE_H_INCLUDED | |||
#define JUCE_MEMORYMAPPEDFILE_H_INCLUDED | |||
#include "juce_File.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_TEMPORARYFILE_H_INCLUDED | |||
#define JUCE_TEMPORARYFILE_H_INCLUDED | |||
#include "juce_File.h" | |||
//============================================================================== | |||
/** | |||
@@ -316,7 +316,7 @@ private: | |||
buffer.appendUTF8Char (c); | |||
} | |||
result = buffer.toString(); | |||
result = buffer.toUTF8(); | |||
return Result::ok(); | |||
} | |||
}; | |||
@@ -526,7 +526,7 @@ String JSON::toString (const var& data, const bool allOnOneLine) | |||
{ | |||
MemoryOutputStream mo (1024); | |||
JSONFormatter::write (mo, data, 0, allOnOneLine); | |||
return mo.toString(); | |||
return mo.toUTF8(); | |||
} | |||
void JSON::writeToStream (OutputStream& output, const var& data, const bool allOnOneLine) | |||
@@ -29,12 +29,6 @@ | |||
#ifndef JUCE_JSON_H_INCLUDED | |||
#define JUCE_JSON_H_INCLUDED | |||
#include "../misc/juce_Result.h" | |||
#include "../containers/juce_Variant.h" | |||
class InputStream; | |||
class OutputStream; | |||
class File; | |||
//============================================================================== | |||
/** | |||
@@ -125,6 +125,10 @@ | |||
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 | |||
#endif | |||
#ifndef JUCE_STRING_UTF_TYPE | |||
#define JUCE_STRING_UTF_TYPE 8 | |||
#endif | |||
//============================================================================= | |||
//============================================================================= | |||
#if JUCE_MSVC | |||
@@ -141,108 +145,128 @@ | |||
namespace juce | |||
{ | |||
// START_AUTOINCLUDE containers, files, json, logging, maths, memory, misc, network, | |||
// streams, system, text, threads, time, unit_tests, xml, zip | |||
#include "containers/juce_AbstractFifo.h" | |||
#include "containers/juce_Array.h" | |||
#include "containers/juce_ArrayAllocationBase.h" | |||
#include "containers/juce_DynamicObject.h" | |||
class MemoryBlock; | |||
class File; | |||
class InputStream; | |||
class OutputStream; | |||
class DynamicObject; | |||
class FileInputStream; | |||
class FileOutputStream; | |||
class XmlElement; | |||
class JSONFormatter; | |||
extern JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger(); | |||
extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noexcept; | |||
#include "memory/juce_Memory.h" | |||
#include "maths/juce_MathsFunctions.h" | |||
#include "memory/juce_ByteOrder.h" | |||
#include "memory/juce_Atomic.h" | |||
#include "text/juce_CharacterFunctions.h" | |||
#if JUCE_MSVC | |||
#pragma warning (push) | |||
#pragma warning (disable: 4514 4996) | |||
#endif | |||
#include "text/juce_CharPointer_UTF8.h" | |||
#include "text/juce_CharPointer_UTF16.h" | |||
#include "text/juce_CharPointer_UTF32.h" | |||
#include "text/juce_CharPointer_ASCII.h" | |||
#if JUCE_MSVC | |||
#pragma warning (pop) | |||
#endif | |||
#include "text/juce_String.h" | |||
#include "logging/juce_Logger.h" | |||
#include "memory/juce_LeakedObjectDetector.h" | |||
#include "memory/juce_ContainerDeletePolicy.h" | |||
#include "memory/juce_HeapBlock.h" | |||
#include "memory/juce_MemoryBlock.h" | |||
#include "memory/juce_ReferenceCountedObject.h" | |||
#include "memory/juce_ScopedPointer.h" | |||
#include "memory/juce_OptionalScopedPointer.h" | |||
#include "memory/juce_Singleton.h" | |||
#include "memory/juce_WeakReference.h" | |||
#include "threads/juce_ScopedLock.h" | |||
#include "threads/juce_CriticalSection.h" | |||
#include "maths/juce_Range.h" | |||
#include "containers/juce_ElementComparator.h" | |||
#include "containers/juce_HashMap.h" | |||
#include "containers/juce_ArrayAllocationBase.h" | |||
#include "containers/juce_Array.h" | |||
#include "containers/juce_LinkedListPointer.h" | |||
#include "containers/juce_NamedValueSet.h" | |||
#include "containers/juce_OwnedArray.h" | |||
#include "containers/juce_PropertySet.h" | |||
#include "containers/juce_ReferenceCountedArray.h" | |||
#include "containers/juce_ScopedValueSetter.h" | |||
#include "containers/juce_SortedSet.h" | |||
#include "containers/juce_SparseSet.h" | |||
#include "containers/juce_AbstractFifo.h" | |||
#include "text/juce_NewLine.h" | |||
#include "text/juce_StringPool.h" | |||
#include "text/juce_Identifier.h" | |||
#include "text/juce_StringArray.h" | |||
#include "text/juce_StringPairArray.h" | |||
#include "text/juce_TextDiff.h" | |||
#include "text/juce_LocalisedStrings.h" | |||
#include "misc/juce_Result.h" | |||
#include "containers/juce_Variant.h" | |||
#include "files/juce_DirectoryIterator.h" | |||
#include "containers/juce_NamedValueSet.h" | |||
#include "containers/juce_DynamicObject.h" | |||
#include "containers/juce_HashMap.h" | |||
#include "time/juce_RelativeTime.h" | |||
#include "time/juce_Time.h" | |||
#include "streams/juce_InputStream.h" | |||
#include "streams/juce_OutputStream.h" | |||
#include "streams/juce_BufferedInputStream.h" | |||
#include "streams/juce_MemoryInputStream.h" | |||
#include "streams/juce_MemoryOutputStream.h" | |||
#include "streams/juce_SubregionStream.h" | |||
#include "streams/juce_InputSource.h" | |||
#include "files/juce_File.h" | |||
#include "files/juce_DirectoryIterator.h" | |||
#include "files/juce_FileInputStream.h" | |||
#include "files/juce_FileOutputStream.h" | |||
#include "files/juce_FileSearchPath.h" | |||
#include "files/juce_MemoryMappedFile.h" | |||
#include "files/juce_TemporaryFile.h" | |||
#include "json/juce_JSON.h" | |||
#include "streams/juce_FileInputSource.h" | |||
#include "logging/juce_FileLogger.h" | |||
#include "logging/juce_Logger.h" | |||
#include "json/juce_JSON.h" | |||
#include "maths/juce_BigInteger.h" | |||
#include "maths/juce_Expression.h" | |||
#include "maths/juce_MathsFunctions.h" | |||
#include "maths/juce_Random.h" | |||
#include "maths/juce_Range.h" | |||
#include "memory/juce_Atomic.h" | |||
#include "memory/juce_ByteOrder.h" | |||
#include "memory/juce_HeapBlock.h" | |||
#include "memory/juce_LeakedObjectDetector.h" | |||
#include "memory/juce_Memory.h" | |||
#include "memory/juce_MemoryBlock.h" | |||
#include "memory/juce_OptionalScopedPointer.h" | |||
#include "memory/juce_ReferenceCountedObject.h" | |||
#include "memory/juce_ScopedPointer.h" | |||
#include "memory/juce_Singleton.h" | |||
#include "memory/juce_WeakReference.h" | |||
#include "misc/juce_Result.h" | |||
#include "misc/juce_Uuid.h" | |||
#include "misc/juce_WindowsRegistry.h" | |||
#include "network/juce_IPAddress.h" | |||
#include "network/juce_MACAddress.h" | |||
#include "network/juce_NamedPipe.h" | |||
#include "network/juce_Socket.h" | |||
#include "network/juce_URL.h" | |||
#include "streams/juce_BufferedInputStream.h" | |||
#include "streams/juce_FileInputSource.h" | |||
#include "streams/juce_InputSource.h" | |||
#include "streams/juce_InputStream.h" | |||
#include "streams/juce_MemoryInputStream.h" | |||
#include "streams/juce_MemoryOutputStream.h" | |||
#include "streams/juce_OutputStream.h" | |||
#include "streams/juce_SubregionStream.h" | |||
#include "system/juce_PlatformDefs.h" | |||
#include "system/juce_StandardHeader.h" | |||
#include "system/juce_SystemStats.h" | |||
#include "system/juce_TargetPlatform.h" | |||
#include "text/juce_CharacterFunctions.h" | |||
#include "text/juce_CharPointer_ASCII.h" | |||
#include "text/juce_CharPointer_UTF16.h" | |||
#include "text/juce_CharPointer_UTF32.h" | |||
#include "text/juce_CharPointer_UTF8.h" | |||
#include "text/juce_Identifier.h" | |||
#include "text/juce_LocalisedStrings.h" | |||
#include "text/juce_NewLine.h" | |||
#include "text/juce_String.h" | |||
#include "text/juce_StringArray.h" | |||
#include "text/juce_StringPairArray.h" | |||
#include "text/juce_StringPool.h" | |||
#include "text/juce_TextDiff.h" | |||
#include "threads/juce_ChildProcess.h" | |||
#include "threads/juce_CriticalSection.h" | |||
#include "threads/juce_DynamicLibrary.h" | |||
#include "threads/juce_HighResolutionTimer.h" | |||
#include "threads/juce_InterProcessLock.h" | |||
#include "threads/juce_Process.h" | |||
#include "threads/juce_ReadWriteLock.h" | |||
#include "threads/juce_ScopedLock.h" | |||
#include "threads/juce_ScopedReadLock.h" | |||
#include "threads/juce_ScopedWriteLock.h" | |||
#include "threads/juce_SpinLock.h" | |||
#include "threads/juce_WaitableEvent.h" | |||
#include "threads/juce_Thread.h" | |||
#include "threads/juce_ThreadLocalValue.h" | |||
#include "threads/juce_ThreadPool.h" | |||
#include "threads/juce_TimeSliceThread.h" | |||
#include "threads/juce_WaitableEvent.h" | |||
#include "threads/juce_ReadWriteLock.h" | |||
#include "threads/juce_ScopedReadLock.h" | |||
#include "threads/juce_ScopedWriteLock.h" | |||
#include "network/juce_IPAddress.h" | |||
#include "network/juce_MACAddress.h" | |||
#include "network/juce_NamedPipe.h" | |||
#include "network/juce_Socket.h" | |||
#include "network/juce_URL.h" | |||
#include "time/juce_PerformanceCounter.h" | |||
#include "time/juce_RelativeTime.h" | |||
#include "time/juce_Time.h" | |||
#include "unit_tests/juce_UnitTest.h" | |||
#include "xml/juce_XmlDocument.h" | |||
#include "xml/juce_XmlElement.h" | |||
#include "zip/juce_GZIPCompressorOutputStream.h" | |||
#include "zip/juce_GZIPDecompressorInputStream.h" | |||
#include "zip/juce_ZipFile.h" | |||
// END_AUTOINCLUDE | |||
#include "containers/juce_PropertySet.h" | |||
} | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_FILELOGGER_H_INCLUDED | |||
#define JUCE_FILELOGGER_H_INCLUDED | |||
#include "juce_Logger.h" | |||
#include "../files/juce_File.h" | |||
#include "../memory/juce_ScopedPointer.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_LOGGER_H_INCLUDED | |||
#define JUCE_LOGGER_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
//============================================================================== | |||
/** | |||
@@ -956,7 +956,9 @@ String BigInteger::toString (const int base, const int minimumNumCharacters) con | |||
void BigInteger::parseString (const String& text, const int base) | |||
{ | |||
clear(); | |||
String::CharPointerType t (text.getCharPointer()); | |||
String::CharPointerType t (text.getCharPointer().findEndOfWhitespace()); | |||
setNegative (*t == (juce_wchar) '-'); | |||
if (base == 2 || base == 8 || base == 16) | |||
{ | |||
@@ -997,8 +999,6 @@ void BigInteger::parseString (const String& text, const int base) | |||
} | |||
} | |||
} | |||
setNegative (text.trimStart().startsWithChar ('-')); | |||
} | |||
MemoryBlock BigInteger::toMemoryBlock() const | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_BIGINTEGER_H_INCLUDED | |||
#define JUCE_BIGINTEGER_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
#include "../memory/juce_HeapBlock.h" | |||
class MemoryBlock; | |||
//============================================================================== | |||
/** | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_EXPRESSION_H_INCLUDED | |||
#define JUCE_EXPRESSION_H_INCLUDED | |||
#include "../memory/juce_ReferenceCountedObject.h" | |||
#include "../containers/juce_Array.h" | |||
#include "../memory/juce_ScopedPointer.h" | |||
//============================================================================== | |||
/** | |||
@@ -264,7 +260,7 @@ private: | |||
struct Helpers; | |||
friend class Term; | |||
friend struct Helpers; | |||
friend class ScopedPointer<Term>; | |||
friend struct ContainerDeletePolicy<Term>; | |||
friend class ReferenceCountedObjectPtr<Term>; | |||
ReferenceCountedObjectPtr<Term> term; | |||
@@ -443,6 +443,13 @@ IntegerType negativeAwareModulo (IntegerType dividend, const IntegerType divisor | |||
return (dividend < 0) ? (dividend + divisor) : dividend; | |||
} | |||
/** Returns the square of its argument. */ | |||
template <typename NumericType> | |||
NumericType square (NumericType n) noexcept | |||
{ | |||
return n * n; | |||
} | |||
//============================================================================== | |||
#if (JUCE_INTEL && JUCE_32BIT) || defined (DOXYGEN) | |||
/** This macro can be applied to a float variable to check whether it contains a denormalised | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_RANDOM_H_INCLUDED | |||
#define JUCE_RANDOM_H_INCLUDED | |||
#include "juce_BigInteger.h" | |||
//============================================================================== | |||
/** | |||
@@ -39,65 +39,71 @@ class JUCE_API ByteOrder | |||
public: | |||
//============================================================================== | |||
/** Swaps the upper and lower bytes of a 16-bit integer. */ | |||
static uint16 swap (uint16 value); | |||
static uint16 swap (uint16 value) noexcept; | |||
/** Reverses the order of the 4 bytes in a 32-bit integer. */ | |||
static uint32 swap (uint32 value); | |||
static uint32 swap (uint32 value) noexcept; | |||
/** Reverses the order of the 8 bytes in a 64-bit integer. */ | |||
static uint64 swap (uint64 value); | |||
static uint64 swap (uint64 value) noexcept; | |||
//============================================================================== | |||
/** Swaps the byte order of a 16-bit int if the CPU is big-endian */ | |||
static uint16 swapIfBigEndian (uint16 value); | |||
static uint16 swapIfBigEndian (uint16 value) noexcept; | |||
/** Swaps the byte order of a 32-bit int if the CPU is big-endian */ | |||
static uint32 swapIfBigEndian (uint32 value); | |||
static uint32 swapIfBigEndian (uint32 value) noexcept; | |||
/** Swaps the byte order of a 64-bit int if the CPU is big-endian */ | |||
static uint64 swapIfBigEndian (uint64 value); | |||
static uint64 swapIfBigEndian (uint64 value) noexcept; | |||
/** Swaps the byte order of a 16-bit int if the CPU is little-endian */ | |||
static uint16 swapIfLittleEndian (uint16 value); | |||
static uint16 swapIfLittleEndian (uint16 value) noexcept; | |||
/** Swaps the byte order of a 32-bit int if the CPU is little-endian */ | |||
static uint32 swapIfLittleEndian (uint32 value); | |||
static uint32 swapIfLittleEndian (uint32 value) noexcept; | |||
/** Swaps the byte order of a 64-bit int if the CPU is little-endian */ | |||
static uint64 swapIfLittleEndian (uint64 value); | |||
static uint64 swapIfLittleEndian (uint64 value) noexcept; | |||
//============================================================================== | |||
/** Turns 4 bytes into a little-endian integer. */ | |||
static uint32 littleEndianInt (const void* bytes); | |||
static uint32 littleEndianInt (const void* bytes) noexcept; | |||
/** Turns 8 bytes into a little-endian integer. */ | |||
static uint64 littleEndianInt64 (const void* bytes) noexcept; | |||
/** Turns 2 bytes into a little-endian integer. */ | |||
static uint16 littleEndianShort (const void* bytes); | |||
static uint16 littleEndianShort (const void* bytes) noexcept; | |||
/** Turns 4 bytes into a big-endian integer. */ | |||
static uint32 bigEndianInt (const void* bytes); | |||
static uint32 bigEndianInt (const void* bytes) noexcept; | |||
/** Turns 8 bytes into a big-endian integer. */ | |||
static uint64 bigEndianInt64 (const void* bytes) noexcept; | |||
/** Turns 2 bytes into a big-endian integer. */ | |||
static uint16 bigEndianShort (const void* bytes); | |||
static uint16 bigEndianShort (const void* bytes) noexcept; | |||
//============================================================================== | |||
/** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ | |||
static int littleEndian24Bit (const char* bytes); | |||
static int littleEndian24Bit (const char* bytes) noexcept; | |||
/** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ | |||
static int bigEndian24Bit (const char* bytes); | |||
static int bigEndian24Bit (const char* bytes) noexcept; | |||
/** Copies a 24-bit number to 3 little-endian bytes. */ | |||
static void littleEndian24BitToChars (int value, char* destBytes); | |||
static void littleEndian24BitToChars (int value, char* destBytes) noexcept; | |||
/** Copies a 24-bit number to 3 big-endian bytes. */ | |||
static void bigEndian24BitToChars (int value, char* destBytes); | |||
static void bigEndian24BitToChars (int value, char* destBytes) noexcept; | |||
//============================================================================== | |||
/** Returns true if the current CPU is big-endian. */ | |||
static bool isBigEndian(); | |||
static bool isBigEndian() noexcept; | |||
private: | |||
ByteOrder(); | |||
ByteOrder() JUCE_DELETED_FUNCTION; | |||
JUCE_DECLARE_NON_COPYABLE (ByteOrder) | |||
}; | |||
@@ -108,7 +114,7 @@ private: | |||
#pragma intrinsic (_byteswap_ulong) | |||
#endif | |||
inline uint16 ByteOrder::swap (uint16 n) | |||
inline uint16 ByteOrder::swap (uint16 n) noexcept | |||
{ | |||
#if JUCE_USE_INTRINSICSxxx // agh - the MS compiler has an internal error when you try to use this intrinsic! | |||
return static_cast <uint16> (_byteswap_ushort (n)); | |||
@@ -117,7 +123,7 @@ inline uint16 ByteOrder::swap (uint16 n) | |||
#endif | |||
} | |||
inline uint32 ByteOrder::swap (uint32 n) | |||
inline uint32 ByteOrder::swap (uint32 n) noexcept | |||
{ | |||
#if JUCE_MAC || JUCE_IOS | |||
return OSSwapInt32 (n); | |||
@@ -140,7 +146,7 @@ inline uint32 ByteOrder::swap (uint32 n) | |||
#endif | |||
} | |||
inline uint64 ByteOrder::swap (uint64 value) | |||
inline uint64 ByteOrder::swap (uint64 value) noexcept | |||
{ | |||
#if JUCE_MAC || JUCE_IOS | |||
return OSSwapInt64 (value); | |||
@@ -152,35 +158,39 @@ inline uint64 ByteOrder::swap (uint64 value) | |||
} | |||
#if JUCE_LITTLE_ENDIAN | |||
inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) { return v; } | |||
inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return v; } | |||
inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return v; } | |||
inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return swap (v); } | |||
inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return swap (v); } | |||
inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return swap (v); } | |||
inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return *static_cast <const uint32*> (bytes); } | |||
inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return *static_cast <const uint16*> (bytes); } | |||
inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return swap (*static_cast <const uint32*> (bytes)); } | |||
inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return swap (*static_cast <const uint16*> (bytes)); } | |||
inline bool ByteOrder::isBigEndian() { return false; } | |||
inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return v; } | |||
inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return v; } | |||
inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return v; } | |||
inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return swap (v); } | |||
inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return swap (v); } | |||
inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return swap (v); } | |||
inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return *static_cast <const uint32*> (bytes); } | |||
inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return *static_cast <const uint64*> (bytes); } | |||
inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return *static_cast <const uint16*> (bytes); } | |||
inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return swap (*static_cast <const uint32*> (bytes)); } | |||
inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast <const uint64*> (bytes)); } | |||
inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return swap (*static_cast <const uint16*> (bytes)); } | |||
inline bool ByteOrder::isBigEndian() noexcept { return false; } | |||
#else | |||
inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) { return swap (v); } | |||
inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return swap (v); } | |||
inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return swap (v); } | |||
inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return v; } | |||
inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return v; } | |||
inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return v; } | |||
inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return swap (*static_cast <const uint32*> (bytes)); } | |||
inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return swap (*static_cast <const uint16*> (bytes)); } | |||
inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return *static_cast <const uint32*> (bytes); } | |||
inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return *static_cast <const uint16*> (bytes); } | |||
inline bool ByteOrder::isBigEndian() { return true; } | |||
inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return swap (v); } | |||
inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return swap (v); } | |||
inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return swap (v); } | |||
inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return v; } | |||
inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return v; } | |||
inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return v; } | |||
inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return swap (*static_cast <const uint32*> (bytes)); } | |||
inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast <const uint64*> (bytes)); } | |||
inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return swap (*static_cast <const uint16*> (bytes)); } | |||
inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return *static_cast <const uint32*> (bytes); } | |||
inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return *static_cast <const uint64*> (bytes); } | |||
inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return *static_cast <const uint16*> (bytes); } | |||
inline bool ByteOrder::isBigEndian() noexcept { return true; } | |||
#endif | |||
inline int ByteOrder::littleEndian24Bit (const char* const bytes) { return (((int) bytes[2]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[0]); } | |||
inline int ByteOrder::bigEndian24Bit (const char* const bytes) { return (((int) bytes[0]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[2]); } | |||
inline void ByteOrder::littleEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); } | |||
inline void ByteOrder::bigEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); } | |||
inline int ByteOrder::littleEndian24Bit (const char* const bytes) noexcept { return (((int) bytes[2]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[0]); } | |||
inline int ByteOrder::bigEndian24Bit (const char* const bytes) noexcept { return (((int) bytes[0]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[2]); } | |||
inline void ByteOrder::littleEndian24BitToChars (const int value, char* const destBytes) noexcept { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); } | |||
inline void ByteOrder::bigEndian24BitToChars (const int value, char* const destBytes) noexcept { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); } | |||
#endif // JUCE_BYTEORDER_H_INCLUDED |
@@ -0,0 +1,53 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the juce_core module of the JUCE library. | |||
Copyright (c) 2013 - Raw Material Software Ltd. | |||
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. | |||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
------------------------------------------------------------------------------ | |||
NOTE! This permissive ISC license applies ONLY to files within the juce_core module! | |||
All other JUCE modules are covered by a dual GPL/commercial license, so if you are | |||
using any other modules, be sure to check that you also comply with their license. | |||
For more details, visit www.juce.com | |||
============================================================================== | |||
*/ | |||
#ifndef JUCE_CONTAINERDELETEPOLICY_H_INCLUDED | |||
#define JUCE_CONTAINERDELETEPOLICY_H_INCLUDED | |||
//============================================================================== | |||
/** | |||
Used by container classes as an indirect way to delete an object of a | |||
particular type. | |||
The generic implementation of this class simply calls 'delete', but you can | |||
create a specialised version of it for a particular class if you need to | |||
delete that type of object in a more appropriate way. | |||
@see ScopedPointer, OwnedArray | |||
*/ | |||
template <typename ObjectType> | |||
struct ContainerDeletePolicy | |||
{ | |||
static void destroy (ObjectType* object) | |||
{ | |||
delete object; | |||
} | |||
}; | |||
#endif // JUCE_CONTAINERDELETEPOLICY_H_INCLUDED |
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_LEAKEDOBJECTDETECTOR_H_INCLUDED | |||
#define JUCE_LEAKEDOBJECTDETECTOR_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
#include "juce_Atomic.h" | |||
//============================================================================== | |||
/** | |||
@@ -88,14 +88,14 @@ MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) | |||
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS | |||
MemoryBlock::MemoryBlock (MemoryBlock&& other) noexcept | |||
: data (static_cast <HeapBlock <char>&&> (other.data)), | |||
: data (static_cast <HeapBlock<char>&&> (other.data)), | |||
size (other.size) | |||
{ | |||
} | |||
MemoryBlock& MemoryBlock::operator= (MemoryBlock&& other) noexcept | |||
{ | |||
data = static_cast <HeapBlock <char>&&> (other.data); | |||
data = static_cast <HeapBlock<char>&&> (other.data); | |||
size = other.size; | |||
return *this; | |||
} | |||
@@ -229,12 +229,12 @@ void MemoryBlock::copyFrom (const void* const src, int offset, size_t num) noexc | |||
if (offset < 0) | |||
{ | |||
d -= offset; | |||
num -= offset; | |||
num += (size_t) -offset; | |||
offset = 0; | |||
} | |||
if (offset + num > size) | |||
num = size - offset; | |||
if ((size_t) offset + num > size) | |||
num = size - (size_t) offset; | |||
if (num > 0) | |||
memcpy (data + offset, d, num); | |||
@@ -248,14 +248,13 @@ void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const noexcep | |||
{ | |||
zeromem (d, (size_t) -offset); | |||
d -= offset; | |||
num += offset; | |||
num -= (size_t) -offset; | |||
offset = 0; | |||
} | |||
if (offset + num > size) | |||
if ((size_t) offset + num > size) | |||
{ | |||
const size_t newNum = size - offset; | |||
const size_t newNum = size - (size_t) offset; | |||
zeromem (d + newNum, num - newNum); | |||
num = newNum; | |||
} | |||
@@ -275,12 +274,12 @@ int MemoryBlock::getBitRange (const size_t bitRangeStart, size_t numBits) const | |||
int res = 0; | |||
size_t byte = bitRangeStart >> 3; | |||
int offsetInByte = (int) bitRangeStart & 7; | |||
size_t offsetInByte = bitRangeStart & 7; | |||
size_t bitsSoFar = 0; | |||
while (numBits > 0 && (size_t) byte < size) | |||
{ | |||
const int bitsThisTime = jmin ((int) numBits, 8 - offsetInByte); | |||
const size_t bitsThisTime = jmin (numBits, 8 - offsetInByte); | |||
const int mask = (0xff >> (8 - bitsThisTime)) << offsetInByte; | |||
res |= (((data[byte] & mask) >> offsetInByte) << bitsSoFar); | |||
@@ -297,17 +296,17 @@ int MemoryBlock::getBitRange (const size_t bitRangeStart, size_t numBits) const | |||
void MemoryBlock::setBitRange (const size_t bitRangeStart, size_t numBits, int bitsToSet) noexcept | |||
{ | |||
size_t byte = bitRangeStart >> 3; | |||
int offsetInByte = (int) bitRangeStart & 7; | |||
unsigned int mask = ~((((unsigned int) 0xffffffff) << (32 - numBits)) >> (32 - numBits)); | |||
size_t offsetInByte = bitRangeStart & 7; | |||
uint32 mask = ~((((uint32) 0xffffffff) << (32 - numBits)) >> (32 - numBits)); | |||
while (numBits > 0 && (size_t) byte < size) | |||
{ | |||
const int bitsThisTime = jmin ((int) numBits, 8 - offsetInByte); | |||
const size_t bitsThisTime = jmin (numBits, 8 - offsetInByte); | |||
const unsigned int tempMask = (mask << offsetInByte) | ~((((unsigned int) 0xffffffff) >> offsetInByte) << offsetInByte); | |||
const unsigned int tempBits = (unsigned int) bitsToSet << offsetInByte; | |||
const uint32 tempMask = (mask << offsetInByte) | ~((((uint32) 0xffffffff) >> offsetInByte) << offsetInByte); | |||
const uint32 tempBits = (uint32) bitsToSet << offsetInByte; | |||
data[byte] = (char) ((data[byte] & tempMask) | tempBits); | |||
data[byte] = (char) (((uint32) data[byte] & tempMask) | tempBits); | |||
++byte; | |||
numBits -= bitsThisTime; | |||
@@ -336,22 +335,11 @@ void MemoryBlock::loadFromHexString (const String& hex) | |||
{ | |||
const juce_wchar c = t.getAndAdvance(); | |||
if (c >= '0' && c <= '9') | |||
{ | |||
byte |= c - '0'; | |||
break; | |||
} | |||
else if (c >= 'a' && c <= 'z') | |||
{ | |||
byte |= c - ('a' - 10); | |||
break; | |||
} | |||
else if (c >= 'A' && c <= 'Z') | |||
{ | |||
byte |= c - ('A' - 10); | |||
break; | |||
} | |||
else if (c == 0) | |||
if (c >= '0' && c <= '9') { byte |= c - '0'; break; } | |||
if (c >= 'a' && c <= 'z') { byte |= c - ('a' - 10); break; } | |||
if (c >= 'A' && c <= 'Z') { byte |= c - ('A' - 10); break; } | |||
if (c == 0) | |||
{ | |||
setSize (static_cast <size_t> (dest - data)); | |||
return; | |||
@@ -364,7 +352,7 @@ void MemoryBlock::loadFromHexString (const String& hex) | |||
} | |||
//============================================================================== | |||
const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; | |||
static const char* const base64EncodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; | |||
String MemoryBlock::toBase64Encoding() const | |||
{ | |||
@@ -372,14 +360,14 @@ String MemoryBlock::toBase64Encoding() const | |||
String destString ((unsigned int) size); // store the length, followed by a '.', and then the data. | |||
const int initialLen = destString.length(); | |||
destString.preallocateBytes (sizeof (String::CharPointerType::CharType) * (size_t) (initialLen + 2 + numChars)); | |||
destString.preallocateBytes (sizeof (String::CharPointerType::CharType) * (size_t) initialLen + 2 + numChars); | |||
String::CharPointerType d (destString.getCharPointer()); | |||
d += initialLen; | |||
d.write ('.'); | |||
for (size_t i = 0; i < numChars; ++i) | |||
d.write ((juce_wchar) (uint8) encodingTable [getBitRange (i * 6, 6)]); | |||
d.write ((juce_wchar) (uint8) base64EncodingTable [getBitRange (i * 6, 6)]); | |||
d.writeNull(); | |||
return destString; | |||
@@ -408,7 +396,7 @@ bool MemoryBlock::fromBase64Encoding (const String& s) | |||
for (int j = 0; j < 64; ++j) | |||
{ | |||
if (encodingTable[j] == c) | |||
if (base64EncodingTable[j] == c) | |||
{ | |||
setBitRange ((size_t) pos, 6, j); | |||
pos += 6; | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_MEMORYBLOCK_H_INCLUDED | |||
#define JUCE_MEMORYBLOCK_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
#include "../memory/juce_HeapBlock.h" | |||
//============================================================================== | |||
/** | |||
@@ -54,7 +51,7 @@ public: | |||
bool initialiseToZero = false); | |||
/** Creates a copy of another memory block. */ | |||
MemoryBlock (const MemoryBlock& other); | |||
MemoryBlock (const MemoryBlock&); | |||
/** Creates a memory block using a copy of a block of data. | |||
@@ -67,31 +64,27 @@ public: | |||
~MemoryBlock() noexcept; | |||
/** Copies another memory block onto this one. | |||
This block will be resized and copied to exactly match the other one. | |||
*/ | |||
MemoryBlock& operator= (const MemoryBlock& other); | |||
MemoryBlock& operator= (const MemoryBlock&); | |||
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS | |||
MemoryBlock (MemoryBlock&& other) noexcept; | |||
MemoryBlock& operator= (MemoryBlock&& other) noexcept; | |||
MemoryBlock (MemoryBlock&&) noexcept; | |||
MemoryBlock& operator= (MemoryBlock&&) noexcept; | |||
#endif | |||
//============================================================================== | |||
/** Compares two memory blocks. | |||
@returns true only if the two blocks are the same size and have identical contents. | |||
*/ | |||
bool operator== (const MemoryBlock& other) const noexcept; | |||
/** Compares two memory blocks. | |||
@returns true if the two blocks are different sizes or have different contents. | |||
*/ | |||
bool operator!= (const MemoryBlock& other) const noexcept; | |||
/** Returns true if the data in this MemoryBlock matches the raw bytes passed-in. | |||
*/ | |||
/** Returns true if the data in this MemoryBlock matches the raw bytes passed-in. */ | |||
bool matches (const void* data, size_t dataSize) const noexcept; | |||
//============================================================================== | |||
@@ -103,7 +96,6 @@ public: | |||
void* getData() const noexcept { return data; } | |||
/** Returns a byte from the memory block. | |||
This returns a reference, so you can also use it to set a byte. | |||
*/ | |||
template <typename Type> | |||
@@ -143,7 +135,6 @@ public: | |||
//============================================================================== | |||
/** Fills the entire memory block with a repeated byte value. | |||
This is handy for clearing a block of memory to zero. | |||
*/ | |||
void fillWith (uint8 valueToUse) noexcept; | |||
@@ -249,9 +240,8 @@ public: | |||
private: | |||
//============================================================================== | |||
HeapBlock <char> data; | |||
HeapBlock<char> data; | |||
size_t size; | |||
static const char* const encodingTable; | |||
JUCE_LEAK_DETECTOR (MemoryBlock) | |||
}; | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_OPTIONALSCOPEDPOINTER_H_INCLUDED | |||
#define JUCE_OPTIONALSCOPEDPOINTER_H_INCLUDED | |||
#include "juce_ScopedPointer.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,12 +29,10 @@ | |||
#ifndef JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED | |||
#define JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED | |||
#include "juce_Atomic.h" | |||
//============================================================================== | |||
/** | |||
Adds reference-counting to an object. | |||
A base class which provides methods for reference-counting. | |||
To add reference-counting to a class, derive it from this class, and | |||
use the ReferenceCountedObjectPtr class to point to it. | |||
@@ -73,16 +71,15 @@ public: | |||
This is done automatically by the smart pointer, but is public just | |||
in case it's needed for nefarious purposes. | |||
*/ | |||
inline void incReferenceCount() noexcept | |||
void incReferenceCount() noexcept | |||
{ | |||
++refCount; | |||
} | |||
/** Decreases the object's reference count. | |||
If the count gets to zero, the object will be deleted. | |||
*/ | |||
inline void decReferenceCount() noexcept | |||
void decReferenceCount() noexcept | |||
{ | |||
jassert (getReferenceCount() > 0); | |||
@@ -90,16 +87,24 @@ public: | |||
delete this; | |||
} | |||
/** Decreases the object's reference count. | |||
If the count gets to zero, the object will not be deleted, but this method | |||
will return true, allowing the caller to take care of deletion. | |||
*/ | |||
bool decReferenceCountWithoutDeleting() noexcept | |||
{ | |||
jassert (getReferenceCount() > 0); | |||
return --refCount == 0; | |||
} | |||
/** Returns the object's current reference count. */ | |||
inline int getReferenceCount() const noexcept { return refCount.get(); } | |||
int getReferenceCount() const noexcept { return refCount.get(); } | |||
protected: | |||
//============================================================================== | |||
/** Creates the reference-counted object (with an initial ref count of zero). */ | |||
ReferenceCountedObject() | |||
{ | |||
} | |||
ReferenceCountedObject() {} | |||
/** Destructor. */ | |||
virtual ~ReferenceCountedObject() | |||
@@ -120,6 +125,7 @@ private: | |||
//============================================================================== | |||
Atomic <int> refCount; | |||
friend struct ContainerDeletePolicy<ReferenceCountedObject>; | |||
JUCE_DECLARE_NON_COPYABLE (ReferenceCountedObject) | |||
}; | |||
@@ -144,16 +150,15 @@ public: | |||
This is done automatically by the smart pointer, but is public just | |||
in case it's needed for nefarious purposes. | |||
*/ | |||
inline void incReferenceCount() noexcept | |||
void incReferenceCount() noexcept | |||
{ | |||
++refCount; | |||
} | |||
/** Decreases the object's reference count. | |||
If the count gets to zero, the object will be deleted. | |||
*/ | |||
inline void decReferenceCount() noexcept | |||
void decReferenceCount() noexcept | |||
{ | |||
jassert (getReferenceCount() > 0); | |||
@@ -161,8 +166,18 @@ public: | |||
delete this; | |||
} | |||
/** Decreases the object's reference count. | |||
If the count gets to zero, the object will not be deleted, but this method | |||
will return true, allowing the caller to take care of deletion. | |||
*/ | |||
bool decReferenceCountWithoutDeleting() noexcept | |||
{ | |||
jassert (getReferenceCount() > 0); | |||
return --refCount == 0; | |||
} | |||
/** Returns the object's current reference count. */ | |||
inline int getReferenceCount() const noexcept { return refCount; } | |||
int getReferenceCount() const noexcept { return refCount; } | |||
protected: | |||
@@ -181,6 +196,7 @@ private: | |||
//============================================================================== | |||
int refCount; | |||
friend struct ContainerDeletePolicy<ReferenceCountedObject>; | |||
JUCE_DECLARE_NON_COPYABLE (SingleThreadedReferenceCountedObject) | |||
}; | |||
@@ -190,13 +206,20 @@ private: | |||
A smart-pointer class which points to a reference-counted object. | |||
The template parameter specifies the class of the object you want to point to - the easiest | |||
way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject, | |||
but if you need to, you could roll your own reference-countable class by implementing a pair of | |||
mathods called incReferenceCount() and decReferenceCount(). | |||
way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject | |||
or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable | |||
class by implementing a set of mathods called incReferenceCount(), decReferenceCount(), and | |||
decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods | |||
should behave. | |||
When using this class, you'll probably want to create a typedef to abbreviate the full | |||
templated name - e.g. | |||
@code typedef ReferenceCountedObjectPtr<MyClass> MyClassPtr;@endcode | |||
@code | |||
struct MyClass : public ReferenceCountedObject | |||
{ | |||
typedef ReferenceCountedObjectPtr<MyClass> Ptr; | |||
... | |||
@endcode | |||
@see ReferenceCountedObject, ReferenceCountedObjectArray | |||
*/ | |||
@@ -209,54 +232,40 @@ public: | |||
//============================================================================== | |||
/** Creates a pointer to a null object. */ | |||
inline ReferenceCountedObjectPtr() noexcept | |||
ReferenceCountedObjectPtr() noexcept | |||
: referencedObject (nullptr) | |||
{ | |||
} | |||
/** Creates a pointer to an object. | |||
This will increment the object's reference-count if it is non-null. | |||
This will increment the object's reference-count. | |||
*/ | |||
inline ReferenceCountedObjectPtr (ReferenceCountedObjectClass* const refCountedObject) noexcept | |||
ReferenceCountedObjectPtr (ReferencedType* refCountedObject) noexcept | |||
: referencedObject (refCountedObject) | |||
{ | |||
if (refCountedObject != nullptr) | |||
refCountedObject->incReferenceCount(); | |||
incIfNotNull (refCountedObject); | |||
} | |||
/** Copies another pointer. | |||
This will increment the object's reference-count (if it is non-null). | |||
This will increment the object's reference-count. | |||
*/ | |||
inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept | |||
: referencedObject (other.referencedObject) | |||
{ | |||
if (referencedObject != nullptr) | |||
referencedObject->incReferenceCount(); | |||
} | |||
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS | |||
/** Takes-over the object from another pointer. */ | |||
inline ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept | |||
ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept | |||
: referencedObject (other.referencedObject) | |||
{ | |||
other.referencedObject = nullptr; | |||
incIfNotNull (referencedObject); | |||
} | |||
#endif | |||
/** Copies another pointer. | |||
This will increment the object's reference-count (if it is non-null). | |||
*/ | |||
template <class DerivedClass> | |||
inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr<DerivedClass>& other) noexcept | |||
: referencedObject (static_cast <ReferenceCountedObjectClass*> (other.get())) | |||
template <class Convertible> | |||
ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr<Convertible>& other) noexcept | |||
: referencedObject (static_cast <ReferencedType*> (other.get())) | |||
{ | |||
if (referencedObject != nullptr) | |||
referencedObject->incReferenceCount(); | |||
incIfNotNull (referencedObject); | |||
} | |||
/** Changes this pointer to point at a different object. | |||
The reference count of the old object is decremented, and it might be | |||
deleted if it hits zero. The new object's count is incremented. | |||
*/ | |||
@@ -266,94 +275,100 @@ public: | |||
} | |||
/** Changes this pointer to point at a different object. | |||
The reference count of the old object is decremented, and it might be | |||
deleted if it hits zero. The new object's count is incremented. | |||
*/ | |||
template <class DerivedClass> | |||
ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr<DerivedClass>& other) | |||
template <class Convertible> | |||
ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr<Convertible>& other) | |||
{ | |||
return operator= (static_cast <ReferenceCountedObjectClass*> (other.get())); | |||
return operator= (static_cast<ReferencedType*> (other.get())); | |||
} | |||
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS | |||
/** Takes-over the object from another pointer. */ | |||
ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) | |||
{ | |||
std::swap (referencedObject, other.referencedObject); | |||
return *this; | |||
} | |||
#endif | |||
/** Changes this pointer to point at a different object. | |||
The reference count of the old object is decremented, and it might be | |||
deleted if it hits zero. The new object's count is incremented. | |||
*/ | |||
ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectClass* const newObject) | |||
ReferenceCountedObjectPtr& operator= (ReferencedType* const newObject) | |||
{ | |||
if (referencedObject != newObject) | |||
{ | |||
if (newObject != nullptr) | |||
newObject->incReferenceCount(); | |||
ReferenceCountedObjectClass* const oldObject = referencedObject; | |||
incIfNotNull (newObject); | |||
ReferencedType* const oldObject = referencedObject; | |||
referencedObject = newObject; | |||
if (oldObject != nullptr) | |||
oldObject->decReferenceCount(); | |||
decIfNotNull (oldObject); | |||
} | |||
return *this; | |||
} | |||
/** Destructor. | |||
This will decrement the object's reference-count, and may delete it if it | |||
gets to zero. | |||
*/ | |||
inline ~ReferenceCountedObjectPtr() | |||
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS | |||
/** Takes-over the object from another pointer. */ | |||
ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept | |||
: referencedObject (other.referencedObject) | |||
{ | |||
if (referencedObject != nullptr) | |||
referencedObject->decReferenceCount(); | |||
other.referencedObject = nullptr; | |||
} | |||
/** Returns the object that this pointer references. | |||
The pointer returned may be zero, of course. | |||
*/ | |||
inline operator ReferenceCountedObjectClass*() const noexcept | |||
/** Takes-over the object from another pointer. */ | |||
ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) | |||
{ | |||
return referencedObject; | |||
std::swap (referencedObject, other.referencedObject); | |||
return *this; | |||
} | |||
#endif | |||
// the -> operator is called on the referenced object | |||
inline ReferenceCountedObjectClass* operator->() const noexcept | |||
/** Destructor. | |||
This will decrement the object's reference-count, which will cause the | |||
object to be deleted when the ref-count hits zero. | |||
*/ | |||
~ReferenceCountedObjectPtr() | |||
{ | |||
return referencedObject; | |||
decIfNotNull (referencedObject); | |||
} | |||
//============================================================================== | |||
/** Returns the object that this pointer references. | |||
The pointer returned may be zero, of course. | |||
*/ | |||
inline ReferenceCountedObjectClass* get() const noexcept | |||
{ | |||
return referencedObject; | |||
} | |||
operator ReferencedType*() const noexcept { return referencedObject; } | |||
/** Returns the object that this pointer references. | |||
The pointer returned may be zero, of course. | |||
*/ | |||
ReferencedType* get() const noexcept { return referencedObject; } | |||
/** Returns the object that this pointer references. | |||
The pointer returned may be zero, of course. | |||
*/ | |||
inline ReferenceCountedObjectClass* getObject() const noexcept | |||
ReferencedType* getObject() const noexcept { return referencedObject; } | |||
// the -> operator is called on the referenced object | |||
ReferencedType* operator->() const noexcept | |||
{ | |||
jassert (referencedObject != nullptr); // null pointer method call! | |||
return referencedObject; | |||
} | |||
private: | |||
//============================================================================== | |||
ReferenceCountedObjectClass* referencedObject; | |||
ReferencedType* referencedObject; | |||
static void incIfNotNull (ReferencedType* o) noexcept | |||
{ | |||
if (o != nullptr) | |||
o->incReferenceCount(); | |||
} | |||
static void decIfNotNull (ReferencedType* o) noexcept | |||
{ | |||
if (o != nullptr && o->decReferenceCountWithoutDeleting()) | |||
ContainerDeletePolicy<ReferencedType>::destroy (o); | |||
} | |||
}; | |||
//============================================================================== | |||
/** Compares two ReferenceCountedObjectPointers. */ | |||
template <class ReferenceCountedObjectClass> | |||
bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, ReferenceCountedObjectClass* const object2) noexcept | |||
@@ -370,7 +385,7 @@ bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& o | |||
/** Compares two ReferenceCountedObjectPointers. */ | |||
template <class ReferenceCountedObjectClass> | |||
bool operator== (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
bool operator== (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
{ | |||
return object1 == object2.get(); | |||
} | |||
@@ -384,14 +399,14 @@ bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& o | |||
/** Compares two ReferenceCountedObjectPointers. */ | |||
template <class ReferenceCountedObjectClass> | |||
bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
{ | |||
return object1.get() != object2.get(); | |||
} | |||
/** Compares two ReferenceCountedObjectPointers. */ | |||
template <class ReferenceCountedObjectClass> | |||
bool operator!= (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
bool operator!= (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept | |||
{ | |||
return object1 != object2.get(); | |||
} | |||
@@ -97,7 +97,7 @@ public: | |||
/** Destructor. | |||
This will delete the object that this ScopedPointer currently refers to. | |||
*/ | |||
inline ~ScopedPointer() { delete object; } | |||
inline ~ScopedPointer() { ContainerDeletePolicy<ObjectType>::destroy (object); } | |||
/** Changes this ScopedPointer to point to a new object. | |||
@@ -119,7 +119,7 @@ public: | |||
ObjectType* const oldObject = object; | |||
object = objectToTransferFrom.object; | |||
objectToTransferFrom.object = nullptr; | |||
delete oldObject; | |||
ContainerDeletePolicy<ObjectType>::destroy (oldObject); | |||
} | |||
return *this; | |||
@@ -138,7 +138,7 @@ public: | |||
{ | |||
ObjectType* const oldObject = object; | |||
object = newObjectToTakePossessionOf; | |||
delete oldObject; | |||
ContainerDeletePolicy<ObjectType>::destroy (oldObject); | |||
} | |||
return *this; | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_WEAKREFERENCE_H_INCLUDED | |||
#define JUCE_WEAKREFERENCE_H_INCLUDED | |||
#include "juce_ReferenceCountedObject.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_RESULT_H_INCLUDED | |||
#define JUCE_RESULT_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_UUID_H_INCLUDED | |||
#define JUCE_UUID_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
//============================================================================== | |||
/** | |||
@@ -38,65 +38,69 @@ | |||
class WindowsRegistry | |||
{ | |||
public: | |||
/** These values can be used to specify whether the 32- or 64-bit registry should be used. | |||
When running on a 32-bit OS, there is no 64-bit registry, so the mode will be ignored. | |||
*/ | |||
enum WoW64Mode | |||
{ | |||
/** Default handling: 32-bit apps will use the 32-bit registry, and 64-bit apps | |||
will use the 64-bit registry. */ | |||
WoW64_Default = 0, | |||
/** Always use the 64-bit registry store. (KEY_WOW64_64KEY). */ | |||
WoW64_64bit = 0x100, | |||
/** Always use the 32-bit registry store. (KEY_WOW64_32KEY). */ | |||
WoW64_32bit = 0x200 | |||
}; | |||
//============================================================================== | |||
/** Returns a string from the registry. | |||
The path is a string for the entire path of a value in the registry, | |||
e.g. "HKEY_CURRENT_USER\Software\foo\bar" | |||
*/ | |||
static String getValue (const String& regValuePath, | |||
const String& defaultValue = String::empty); | |||
/** Returns a string from the WOW64 registry. | |||
The path is a string for the entire path of a value in the registry, | |||
e.g. "HKEY_CURRENT_USER\Software\foo\bar" | |||
*/ | |||
static String getValueWow64 (const String& regValuePath, | |||
const String& defaultValue = String::empty); | |||
const String& defaultValue = String::empty, | |||
WoW64Mode mode = WoW64_Default); | |||
/** Reads a binary block from the registry. | |||
The path is a string for the entire path of a value in the registry, | |||
e.g. "HKEY_CURRENT_USER\Software\foo\bar" | |||
@returns a DWORD indicating the type of the key. | |||
*/ | |||
static uint32 getBinaryValue (const String& regValuePath, MemoryBlock& resultData); | |||
static uint32 getBinaryValue (const String& regValuePath, MemoryBlock& resultData, WoW64Mode mode = WoW64_Default); | |||
/** Sets a registry value as a string. | |||
This will take care of creating any groups needed to get to the given registry value. | |||
*/ | |||
static bool setValue (const String& regValuePath, const String& value); | |||
static bool setValue (const String& regValuePath, const String& value, WoW64Mode mode = WoW64_Default); | |||
/** Sets a registry value as a DWORD. | |||
This will take care of creating any groups needed to get to the given registry value. | |||
*/ | |||
static bool setValue (const String& regValuePath, uint32 value); | |||
static bool setValue (const String& regValuePath, uint32 value, WoW64Mode mode = WoW64_Default); | |||
/** Sets a registry value as a QWORD. | |||
This will take care of creating any groups needed to get to the given registry value. | |||
*/ | |||
static bool setValue (const String& regValuePath, uint64 value); | |||
static bool setValue (const String& regValuePath, uint64 value, WoW64Mode mode = WoW64_Default); | |||
/** Sets a registry value as a binary block. | |||
This will take care of creating any groups needed to get to the given registry value. | |||
*/ | |||
static bool setValue (const String& regValuePath, const MemoryBlock& value); | |||
/** Returns true if the given value exists in the registry. */ | |||
static bool valueExists (const String& regValuePath); | |||
static bool setValue (const String& regValuePath, const MemoryBlock& value, WoW64Mode mode = WoW64_Default); | |||
/** Returns true if the given value exists in the registry. */ | |||
static bool valueExistsWow64 (const String& regValuePath); | |||
static bool valueExists (const String& regValuePath, WoW64Mode mode = WoW64_Default); | |||
/** Returns true if the given key exists in the registry. */ | |||
static bool keyExists (const String& regValuePath); | |||
/** Returns true if the given key exists in the registry. */ | |||
static bool keyExistsWow64 (const String& regValuePath); | |||
static bool keyExists (const String& regValuePath, WoW64Mode mode = WoW64_Default); | |||
/** Deletes a registry value. */ | |||
static void deleteValue (const String& regValuePath); | |||
static void deleteValue (const String& regValuePath, WoW64Mode mode = WoW64_Default); | |||
/** Deletes a registry key (which is registry-talk for 'folder'). */ | |||
static void deleteKey (const String& regKeyPath); | |||
static void deleteKey (const String& regKeyPath, WoW64Mode mode = WoW64_Default); | |||
/** Creates a file association in the registry. | |||
@@ -113,16 +117,23 @@ public: | |||
for all users (you might not have permission to do this | |||
unless running in an installer). If true, it will register the | |||
association in HKEY_CURRENT_USER. | |||
@param mode the WoW64 mode to use for choosing the database | |||
*/ | |||
static bool registerFileAssociation (const String& fileExtension, | |||
const String& symbolicDescription, | |||
const String& fullDescription, | |||
const File& targetExecutable, | |||
int iconResourceNumber, | |||
bool registerForCurrentUserOnly); | |||
bool registerForCurrentUserOnly, | |||
WoW64Mode mode = WoW64_Default); | |||
// DEPRECATED: use the other methods with a WoW64Mode parameter of WoW64_64bit instead. | |||
JUCE_DEPRECATED (static String getValueWow64 (const String&, const String& defaultValue = String::empty)); | |||
JUCE_DEPRECATED (static bool valueExistsWow64 (const String&)); | |||
JUCE_DEPRECATED (static bool keyExistsWow64 (const String&)); | |||
private: | |||
WindowsRegistry(); | |||
WindowsRegistry() JUCE_DELETED_FUNCTION; | |||
JUCE_DECLARE_NON_COPYABLE (WindowsRegistry) | |||
}; | |||
@@ -87,7 +87,7 @@ | |||
#define STRICT 1 | |||
#define WIN32_LEAN_AND_MEAN 1 | |||
#if JUCE_MINGW | |||
#define _WIN32_WINNT 0x0501 | |||
#define _WIN32_WINNT 0x0502 | |||
#else | |||
#define _WIN32_WINNT 0x0600 | |||
#endif | |||
@@ -112,13 +112,13 @@ File File::getSpecialLocation (const SpecialLocationType type) | |||
return File (android.appDataDir); | |||
case commonApplicationDataDirectory: | |||
case commonDocumentsDirectory: | |||
return File (android.appDataDir); | |||
case globalApplicationsDirectory: | |||
return File ("/system/app"); | |||
case tempDirectory: | |||
//return File (AndroidStatsHelpers::getSystemProperty ("java.io.tmpdir")); | |||
return File (android.appDataDir).getChildFile (".temp"); | |||
case invokedExecutableFile: | |||
@@ -230,10 +230,11 @@ bool DirectoryIterator::NativeIterator::next (String& filenameFound, | |||
//============================================================================== | |||
bool Process::openDocument (const String& fileName, const String& parameters) | |||
JUCE_API bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) | |||
{ | |||
const LocalRef<jstring> t (javaString (fileName)); | |||
android.activity.callVoidMethod (JuceAppActivity.launchURL, t.get()); | |||
return true; | |||
} | |||
void File::revealToUser() const | |||
@@ -28,5 +28,5 @@ | |||
void Logger::outputDebugString (const String& text) | |||
{ | |||
__android_log_print (ANDROID_LOG_INFO, "JUCE", text.toUTF8()); | |||
__android_log_print (ANDROID_LOG_INFO, "JUCE", "%s", text.toUTF8().getAddress()); | |||
} |
@@ -54,10 +54,10 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result) | |||
} | |||
bool Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
JUCE_API bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
{ | |||
// TODO | |||
return false; | |||
@@ -33,7 +33,7 @@ | |||
//============================================================================== | |||
// sets the process to 0=low priority, 1=normal, 2=high, 3=realtime | |||
void Process::setPriority (ProcessPriority prior) | |||
JUCE_API void JUCE_CALLTYPE Process::setPriority (ProcessPriority prior) | |||
{ | |||
// TODO | |||
@@ -62,11 +62,6 @@ void Process::setPriority (ProcessPriority prior) | |||
pthread_setschedparam (pthread_self(), policy, ¶m); | |||
} | |||
void Process::terminate() | |||
{ | |||
std::exit (EXIT_FAILURE); | |||
} | |||
JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() | |||
{ | |||
return false; | |||
@@ -77,5 +72,5 @@ JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() | |||
return juce_isRunningUnderDebugger(); | |||
} | |||
void Process::raisePrivilege() {} | |||
void Process::lowerPrivilege() {} | |||
JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() {} | |||
JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() {} |
@@ -168,11 +168,8 @@ File File::getSpecialLocation (const SpecialLocationType type) | |||
const char* homeDir = getenv ("HOME"); | |||
if (homeDir == nullptr) | |||
{ | |||
struct passwd* const pw = getpwuid (getuid()); | |||
if (pw != nullptr) | |||
if (struct passwd* const pw = getpwuid (getuid())) | |||
homeDir = pw->pw_dir; | |||
} | |||
return File (CharPointer_UTF8 (homeDir)); | |||
} | |||
@@ -183,6 +180,7 @@ File File::getSpecialLocation (const SpecialLocationType type) | |||
case userPicturesDirectory: return resolveXDGFolder ("XDG_PICTURES_DIR", "~"); | |||
case userDesktopDirectory: return resolveXDGFolder ("XDG_DESKTOP_DIR", "~/Desktop"); | |||
case userApplicationDataDirectory: return File ("~"); | |||
case commonDocumentsDirectory: | |||
case commonApplicationDataDirectory: return File ("/var"); | |||
case globalApplicationsDirectory: return File ("/usr"); | |||
@@ -55,13 +55,12 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result) | |||
} | |||
bool Process::openEmailWithAttachments (const String& /* targetEmailAddress */, | |||
const String& /* emailSubject */, | |||
const String& /* bodyText */, | |||
const StringArray& /* filesToAttach */) | |||
bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& /* targetEmailAddress */, | |||
const String& /* emailSubject */, | |||
const String& /* bodyText */, | |||
const StringArray& /* filesToAttach */) | |||
{ | |||
jassertfalse; // xxx todo | |||
return false; | |||
} | |||
@@ -32,7 +32,7 @@ | |||
*/ | |||
//============================================================================== | |||
void Process::setPriority (const ProcessPriority prior) | |||
JUCE_API void JUCE_CALLTYPE Process::setPriority (const ProcessPriority prior) | |||
{ | |||
const int policy = (prior <= NormalPriority) ? SCHED_OTHER : SCHED_RR; | |||
const int minp = sched_get_priority_min (policy); | |||
@@ -52,11 +52,6 @@ void Process::setPriority (const ProcessPriority prior) | |||
pthread_setschedparam (pthread_self(), policy, ¶m); | |||
} | |||
void Process::terminate() | |||
{ | |||
std::exit (EXIT_FAILURE); | |||
} | |||
JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() | |||
{ | |||
#if JUCE_BSD | |||
@@ -90,5 +85,5 @@ static void swapUserAndEffectiveUser() | |||
(void) setregid (getegid(), getgid()); | |||
} | |||
void Process::raisePrivilege() { if (geteuid() != 0 && getuid() == 0) swapUserAndEffectiveUser(); } | |||
void Process::lowerPrivilege() { if (geteuid() == 0 && getuid() != 0) swapUserAndEffectiveUser(); } | |||
JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() { if (geteuid() != 0 && getuid() == 0) swapUserAndEffectiveUser(); } | |||
JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() { if (geteuid() == 0 && getuid() != 0) swapUserAndEffectiveUser(); } |
@@ -213,6 +213,7 @@ File File::getSpecialLocation (const SpecialLocationType type) | |||
case userPicturesDirectory: resultPath = "~/Pictures"; break; | |||
case userApplicationDataDirectory: resultPath = "~/Library"; break; | |||
case commonApplicationDataDirectory: resultPath = "/Library"; break; | |||
case commonDocumentsDirectory: resultPath = "/Users/Shared"; break; | |||
case globalApplicationsDirectory: resultPath = "/Applications"; break; | |||
case invokedExecutableFile: | |||
@@ -391,45 +392,48 @@ bool DirectoryIterator::NativeIterator::next (String& filenameFound, | |||
//============================================================================== | |||
bool Process::openDocument (const String& fileName, const String& parameters) | |||
bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) | |||
{ | |||
#if JUCE_IOS | |||
return [[UIApplication sharedApplication] openURL: [NSURL URLWithString: juceStringToNS (fileName)]]; | |||
#else | |||
JUCE_AUTORELEASEPOOL | |||
{ | |||
NSURL* filenameAsURL = [NSURL URLWithString: juceStringToNS (fileName)]; | |||
#if JUCE_IOS | |||
return [[UIApplication sharedApplication] openURL: filenameAsURL]; | |||
#else | |||
NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; | |||
if (parameters.isEmpty()) | |||
{ | |||
return [[NSWorkspace sharedWorkspace] openFile: juceStringToNS (fileName)] | |||
|| [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: juceStringToNS (fileName)]]; | |||
} | |||
return [workspace openFile: juceStringToNS (fileName)] | |||
|| [workspace openURL: filenameAsURL]; | |||
bool ok = false; | |||
const File file (fileName); | |||
if (file.isBundle()) | |||
{ | |||
NSMutableArray* urls = [NSMutableArray array]; | |||
StringArray docs; | |||
docs.addTokens (parameters, true); | |||
for (int i = 0; i < docs.size(); ++i) | |||
[urls addObject: juceStringToNS (docs[i])]; | |||
ok = [[NSWorkspace sharedWorkspace] openURLs: urls | |||
withAppBundleIdentifier: [[NSBundle bundleWithPath: juceStringToNS (fileName)] bundleIdentifier] | |||
options: 0 | |||
additionalEventParamDescriptor: nil | |||
launchIdentifiers: nil]; | |||
} | |||
else if (file.exists()) | |||
{ | |||
ok = FileHelpers::launchExecutable ("\"" + fileName + "\" " + parameters); | |||
StringArray params; | |||
params.addTokens (parameters, true); | |||
NSMutableArray* paramArray = [[[NSMutableArray alloc] init] autorelease]; | |||
for (int i = 0; i < params.size(); ++i) | |||
[paramArray addObject: juceStringToNS (params[i])]; | |||
NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease]; | |||
[dict setObject: paramArray | |||
forKey: nsStringLiteral ("NSWorkspaceLaunchConfigurationArguments")]; | |||
return [workspace launchApplicationAtURL: filenameAsURL | |||
options: NSWorkspaceLaunchDefault | NSWorkspaceLaunchNewInstance | |||
configuration: dict | |||
error: nil]; | |||
} | |||
return ok; | |||
if (file.exists()) | |||
return FileHelpers::launchExecutable ("\"" + fileName + "\" " + parameters); | |||
return false; | |||
#endif | |||
} | |||
#endif | |||
} | |||
void File::revealToUser() const | |||
@@ -53,10 +53,10 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result) | |||
} | |||
//============================================================================== | |||
bool Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
{ | |||
#if JUCE_IOS | |||
//xxx probably need to use MFMailComposeViewController | |||
@@ -32,7 +32,7 @@ | |||
*/ | |||
//============================================================================== | |||
bool Process::isForegroundProcess() | |||
JUCE_API bool JUCE_CALLTYPE Process::isForegroundProcess() | |||
{ | |||
#if JUCE_MAC | |||
return [NSApp isActive]; | |||
@@ -41,36 +41,31 @@ bool Process::isForegroundProcess() | |||
#endif | |||
} | |||
void Process::makeForegroundProcess() | |||
JUCE_API void JUCE_CALLTYPE Process::makeForegroundProcess() | |||
{ | |||
#if JUCE_MAC | |||
[NSApp activateIgnoringOtherApps: YES]; | |||
#endif | |||
} | |||
void Process::hide() | |||
JUCE_API void JUCE_CALLTYPE Process::hide() | |||
{ | |||
#if JUCE_MAC | |||
[NSApp hide: nil]; | |||
#endif | |||
} | |||
void Process::raisePrivilege() | |||
JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() | |||
{ | |||
jassertfalse; | |||
} | |||
void Process::lowerPrivilege() | |||
JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() | |||
{ | |||
jassertfalse; | |||
} | |||
void Process::terminate() | |||
{ | |||
std::exit (EXIT_FAILURE); | |||
} | |||
void Process::setPriority (ProcessPriority) | |||
JUCE_API void JUCE_CALLTYPE Process::setPriority (ProcessPriority) | |||
{ | |||
// xxx | |||
} | |||
@@ -56,6 +56,7 @@ namespace | |||
return [NSString string]; | |||
} | |||
#if JUCE_MAC | |||
template <typename RectangleType> | |||
static NSRect makeNSRect (const RectangleType& r) noexcept | |||
{ | |||
@@ -64,6 +65,7 @@ namespace | |||
static_cast <CGFloat> (r.getWidth()), | |||
static_cast <CGFloat> (r.getHeight())); | |||
} | |||
#endif | |||
} | |||
//============================================================================== | |||
@@ -150,6 +150,14 @@ void JUCE_CALLTYPE Thread::sleep (int millisecs) | |||
nanosleep (&time, nullptr); | |||
} | |||
void JUCE_CALLTYPE Process::terminate() | |||
{ | |||
#if JUCE_ANDROID | |||
_exit (EXIT_FAILURE); | |||
#else | |||
std::_Exit (EXIT_FAILURE); | |||
#endif | |||
} | |||
//============================================================================== | |||
const juce_wchar File::separator = '/'; | |||
@@ -882,7 +890,7 @@ void Thread::killThread() | |||
} | |||
} | |||
void Thread::setCurrentThreadName (const String& name) | |||
void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) | |||
{ | |||
#if JUCE_IOS || (JUCE_MAC && defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) | |||
JUCE_AUTORELEASEPOOL | |||
@@ -919,12 +927,12 @@ bool Thread::setThreadPriority (void* handle, int priority) | |||
return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; | |||
} | |||
Thread::ThreadID Thread::getCurrentThreadId() | |||
Thread::ThreadID JUCE_CALLTYPE Thread::getCurrentThreadId() | |||
{ | |||
return (ThreadID) pthread_self(); | |||
} | |||
void Thread::yield() | |||
void JUCE_CALLTYPE Thread::yield() | |||
{ | |||
sched_yield(); | |||
} | |||
@@ -938,7 +946,7 @@ void Thread::yield() | |||
#define SUPPORT_AFFINITIES 1 | |||
#endif | |||
void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) | |||
void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) | |||
{ | |||
#if SUPPORT_AFFINITIES | |||
cpu_set_t affinity; | |||
@@ -1143,7 +1151,7 @@ struct HighResolutionTimer::Pimpl | |||
shouldStop = false; | |||
if (pthread_create (&thread, nullptr, timerThread, this) == 0) | |||
setThreadToRealtime (thread, newPeriod); | |||
setThreadToRealtime (thread, (uint64) newPeriod); | |||
else | |||
jassertfalse; | |||
} | |||
@@ -518,6 +518,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type) | |||
case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break; | |||
case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break; | |||
case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break; | |||
case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break; | |||
case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; | |||
case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break; | |||
case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break; | |||
@@ -704,7 +705,7 @@ bool DirectoryIterator::NativeIterator::next (String& filenameFound, | |||
//============================================================================== | |||
bool Process::openDocument (const String& fileName, const String& parameters) | |||
bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) | |||
{ | |||
HINSTANCE hInstance = 0; | |||
@@ -428,10 +428,10 @@ void IPAddress::findAllAddresses (Array<IPAddress>& result) | |||
} | |||
//============================================================================== | |||
bool Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, | |||
const String& emailSubject, | |||
const String& bodyText, | |||
const StringArray& filesToAttach) | |||
{ | |||
DynamicLibrary dll ("MAPI32.dll"); | |||
JUCE_LOAD_WINAPI_FUNCTION (dll, MAPISendMail, mapiSendMail, | |||
@@ -64,9 +64,9 @@ struct RegistryKeyWrapper | |||
} | |||
static bool setValue (const String& regValuePath, const DWORD type, | |||
const void* data, size_t dataSize) | |||
const void* data, size_t dataSize, const DWORD wow64Flags) | |||
{ | |||
const RegistryKeyWrapper key (regValuePath, true, 0); | |||
const RegistryKeyWrapper key (regValuePath, true, wow64Flags); | |||
return key.key != 0 | |||
&& RegSetValueEx (key.key, key.wideCharValueName, 0, type, | |||
@@ -144,73 +144,58 @@ struct RegistryKeyWrapper | |||
JUCE_DECLARE_NON_COPYABLE (RegistryKeyWrapper) | |||
}; | |||
uint32 WindowsRegistry::getBinaryValue (const String& regValuePath, MemoryBlock& result) | |||
uint32 WindowsRegistry::getBinaryValue (const String& regValuePath, MemoryBlock& result, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::getBinaryValue (regValuePath, result, 0); | |||
return RegistryKeyWrapper::getBinaryValue (regValuePath, result, (DWORD) mode); | |||
} | |||
String WindowsRegistry::getValue (const String& regValuePath, const String& defaultValue) | |||
String WindowsRegistry::getValue (const String& regValuePath, const String& defaultValue, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::getValue (regValuePath, defaultValue, 0); | |||
return RegistryKeyWrapper::getValue (regValuePath, defaultValue, (DWORD) mode); | |||
} | |||
String WindowsRegistry::getValueWow64 (const String& regValuePath, const String& defaultValue) | |||
{ | |||
return RegistryKeyWrapper::getValue (regValuePath, defaultValue, 0x100 /*KEY_WOW64_64KEY*/); | |||
} | |||
bool WindowsRegistry::valueExistsWow64 (const String& regValuePath) | |||
{ | |||
return RegistryKeyWrapper::valueExists (regValuePath, 0x100 /*KEY_WOW64_64KEY*/); | |||
} | |||
bool WindowsRegistry::keyExistsWow64 (const String& regValuePath) | |||
{ | |||
return RegistryKeyWrapper::keyExists (regValuePath, 0x100 /*KEY_WOW64_64KEY*/); | |||
} | |||
bool WindowsRegistry::setValue (const String& regValuePath, const String& value) | |||
bool WindowsRegistry::setValue (const String& regValuePath, const String& value, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_SZ, value.toWideCharPointer(), | |||
CharPointer_UTF16::getBytesRequiredFor (value.getCharPointer())); | |||
CharPointer_UTF16::getBytesRequiredFor (value.getCharPointer()), mode); | |||
} | |||
bool WindowsRegistry::setValue (const String& regValuePath, const uint32 value) | |||
bool WindowsRegistry::setValue (const String& regValuePath, const uint32 value, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_DWORD, &value, sizeof (value)); | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_DWORD, &value, sizeof (value), (DWORD) mode); | |||
} | |||
bool WindowsRegistry::setValue (const String& regValuePath, const uint64 value) | |||
bool WindowsRegistry::setValue (const String& regValuePath, const uint64 value, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_QWORD, &value, sizeof (value)); | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_QWORD, &value, sizeof (value), (DWORD) mode); | |||
} | |||
bool WindowsRegistry::setValue (const String& regValuePath, const MemoryBlock& value) | |||
bool WindowsRegistry::setValue (const String& regValuePath, const MemoryBlock& value, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_BINARY, value.getData(), value.getSize()); | |||
return RegistryKeyWrapper::setValue (regValuePath, REG_BINARY, value.getData(), value.getSize(), (DWORD) mode); | |||
} | |||
bool WindowsRegistry::valueExists (const String& regValuePath) | |||
bool WindowsRegistry::valueExists (const String& regValuePath, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::valueExists (regValuePath, 0); | |||
return RegistryKeyWrapper::valueExists (regValuePath, (DWORD) mode); | |||
} | |||
bool WindowsRegistry::keyExists (const String& regValuePath) | |||
bool WindowsRegistry::keyExists (const String& regValuePath, WoW64Mode mode) | |||
{ | |||
return RegistryKeyWrapper::keyExists (regValuePath, 0); | |||
return RegistryKeyWrapper::keyExists (regValuePath, (DWORD) mode); | |||
} | |||
void WindowsRegistry::deleteValue (const String& regValuePath) | |||
void WindowsRegistry::deleteValue (const String& regValuePath, WoW64Mode mode) | |||
{ | |||
const RegistryKeyWrapper key (regValuePath, true, 0); | |||
const RegistryKeyWrapper key (regValuePath, true, (DWORD) mode); | |||
if (key.key != 0) | |||
RegDeleteValue (key.key, key.wideCharValueName); | |||
} | |||
void WindowsRegistry::deleteKey (const String& regKeyPath) | |||
void WindowsRegistry::deleteKey (const String& regKeyPath, WoW64Mode mode) | |||
{ | |||
const RegistryKeyWrapper key (regKeyPath, true, 0); | |||
const RegistryKeyWrapper key (regKeyPath, true, (DWORD) mode); | |||
if (key.key != 0) | |||
RegDeleteKey (key.key, key.wideCharValueName); | |||
@@ -221,16 +206,22 @@ bool WindowsRegistry::registerFileAssociation (const String& fileExtension, | |||
const String& fullDescription, | |||
const File& targetExecutable, | |||
const int iconResourceNumber, | |||
const bool registerForCurrentUserOnly) | |||
const bool registerForCurrentUserOnly, | |||
WoW64Mode mode) | |||
{ | |||
const char* const root = registerForCurrentUserOnly ? "HKEY_CURRENT_USER\\Software\\Classes\\" | |||
: "HKEY_CLASSES_ROOT\\"; | |||
const String key (root + symbolicDescription); | |||
return setValue (root + fileExtension + "\\", symbolicDescription) | |||
&& setValue (key + "\\", fullDescription) | |||
&& setValue (key + "\\shell\\open\\command\\", targetExecutable.getFullPathName() + " \"%1\"") | |||
return setValue (root + fileExtension + "\\", symbolicDescription, mode) | |||
&& setValue (key + "\\", fullDescription, mode) | |||
&& setValue (key + "\\shell\\open\\command\\", targetExecutable.getFullPathName() + " \"%1\"", mode) | |||
&& (iconResourceNumber == 0 | |||
|| setValue (key + "\\DefaultIcon\\", | |||
targetExecutable.getFullPathName() + "," + String (-iconResourceNumber))); | |||
} | |||
// These methods are deprecated: | |||
String WindowsRegistry::getValueWow64 (const String& p, const String& defVal) { return getValue (p, defVal, WoW64_64bit); } | |||
bool WindowsRegistry::valueExistsWow64 (const String& p) { return valueExists (p, WoW64_64bit); } | |||
bool WindowsRegistry::keyExistsWow64 (const String& p) { return keyExists (p, WoW64_64bit); } |
@@ -150,7 +150,7 @@ void Thread::killThread() | |||
} | |||
} | |||
void Thread::setCurrentThreadName (const String& name) | |||
void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) | |||
{ | |||
#if JUCE_DEBUG && JUCE_MSVC | |||
struct | |||
@@ -177,7 +177,7 @@ void Thread::setCurrentThreadName (const String& name) | |||
#endif | |||
} | |||
Thread::ThreadID Thread::getCurrentThreadId() | |||
Thread::ThreadID JUCE_CALLTYPE Thread::getCurrentThreadId() | |||
{ | |||
return (ThreadID) (pointer_sized_int) GetCurrentThreadId(); | |||
} | |||
@@ -199,7 +199,7 @@ bool Thread::setThreadPriority (void* handle, int priority) | |||
return SetThreadPriority (handle, pri) != FALSE; | |||
} | |||
void Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) | |||
void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) | |||
{ | |||
SetThreadAffinityMask (GetCurrentThread(), affinityMask); | |||
} | |||
@@ -271,7 +271,7 @@ void juce_repeatLastProcessPriority() | |||
} | |||
} | |||
void Process::setPriority (ProcessPriority prior) | |||
void JUCE_CALLTYPE Process::setPriority (ProcessPriority prior) | |||
{ | |||
if (lastProcessPriority != (int) prior) | |||
{ | |||
@@ -292,7 +292,7 @@ bool JUCE_CALLTYPE Process::isRunningUnderDebugger() | |||
static void* currentModuleHandle = nullptr; | |||
void* Process::getCurrentModuleInstanceHandle() noexcept | |||
void* JUCE_CALLTYPE Process::getCurrentModuleInstanceHandle() noexcept | |||
{ | |||
if (currentModuleHandle == nullptr) | |||
currentModuleHandle = GetModuleHandleA (nullptr); | |||
@@ -300,22 +300,22 @@ void* Process::getCurrentModuleInstanceHandle() noexcept | |||
return currentModuleHandle; | |||
} | |||
void Process::setCurrentModuleInstanceHandle (void* const newHandle) noexcept | |||
void JUCE_CALLTYPE Process::setCurrentModuleInstanceHandle (void* const newHandle) noexcept | |||
{ | |||
currentModuleHandle = newHandle; | |||
} | |||
void Process::raisePrivilege() | |||
void JUCE_CALLTYPE Process::raisePrivilege() | |||
{ | |||
jassertfalse; // xxx not implemented | |||
} | |||
void Process::lowerPrivilege() | |||
void JUCE_CALLTYPE Process::lowerPrivilege() | |||
{ | |||
jassertfalse; // xxx not implemented | |||
} | |||
void Process::terminate() | |||
void JUCE_CALLTYPE Process::terminate() | |||
{ | |||
#if JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS | |||
_CrtDumpMemoryLeaks(); | |||
@@ -101,12 +101,12 @@ static void findIPAddresses (int sock, Array<IPAddress>& result) | |||
{ | |||
ifconf cfg; | |||
HeapBlock<char> buffer; | |||
size_t bufferSize = 1024; | |||
int bufferSize = 1024; | |||
do | |||
{ | |||
bufferSize *= 2; | |||
buffer.calloc (bufferSize); | |||
buffer.calloc ((size_t) bufferSize); | |||
cfg.ifc_len = bufferSize; | |||
cfg.ifc_buf = buffer; | |||
@@ -114,7 +114,7 @@ static void findIPAddresses (int sock, Array<IPAddress>& result) | |||
if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL) | |||
return; | |||
} while (bufferSize < cfg.ifc_len + 2 * (IFNAMSIZ + sizeof (struct sockaddr_in6))); | |||
} while (bufferSize < cfg.ifc_len + 2 * (int) (IFNAMSIZ + sizeof (struct sockaddr_in6))); | |||
#if JUCE_MAC || JUCE_IOS | |||
while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in))) | |||
@@ -126,7 +126,7 @@ static void findIPAddresses (int sock, Array<IPAddress>& result) | |||
cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; | |||
} | |||
#else | |||
for (int i = 0; i < cfg.ifc_len / sizeof (struct ifreq); ++i) | |||
for (size_t i = 0; i < cfg.ifc_len / sizeof (struct ifreq); ++i) | |||
{ | |||
const ifreq& item = cfg.ifc_req[i]; | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_MACADDRESS_H_INCLUDED | |||
#define JUCE_MACADDRESS_H_INCLUDED | |||
#include "../containers/juce_Array.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,7 +29,6 @@ | |||
#ifndef JUCE_NAMEDPIPE_H_INCLUDED | |||
#define JUCE_NAMEDPIPE_H_INCLUDED | |||
#include "../threads/juce_ReadWriteLock.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,8 +29,6 @@ | |||
#ifndef JUCE_SOCKET_H_INCLUDED | |||
#define JUCE_SOCKET_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,11 +29,6 @@ | |||
#ifndef JUCE_URL_H_INCLUDED | |||
#define JUCE_URL_H_INCLUDED | |||
#include "../text/juce_StringPairArray.h" | |||
#include "../files/juce_File.h" | |||
class InputStream; | |||
class XmlElement; | |||
//============================================================================== | |||
/** | |||
@@ -29,10 +29,6 @@ | |||
#ifndef JUCE_BUFFEREDINPUTSTREAM_H_INCLUDED | |||
#define JUCE_BUFFEREDINPUTSTREAM_H_INCLUDED | |||
#include "juce_InputStream.h" | |||
#include "../memory/juce_OptionalScopedPointer.h" | |||
#include "../memory/juce_HeapBlock.h" | |||
//============================================================================== | |||
/** Wraps another input stream, and reads from it using an intermediate buffer | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_FILEINPUTSOURCE_H_INCLUDED | |||
#define JUCE_FILEINPUTSOURCE_H_INCLUDED | |||
#include "juce_InputSource.h" | |||
#include "../files/juce_File.h" | |||
//============================================================================== | |||
/** | |||
@@ -29,7 +29,6 @@ | |||
#ifndef JUCE_INPUTSOURCE_H_INCLUDED | |||
#define JUCE_INPUTSOURCE_H_INCLUDED | |||
#include "juce_InputStream.h" | |||
//============================================================================== | |||
/** | |||
@@ -175,7 +175,8 @@ String InputStream::readString() | |||
} | |||
} | |||
return String::fromUTF8 (data, (int) i); | |||
return String (CharPointer_UTF8 (data), | |||
CharPointer_UTF8 (data + i)); | |||
} | |||
String InputStream::readNextLine() | |||
@@ -29,9 +29,6 @@ | |||
#ifndef JUCE_INPUTSTREAM_H_INCLUDED | |||
#define JUCE_INPUTSTREAM_H_INCLUDED | |||
#include "../text/juce_String.h" | |||
class MemoryBlock; | |||
//============================================================================== | |||
/** The base class for streams that read data. | |||