| @@ -16629,6 +16629,12 @@ ValueTree ValueTree::readFromStream (InputStream& input) | |||||
| return v; | return v; | ||||
| } | } | ||||
| ValueTree ValueTree::readFromData (const void* const data, const size_t numBytes) | |||||
| { | |||||
| MemoryInputStream in (data, numBytes, false); | |||||
| return readFromStream (in); | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| /*** End of inlined file: juce_ValueTree.cpp ***/ | /*** End of inlined file: juce_ValueTree.cpp ***/ | ||||
| @@ -30392,6 +30398,27 @@ void AudioUnitPluginInstance::initialise() | |||||
| void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | ||||
| int samplesPerBlockExpected) | int samplesPerBlockExpected) | ||||
| { | { | ||||
| if (audioUnit != 0) | |||||
| { | |||||
| Float64 sampleRateIn = 0, sampleRateOut = 0; | |||||
| UInt32 sampleRateSize = sizeof (sampleRateIn); | |||||
| AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, 0, &sampleRateIn, &sampleRateSize); | |||||
| AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sampleRateOut, &sampleRateSize); | |||||
| if (sampleRateIn != sampleRate_ || sampleRateOut != sampleRate_) | |||||
| { | |||||
| if (initialised) | |||||
| { | |||||
| AudioUnitUninitialize (audioUnit); | |||||
| initialised = false; | |||||
| } | |||||
| Float64 sr = sampleRate_; | |||||
| AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, 0, &sr, sizeof (Float64)); | |||||
| AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sr, sizeof (Float64)); | |||||
| } | |||||
| } | |||||
| initialise(); | initialise(); | ||||
| if (initialised) | if (initialised) | ||||
| @@ -30423,16 +30450,12 @@ void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | |||||
| stream.mBitsPerChannel = 32; | stream.mBitsPerChannel = 32; | ||||
| stream.mChannelsPerFrame = numIns; | stream.mChannelsPerFrame = numIns; | ||||
| OSStatus err = AudioUnitSetProperty (audioUnit, | |||||
| kAudioUnitProperty_StreamFormat, | |||||
| kAudioUnitScope_Input, | |||||
| OSStatus err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, | |||||
| 0, &stream, sizeof (stream)); | 0, &stream, sizeof (stream)); | ||||
| stream.mChannelsPerFrame = numOuts; | stream.mChannelsPerFrame = numOuts; | ||||
| err = AudioUnitSetProperty (audioUnit, | |||||
| kAudioUnitProperty_StreamFormat, | |||||
| kAudioUnitScope_Output, | |||||
| err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, | |||||
| 0, &stream, sizeof (stream)); | 0, &stream, sizeof (stream)); | ||||
| outputBufferList.calloc (sizeof (AudioBufferList) + sizeof (AudioBuffer) * (numOuts + 1), 1); | outputBufferList.calloc (sizeof (AudioBufferList) + sizeof (AudioBuffer) * (numOuts + 1), 1); | ||||
| @@ -86184,6 +86207,53 @@ void Font::findFonts (Array<Font>& destArray) throw() | |||||
| destArray.add (Font (names[i], FontValues::defaultFontHeight, Font::plain)); | destArray.add (Font (names[i], FontValues::defaultFontHeight, Font::plain)); | ||||
| } | } | ||||
| const String Font::toString() const | |||||
| { | |||||
| String s (getTypefaceName()); | |||||
| if (s == getDefaultSansSerifFontName()) | |||||
| s = String::empty; | |||||
| else | |||||
| s += "; "; | |||||
| s += String (getHeight(), 1); | |||||
| if (isBold()) | |||||
| s += " bold"; | |||||
| if (isItalic()) | |||||
| s += " italic"; | |||||
| return s; | |||||
| } | |||||
| const Font Font::fromString (const String& fontDescription) | |||||
| { | |||||
| String name; | |||||
| const int separator = fontDescription.indexOfChar (';'); | |||||
| if (separator > 0) | |||||
| name = fontDescription.substring (0, separator).trim(); | |||||
| if (name.isEmpty()) | |||||
| name = getDefaultSansSerifFontName(); | |||||
| String sizeAndStyle (fontDescription.substring (separator + 1)); | |||||
| float height = sizeAndStyle.getFloatValue(); | |||||
| if (height <= 0) | |||||
| height = 10.0f; | |||||
| int flags = Font::plain; | |||||
| if (sizeAndStyle.containsIgnoreCase ("bold")) | |||||
| flags |= Font::bold; | |||||
| if (sizeAndStyle.containsIgnoreCase ("italic")) | |||||
| flags |= Font::italic; | |||||
| return Font (name, height, flags); | |||||
| } | |||||
| class TypefaceCache : public DeletedAtShutdown | class TypefaceCache : public DeletedAtShutdown | ||||
| { | { | ||||
| public: | public: | ||||
| @@ -13086,10 +13086,12 @@ public: | |||||
| */ | */ | ||||
| void writeToStream (OutputStream& output); | void writeToStream (OutputStream& output); | ||||
| /** Reloads a tree from a stream that was written with writeToStream(). | |||||
| */ | |||||
| /** Reloads a tree from a stream that was written with writeToStream(). */ | |||||
| static ValueTree readFromStream (InputStream& input); | static ValueTree readFromStream (InputStream& input); | ||||
| /** Reloads a tree from a data block that was written with writeToStream(). */ | |||||
| static ValueTree readFromData (const void* data, size_t numBytes); | |||||
| /** Listener class for events that happen to a ValueTree. | /** Listener class for events that happen to a ValueTree. | ||||
| To get events from a ValueTree, make your class implement this interface, and use | To get events from a ValueTree, make your class implement this interface, and use | ||||
| @@ -21782,6 +21784,18 @@ public: | |||||
| */ | */ | ||||
| static void setFallbackFontName (const String& name) throw(); | static void setFallbackFontName (const String& name) throw(); | ||||
| /** Creates a string to describe this font. | |||||
| The string will contain information to describe the font's typeface, size, and | |||||
| style. To recreate the font from this string, use fromString(). | |||||
| */ | |||||
| const String toString() const; | |||||
| /** Recreates a font from its stringified encoding. | |||||
| This method takes a string that was created by toString(), and recreates the | |||||
| original font. | |||||
| */ | |||||
| static const Font fromString (const String& fontDescription); | |||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| private: | private: | ||||
| @@ -35113,8 +35127,8 @@ public: | |||||
| @param componentName the name to give the component | @param componentName the name to give the component | ||||
| @param labelText the text to show in the label | @param labelText the text to show in the label | ||||
| */ | */ | ||||
| Label (const String& componentName, | |||||
| const String& labelText); | |||||
| Label (const String& componentName = String::empty, | |||||
| const String& labelText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~Label(); | ~Label(); | ||||
| @@ -35430,7 +35444,7 @@ public: | |||||
| @param componentName the name to set for the component (see Component::setName()) | @param componentName the name to set for the component (see Component::setName()) | ||||
| */ | */ | ||||
| explicit ComboBox (const String& componentName); | |||||
| explicit ComboBox (const String& componentName = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~ComboBox(); | ~ComboBox(); | ||||
| @@ -39198,7 +39212,7 @@ public: | |||||
| @see Button | @see Button | ||||
| */ | */ | ||||
| TextButton (const String& buttonName, | |||||
| TextButton (const String& buttonName = String::empty, | |||||
| const String& toolTip = String::empty); | const String& toolTip = String::empty); | ||||
| /** Destructor. */ | /** Destructor. */ | ||||
| @@ -42267,7 +42281,7 @@ public: | |||||
| initially set to this string, but these can be changed later | initially set to this string, but these can be changed later | ||||
| using the setName() and setButtonText() methods) | using the setName() and setButtonText() methods) | ||||
| */ | */ | ||||
| ToggleButton (const String& buttonText); | |||||
| explicit ToggleButton (const String& buttonText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~ToggleButton(); | ~ToggleButton(); | ||||
| @@ -44162,7 +44176,7 @@ public: | |||||
| When created, you'll need to set up the slider's style and range with setSliderStyle(), | When created, you'll need to set up the slider's style and range with setSliderStyle(), | ||||
| setRange(), etc. | setRange(), etc. | ||||
| */ | */ | ||||
| explicit Slider (const String& componentName); | |||||
| explicit Slider (const String& componentName = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~Slider(); | ~Slider(); | ||||
| @@ -50002,8 +50016,8 @@ public: | |||||
| @param componentName the name to give the component | @param componentName the name to give the component | ||||
| @param labelText the text to show at the top of the outline | @param labelText the text to show at the top of the outline | ||||
| */ | */ | ||||
| GroupComponent (const String& componentName, | |||||
| const String& labelText); | |||||
| GroupComponent (const String& componentName = String::empty, | |||||
| const String& labelText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~GroupComponent(); | ~GroupComponent(); | ||||
| @@ -552,6 +552,27 @@ void AudioUnitPluginInstance::initialise() | |||||
| void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | ||||
| int samplesPerBlockExpected) | int samplesPerBlockExpected) | ||||
| { | { | ||||
| if (audioUnit != 0) | |||||
| { | |||||
| Float64 sampleRateIn = 0, sampleRateOut = 0; | |||||
| UInt32 sampleRateSize = sizeof (sampleRateIn); | |||||
| AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, 0, &sampleRateIn, &sampleRateSize); | |||||
| AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sampleRateOut, &sampleRateSize); | |||||
| if (sampleRateIn != sampleRate_ || sampleRateOut != sampleRate_) | |||||
| { | |||||
| if (initialised) | |||||
| { | |||||
| AudioUnitUninitialize (audioUnit); | |||||
| initialised = false; | |||||
| } | |||||
| Float64 sr = sampleRate_; | |||||
| AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, 0, &sr, sizeof (Float64)); | |||||
| AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sr, sizeof (Float64)); | |||||
| } | |||||
| } | |||||
| initialise(); | initialise(); | ||||
| if (initialised) | if (initialised) | ||||
| @@ -583,16 +604,12 @@ void AudioUnitPluginInstance::prepareToPlay (double sampleRate_, | |||||
| stream.mBitsPerChannel = 32; | stream.mBitsPerChannel = 32; | ||||
| stream.mChannelsPerFrame = numIns; | stream.mChannelsPerFrame = numIns; | ||||
| OSStatus err = AudioUnitSetProperty (audioUnit, | |||||
| kAudioUnitProperty_StreamFormat, | |||||
| kAudioUnitScope_Input, | |||||
| OSStatus err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, | |||||
| 0, &stream, sizeof (stream)); | 0, &stream, sizeof (stream)); | ||||
| stream.mChannelsPerFrame = numOuts; | stream.mChannelsPerFrame = numOuts; | ||||
| err = AudioUnitSetProperty (audioUnit, | |||||
| kAudioUnitProperty_StreamFormat, | |||||
| kAudioUnitScope_Output, | |||||
| err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, | |||||
| 0, &stream, sizeof (stream)); | 0, &stream, sizeof (stream)); | ||||
| outputBufferList.calloc (sizeof (AudioBufferList) + sizeof (AudioBuffer) * (numOuts + 1), 1); | outputBufferList.calloc (sizeof (AudioBufferList) + sizeof (AudioBuffer) * (numOuts + 1), 1); | ||||
| @@ -28,6 +28,7 @@ | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| #include "juce_ValueTree.h" | #include "juce_ValueTree.h" | ||||
| #include "../io/streams/juce_MemoryInputStream.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -860,4 +861,10 @@ ValueTree ValueTree::readFromStream (InputStream& input) | |||||
| return v; | return v; | ||||
| } | } | ||||
| ValueTree ValueTree::readFromData (const void* const data, const size_t numBytes) | |||||
| { | |||||
| MemoryInputStream in (data, numBytes, false); | |||||
| return readFromStream (in); | |||||
| } | |||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -310,10 +310,12 @@ public: | |||||
| */ | */ | ||||
| void writeToStream (OutputStream& output); | void writeToStream (OutputStream& output); | ||||
| /** Reloads a tree from a stream that was written with writeToStream(). | |||||
| */ | |||||
| /** Reloads a tree from a stream that was written with writeToStream(). */ | |||||
| static ValueTree readFromStream (InputStream& input); | static ValueTree readFromStream (InputStream& input); | ||||
| /** Reloads a tree from a data block that was written with writeToStream(). */ | |||||
| static ValueTree readFromData (const void* data, size_t numBytes); | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Listener class for events that happen to a ValueTree. | /** Listener class for events that happen to a ValueTree. | ||||
| @@ -49,7 +49,7 @@ public: | |||||
| @see Button | @see Button | ||||
| */ | */ | ||||
| TextButton (const String& buttonName, | |||||
| TextButton (const String& buttonName = String::empty, | |||||
| const String& toolTip = String::empty); | const String& toolTip = String::empty); | ||||
| /** Destructor. */ | /** Destructor. */ | ||||
| @@ -48,7 +48,7 @@ public: | |||||
| initially set to this string, but these can be changed later | initially set to this string, but these can be changed later | ||||
| using the setName() and setButtonText() methods) | using the setName() and setButtonText() methods) | ||||
| */ | */ | ||||
| ToggleButton (const String& buttonText); | |||||
| explicit ToggleButton (const String& buttonText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~ToggleButton(); | ~ToggleButton(); | ||||
| @@ -84,7 +84,7 @@ public: | |||||
| @param componentName the name to set for the component (see Component::setName()) | @param componentName the name to set for the component (see Component::setName()) | ||||
| */ | */ | ||||
| explicit ComboBox (const String& componentName); | |||||
| explicit ComboBox (const String& componentName = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~ComboBox(); | ~ComboBox(); | ||||
| @@ -71,8 +71,8 @@ public: | |||||
| @param componentName the name to give the component | @param componentName the name to give the component | ||||
| @param labelText the text to show in the label | @param labelText the text to show in the label | ||||
| */ | */ | ||||
| Label (const String& componentName, | |||||
| const String& labelText); | |||||
| Label (const String& componentName = String::empty, | |||||
| const String& labelText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~Label(); | ~Label(); | ||||
| @@ -68,7 +68,7 @@ public: | |||||
| When created, you'll need to set up the slider's style and range with setSliderStyle(), | When created, you'll need to set up the slider's style and range with setSliderStyle(), | ||||
| setRange(), etc. | setRange(), etc. | ||||
| */ | */ | ||||
| explicit Slider (const String& componentName); | |||||
| explicit Slider (const String& componentName = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~Slider(); | ~Slider(); | ||||
| @@ -44,8 +44,8 @@ public: | |||||
| @param componentName the name to give the component | @param componentName the name to give the component | ||||
| @param labelText the text to show at the top of the outline | @param labelText the text to show at the top of the outline | ||||
| */ | */ | ||||
| GroupComponent (const String& componentName, | |||||
| const String& labelText); | |||||
| GroupComponent (const String& componentName = String::empty, | |||||
| const String& labelText = String::empty); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~GroupComponent(); | ~GroupComponent(); | ||||
| @@ -338,6 +338,53 @@ void Font::findFonts (Array<Font>& destArray) throw() | |||||
| destArray.add (Font (names[i], FontValues::defaultFontHeight, Font::plain)); | destArray.add (Font (names[i], FontValues::defaultFontHeight, Font::plain)); | ||||
| } | } | ||||
| //============================================================================== | |||||
| const String Font::toString() const | |||||
| { | |||||
| String s (getTypefaceName()); | |||||
| if (s == getDefaultSansSerifFontName()) | |||||
| s = String::empty; | |||||
| else | |||||
| s += "; "; | |||||
| s += String (getHeight(), 1); | |||||
| if (isBold()) | |||||
| s += " bold"; | |||||
| if (isItalic()) | |||||
| s += " italic"; | |||||
| return s; | |||||
| } | |||||
| const Font Font::fromString (const String& fontDescription) | |||||
| { | |||||
| String name; | |||||
| const int separator = fontDescription.indexOfChar (';'); | |||||
| if (separator > 0) | |||||
| name = fontDescription.substring (0, separator).trim(); | |||||
| if (name.isEmpty()) | |||||
| name = getDefaultSansSerifFontName(); | |||||
| String sizeAndStyle (fontDescription.substring (separator + 1)); | |||||
| float height = sizeAndStyle.getFloatValue(); | |||||
| if (height <= 0) | |||||
| height = 10.0f; | |||||
| int flags = Font::plain; | |||||
| if (sizeAndStyle.containsIgnoreCase ("bold")) | |||||
| flags |= Font::bold; | |||||
| if (sizeAndStyle.containsIgnoreCase ("italic")) | |||||
| flags |= Font::italic; | |||||
| return Font (name, height, flags); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| class TypefaceCache : public DeletedAtShutdown | class TypefaceCache : public DeletedAtShutdown | ||||
| @@ -344,6 +344,18 @@ public: | |||||
| */ | */ | ||||
| static void setFallbackFontName (const String& name) throw(); | static void setFallbackFontName (const String& name) throw(); | ||||
| //============================================================================== | |||||
| /** Creates a string to describe this font. | |||||
| The string will contain information to describe the font's typeface, size, and | |||||
| style. To recreate the font from this string, use fromString(). | |||||
| */ | |||||
| const String toString() const; | |||||
| /** Recreates a font from its stringified encoding. | |||||
| This method takes a string that was created by toString(), and recreates the | |||||
| original font. | |||||
| */ | |||||
| static const Font fromString (const String& fontDescription); | |||||
| //============================================================================== | //============================================================================== | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||