mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
StringArray fix + additional unit tests. AudioFormatManager tweak for iOS. Minor clean-ups.
This commit is contained in:
parent
ce0b4bdb9c
commit
07b73e4071
14 changed files with 91 additions and 101 deletions
|
|
@ -172,7 +172,7 @@ private:
|
|||
for (int i = 10; --i >= 0;)
|
||||
{
|
||||
Path pp;
|
||||
pp.addStar (Point<float> (r.nextInt (w), r.nextInt (h)), r.nextInt (8) + 3, 10, 20, 0);
|
||||
pp.addStar (Point<float> (r.nextFloat() * w, r.nextFloat() * h, r.nextFloat() * 8 + 3, 10.0f, 20.0f, 0.0f);
|
||||
g.setColour (Colours::pink.withAlpha (0.4f));
|
||||
g.fillPath (pp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ void AudioFormatManager::registerFormat (AudioFormat* newFormat, const bool make
|
|||
|
||||
if (newFormat != nullptr)
|
||||
{
|
||||
#if JUCE_DEBUG
|
||||
#if JUCE_DEBUG
|
||||
for (int i = getNumKnownFormats(); --i >= 0;)
|
||||
{
|
||||
if (getKnownFormat (i)->getFormatName() == newFormat->getFormatName())
|
||||
|
|
@ -50,7 +50,7 @@ void AudioFormatManager::registerFormat (AudioFormat* newFormat, const bool make
|
|||
jassertfalse; // trying to add the same format twice!
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (makeThisTheDefaultFormat)
|
||||
defaultFormatIndex = getNumKnownFormats();
|
||||
|
|
@ -61,22 +61,20 @@ void AudioFormatManager::registerFormat (AudioFormat* newFormat, const bool make
|
|||
|
||||
void AudioFormatManager::registerBasicFormats()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
registerFormat (new AiffAudioFormat(), true);
|
||||
registerFormat (new WavAudioFormat(), false);
|
||||
registerFormat (new CoreAudioFormat(), false);
|
||||
#else
|
||||
registerFormat (new WavAudioFormat(), true);
|
||||
registerFormat (new AiffAudioFormat(), false);
|
||||
#endif
|
||||
|
||||
#if JUCE_USE_FLAC
|
||||
#if JUCE_MAC || JUCE_IOS
|
||||
registerFormat (new CoreAudioFormat(), false);
|
||||
#endif
|
||||
|
||||
#if JUCE_USE_FLAC
|
||||
registerFormat (new FlacAudioFormat(), false);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if JUCE_USE_OGGVORBIS
|
||||
#if JUCE_USE_OGGVORBIS
|
||||
registerFormat (new OggVorbisAudioFormat(), false);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void AudioFormatManager::clearFormats()
|
||||
|
|
@ -102,12 +100,11 @@ AudioFormat* AudioFormatManager::getDefaultFormat() const
|
|||
|
||||
AudioFormat* AudioFormatManager::findFormatForFileExtension (const String& fileExtension) const
|
||||
{
|
||||
String e (fileExtension);
|
||||
if (! e.startsWithChar ('.'))
|
||||
e = "." + e;
|
||||
if (! fileExtension.startsWithChar ('.'))
|
||||
return findFormatForFileExtension ("." + fileExtension);
|
||||
|
||||
for (int i = 0; i < getNumKnownFormats(); ++i)
|
||||
if (getKnownFormat(i)->getFileExtensions().contains (e, true))
|
||||
if (getKnownFormat(i)->getFileExtensions().contains (fileExtension, true))
|
||||
return getKnownFormat(i);
|
||||
|
||||
return nullptr;
|
||||
|
|
@ -115,30 +112,20 @@ AudioFormat* AudioFormatManager::findFormatForFileExtension (const String& fileE
|
|||
|
||||
String AudioFormatManager::getWildcardForAllFormats() const
|
||||
{
|
||||
StringArray allExtensions;
|
||||
StringArray extensions;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < getNumKnownFormats(); ++i)
|
||||
allExtensions.addArray (getKnownFormat (i)->getFileExtensions());
|
||||
extensions.addArray (getKnownFormat(i)->getFileExtensions());
|
||||
|
||||
allExtensions.trim();
|
||||
allExtensions.removeEmptyStrings();
|
||||
extensions.trim();
|
||||
extensions.removeEmptyStrings();
|
||||
|
||||
String s;
|
||||
for (i = 0; i < allExtensions.size(); ++i)
|
||||
{
|
||||
s << '*';
|
||||
for (i = 0; i < extensions.size(); ++i)
|
||||
extensions.set (i, (extensions[i].startsWithChar ('.') ? "*" : "*.") + extensions[i]);
|
||||
|
||||
if (! allExtensions[i].startsWithChar ('.'))
|
||||
s << '.';
|
||||
|
||||
s << allExtensions[i];
|
||||
|
||||
if (i < allExtensions.size() - 1)
|
||||
s << ';';
|
||||
}
|
||||
|
||||
return s;
|
||||
extensions.removeDuplicates (true);
|
||||
return extensions.joinIntoString (";");
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -87,12 +87,10 @@ public:
|
|||
|
||||
LinkedListPointer& operator= (LinkedListPointer&& other) noexcept
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
item = other.item;
|
||||
other.item = nullptr;
|
||||
}
|
||||
jassert (this != &other); // hopefully the compiler should make this situation impossible!
|
||||
|
||||
item = other.item;
|
||||
other.item = nullptr;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2382,8 +2382,8 @@ public:
|
|||
beginTest ("StringArray");
|
||||
|
||||
StringArray s;
|
||||
for (int i = 5; --i >= 0;)
|
||||
s.add (String (i));
|
||||
s.addTokens ("4,3,2,1,0", ";,", "x");
|
||||
expectEquals (s.size(), 5);
|
||||
|
||||
expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0"));
|
||||
s.remove (2);
|
||||
|
|
@ -2391,6 +2391,21 @@ public:
|
|||
expectEquals (s.joinIntoString (String::empty), String ("4310"));
|
||||
s.clear();
|
||||
expectEquals (s.joinIntoString ("x"), String::empty);
|
||||
|
||||
StringArray toks;
|
||||
toks.addTokens ("x,,", ";,", "");
|
||||
expectEquals (toks.size(), 3);
|
||||
expectEquals (toks.joinIntoString ("-"), String ("x--"));
|
||||
toks.clear();
|
||||
|
||||
toks.addTokens (",x,", ";,", "");
|
||||
expectEquals (toks.size(), 3);
|
||||
expectEquals (toks.joinIntoString ("-"), String ("-x-"));
|
||||
toks.clear();
|
||||
|
||||
toks.addTokens ("x,'y,z',", ";,", "'");
|
||||
expectEquals (toks.size(), 3);
|
||||
expectEquals (toks.joinIntoString ("-"), String ("x-'y,z'-"));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -279,15 +279,13 @@ void StringArray::trim()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
class InternalStringArrayComparator_CaseSensitive
|
||||
struct InternalStringArrayComparator_CaseSensitive
|
||||
{
|
||||
public:
|
||||
static int compareElements (String& first, String& second) { return first.compare (second); }
|
||||
};
|
||||
|
||||
class InternalStringArrayComparator_CaseInsensitive
|
||||
struct InternalStringArrayComparator_CaseInsensitive
|
||||
{
|
||||
public:
|
||||
static int compareElements (String& first, String& second) { return first.compareIgnoreCase (second); }
|
||||
};
|
||||
|
||||
|
|
@ -363,18 +361,21 @@ int StringArray::addTokens (const String& text, const String& breakCharacters, c
|
|||
int num = 0;
|
||||
String::CharPointerType t (text.getCharPointer());
|
||||
|
||||
while (! t.isEmpty())
|
||||
if (! t.isEmpty())
|
||||
{
|
||||
String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t,
|
||||
breakCharacters.getCharPointer(),
|
||||
quoteCharacters.getCharPointer()));
|
||||
add (String (t, tokenEnd));
|
||||
++num;
|
||||
for (;;)
|
||||
{
|
||||
String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t,
|
||||
breakCharacters.getCharPointer(),
|
||||
quoteCharacters.getCharPointer()));
|
||||
add (String (t, tokenEnd));
|
||||
++num;
|
||||
|
||||
if (tokenEnd.isEmpty())
|
||||
break;
|
||||
if (tokenEnd.isEmpty())
|
||||
break;
|
||||
|
||||
t = ++tokenEnd;
|
||||
t = ++tokenEnd;
|
||||
}
|
||||
}
|
||||
|
||||
return num;
|
||||
|
|
|
|||
|
|
@ -95,16 +95,15 @@ XmlElement::XmlElement (XmlElement&& other) noexcept
|
|||
|
||||
XmlElement& XmlElement::operator= (XmlElement&& other) noexcept
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
removeAllAttributes();
|
||||
deleteAllChildElements();
|
||||
jassert (this != &other); // hopefully the compiler should make this situation impossible!
|
||||
|
||||
nextListItem = static_cast <LinkedListPointer <XmlElement>&&> (other.nextListItem);
|
||||
firstChildElement = static_cast <LinkedListPointer <XmlElement>&&> (other.firstChildElement);
|
||||
attributes = static_cast <LinkedListPointer <XmlAttributeNode>&&> (other.attributes);
|
||||
tagName = static_cast <String&&> (other.tagName);
|
||||
}
|
||||
removeAllAttributes();
|
||||
deleteAllChildElements();
|
||||
|
||||
nextListItem = static_cast <LinkedListPointer <XmlElement>&&> (other.nextListItem);
|
||||
firstChildElement = static_cast <LinkedListPointer <XmlElement>&&> (other.firstChildElement);
|
||||
attributes = static_cast <LinkedListPointer <XmlAttributeNode>&&> (other.attributes);
|
||||
tagName = static_cast <String&&> (other.tagName);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
//==============================================================================
|
||||
class AsyncUpdaterMessage : public CallbackMessage
|
||||
class AsyncUpdater::AsyncUpdaterMessage : public CallbackMessage
|
||||
{
|
||||
public:
|
||||
AsyncUpdaterMessage (AsyncUpdater& owner_)
|
||||
|
|
@ -52,11 +52,6 @@ AsyncUpdater::AsyncUpdater()
|
|||
message = new AsyncUpdaterMessage (*this);
|
||||
}
|
||||
|
||||
inline Atomic<int>& AsyncUpdater::getDeliveryFlag() const noexcept
|
||||
{
|
||||
return static_cast <AsyncUpdaterMessage*> (message.getObject())->shouldDeliver;
|
||||
}
|
||||
|
||||
AsyncUpdater::~AsyncUpdater()
|
||||
{
|
||||
// You're deleting this object with a background thread while there's an update
|
||||
|
|
@ -65,18 +60,18 @@ AsyncUpdater::~AsyncUpdater()
|
|||
// deleting this object, or find some other way to avoid such a race condition.
|
||||
jassert ((! isUpdatePending()) || MessageManager::getInstance()->currentThreadHasLockedMessageManager());
|
||||
|
||||
getDeliveryFlag().set (0);
|
||||
message->shouldDeliver.set (0);
|
||||
}
|
||||
|
||||
void AsyncUpdater::triggerAsyncUpdate()
|
||||
{
|
||||
if (getDeliveryFlag().compareAndSetBool (1, 0))
|
||||
if (message->shouldDeliver.compareAndSetBool (1, 0))
|
||||
message->post();
|
||||
}
|
||||
|
||||
void AsyncUpdater::cancelPendingUpdate() noexcept
|
||||
{
|
||||
getDeliveryFlag().set (0);
|
||||
message->shouldDeliver.set (0);
|
||||
}
|
||||
|
||||
void AsyncUpdater::handleUpdateNowIfNeeded()
|
||||
|
|
@ -84,13 +79,13 @@ void AsyncUpdater::handleUpdateNowIfNeeded()
|
|||
// This can only be called by the event thread.
|
||||
jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());
|
||||
|
||||
if (getDeliveryFlag().exchange (0) != 0)
|
||||
if (message->shouldDeliver.exchange (0) != 0)
|
||||
handleAsyncUpdate();
|
||||
}
|
||||
|
||||
bool AsyncUpdater::isUpdatePending() const noexcept
|
||||
{
|
||||
return getDeliveryFlag().value != 0;
|
||||
return message->shouldDeliver.value != 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,8 +26,6 @@
|
|||
#ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__
|
||||
#define __JUCE_ASYNCUPDATER_JUCEHEADER__
|
||||
|
||||
#include "../messages/juce_CallbackMessage.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
|
|
@ -102,8 +100,9 @@ public:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
ReferenceCountedObjectPtr<CallbackMessage> message;
|
||||
Atomic<int>& getDeliveryFlag() const noexcept;
|
||||
class AsyncUpdaterMessage;
|
||||
friend class ReferenceCountedObjectPtr<AsyncUpdaterMessage>;
|
||||
ReferenceCountedObjectPtr<AsyncUpdaterMessage> message;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AsyncUpdater);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -281,14 +281,14 @@ public:
|
|||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
Iterator (const ListType& list_)
|
||||
Iterator (const ListType& list_) noexcept
|
||||
: list (list_), index (list_.size())
|
||||
{}
|
||||
|
||||
~Iterator() {}
|
||||
~Iterator() noexcept {}
|
||||
|
||||
//==============================================================================
|
||||
bool next()
|
||||
bool next() noexcept
|
||||
{
|
||||
if (index <= 0)
|
||||
return false;
|
||||
|
|
@ -302,7 +302,7 @@ public:
|
|||
return index >= 0;
|
||||
}
|
||||
|
||||
bool next (const BailOutCheckerType& bailOutChecker)
|
||||
bool next (const BailOutCheckerType& bailOutChecker) noexcept
|
||||
{
|
||||
return (! bailOutChecker.shouldBailOut()) && next();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ struct HSB
|
|||
return Colour (hue, saturation, brightness, original.getAlpha());
|
||||
}
|
||||
|
||||
static PixelARGB convertHSBtoRGB (float h, float s, float v, const uint8 alpha) noexcept
|
||||
static PixelARGB toRGB (float h, float s, float v, const uint8 alpha) noexcept
|
||||
{
|
||||
v = jlimit (0.0f, 255.0f, v * 255.0f);
|
||||
const uint8 intV = (uint8) roundToInt (v);
|
||||
|
|
@ -178,7 +178,7 @@ Colour Colour::fromRGBAFloat (const uint8 red, const uint8 green, const uint8 bl
|
|||
}
|
||||
|
||||
Colour::Colour (const float hue, const float saturation, const float brightness, const float alpha) noexcept
|
||||
: argb (HSB::convertHSBtoRGB (hue, saturation, brightness, ColourHelpers::floatToUInt8 (alpha)))
|
||||
: argb (HSB::toRGB (hue, saturation, brightness, ColourHelpers::floatToUInt8 (alpha)))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ Colour Colour::fromHSV (const float hue, const float saturation, const float bri
|
|||
}
|
||||
|
||||
Colour::Colour (const float hue, const float saturation, const float brightness, const uint8 alpha) noexcept
|
||||
: argb (HSB::convertHSBtoRGB (hue, saturation, brightness, alpha))
|
||||
: argb (HSB::toRGB (hue, saturation, brightness, alpha))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,14 +78,12 @@ FillType::FillType (FillType&& other) noexcept
|
|||
|
||||
FillType& FillType::operator= (FillType&& other) noexcept
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
colour = other.colour;
|
||||
gradient = other.gradient.release();
|
||||
image = static_cast <Image&&> (other.image);
|
||||
transform = other.transform;
|
||||
}
|
||||
jassert (this != &other); // hopefully the compiler should make this situation impossible!
|
||||
|
||||
colour = other.colour;
|
||||
gradient = other.gradient.release();
|
||||
image = static_cast <Image&&> (other.image);
|
||||
transform = other.transform;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -79,11 +79,11 @@ public:
|
|||
or saveMode, and canSelectFiles and/or canSelectDirectories.
|
||||
@param initialFileOrDirectory The file or directory that should be selected when the component begins.
|
||||
If this is File::nonexistent, a default directory will be chosen.
|
||||
@param fileFilter an optional filter to use to determine which files are shown.
|
||||
@param fileFilter an optional filter to use to determine which files are shown.
|
||||
If this is nullptr then all files are displayed. Note that a pointer
|
||||
is kept internally to this object, so make sure that it is not deleted
|
||||
before the FileBrowserComponent object is deleted.
|
||||
@param previewComp an optional preview component that will be used to show previews of
|
||||
@param previewComp an optional preview component that will be used to show previews of
|
||||
files that the user selects
|
||||
*/
|
||||
FileBrowserComponent (int flags,
|
||||
|
|
|
|||
|
|
@ -1169,12 +1169,10 @@ PopupMenu::PopupMenu (PopupMenu&& other) noexcept
|
|||
|
||||
PopupMenu& PopupMenu::operator= (PopupMenu&& other) noexcept
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
items.swapWithArray (other.items);
|
||||
lookAndFeel = other.lookAndFeel;
|
||||
}
|
||||
jassert (this != &other); // hopefully the compiler should make this situation impossible!
|
||||
|
||||
items.swapWithArray (other.items);
|
||||
lookAndFeel = other.lookAndFeel;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ public:
|
|||
The item ID of each item will be its index in the StringArray + firstItemIdOffset.
|
||||
*/
|
||||
void addItemList (const StringArray& items, int firstItemIdOffset);
|
||||
|
||||
|
||||
/** Adds a separator line to the drop-down list.
|
||||
|
||||
This is like adding a separator to a popup menu. See PopupMenu::addSeparator().
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue