mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-11 23:54:18 +00:00
cosmetic cleanup
This commit is contained in:
parent
04367b199a
commit
29e2de7fd0
40 changed files with 3783 additions and 3787 deletions
|
|
@ -352,7 +352,7 @@ struct FindFileStruct
|
|||
|
||||
// returns 0 on failure
|
||||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile,
|
||||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
Time* creationTime, bool* isReadOnly) throw()
|
||||
{
|
||||
DIR* d = opendir (directory.toUTF8());
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ WebBrowserComponent::~WebBrowserComponent()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void WebBrowserComponent::goToURL (const String& url,
|
||||
void WebBrowserComponent::goToURL (const String& url,
|
||||
const StringArray* headers,
|
||||
const MemoryBlock* postData)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -633,7 +633,7 @@ struct FindFileStruct
|
|||
|
||||
// returns 0 on failure
|
||||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile,
|
||||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
bool* isDir, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
Time* creationTime, bool* isReadOnly) throw()
|
||||
{
|
||||
DIR* const d = opendir (directory.toUTF8());
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ public:
|
|||
StringArray lines;
|
||||
lines.addLines (responseHeader);
|
||||
|
||||
// NB - using charToString() here instead of just T(" "), because that was
|
||||
// NB - using charToString() here instead of just T(" "), because that was
|
||||
// causing a mysterious gcc internal compiler error...
|
||||
const int statusCode = responseHeader.fromFirstOccurrenceOf (String::charToString (T(' ')), false, false)
|
||||
.substring (0, 3)
|
||||
|
|
@ -399,4 +399,3 @@ int juce_seekInInternetFile (void* handle, int newPosition)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1844,7 +1844,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
jassert (freeSlot >= 0); // unfortunately you can only have a finite number
|
||||
jassert (freeSlot >= 0); // unfortunately you can only have a finite number
|
||||
// of ASIO devices open at the same time..
|
||||
|
||||
if (freeSlot >= 0)
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ void WebBrowserComponent::checkWindowAssociation()
|
|||
{
|
||||
if (browser != 0 && ! blankPageShown)
|
||||
{
|
||||
// when the component becomes invisible, some stuff like flash
|
||||
// when the component becomes invisible, some stuff like flash
|
||||
// carries on playing audio, so we need to force it onto a blank
|
||||
// page to avoid this..
|
||||
|
||||
|
|
|
|||
|
|
@ -1,282 +1,282 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __JUCE_FILTERGRAPH_JUCEHEADER__
|
||||
#define __JUCE_FILTERGRAPH_JUCEHEADER__
|
||||
|
||||
class FilterInGraph;
|
||||
class FilterGraph;
|
||||
|
||||
const char* const filenameSuffix = ".filtergraph";
|
||||
const char* const filenameWildcard = "*.filtergraph";
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a connection between two pins in a FilterGraph.
|
||||
*/
|
||||
class FilterConnection
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterConnection (FilterGraph& owner);
|
||||
FilterConnection (const FilterConnection& other);
|
||||
~FilterConnection();
|
||||
|
||||
//==============================================================================
|
||||
uint32 sourceFilterID;
|
||||
int sourceChannel;
|
||||
uint32 destFilterID;
|
||||
int destChannel;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
FilterGraph& owner;
|
||||
|
||||
const FilterConnection& operator= (const FilterConnection&);
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents one of the filters in a FilterGraph.
|
||||
*/
|
||||
/*class FilterInGraph : public ReferenceCountedObject
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterInGraph (FilterGraph& owner, AudioPluginInstance* const plugin);
|
||||
~FilterInGraph();
|
||||
|
||||
//==============================================================================
|
||||
AudioPluginInstance* const filter;
|
||||
uint32 uid;
|
||||
|
||||
//==============================================================================
|
||||
void showUI (bool useGenericUI);
|
||||
|
||||
double getX() const throw() { return x; }
|
||||
double getY() const throw() { return y; }
|
||||
void setPosition (double x, double y) throw();
|
||||
|
||||
XmlElement* createXml() const;
|
||||
|
||||
static FilterInGraph* createForDescription (FilterGraph& owner,
|
||||
const PluginDescription& desc,
|
||||
String& errorMessage);
|
||||
|
||||
static FilterInGraph* createFromXml (FilterGraph& owner, const XmlElement& xml);
|
||||
|
||||
//==============================================================================
|
||||
typedef ReferenceCountedObjectPtr <FilterInGraph> Ptr;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class FilterGraphPlayer;
|
||||
FilterGraph& owner;
|
||||
double x, y;
|
||||
|
||||
friend class PluginWindow;
|
||||
Component* activeUI;
|
||||
Component* activeGenericUI;
|
||||
int lastX, lastY;
|
||||
|
||||
MidiBuffer outputMidi;
|
||||
AudioSampleBuffer processedAudio;
|
||||
MidiBuffer processedMidi;
|
||||
|
||||
void prepareBuffers (int blockSize);
|
||||
void renderBlock (int numSamples,
|
||||
const ReferenceCountedArray <FilterInGraph>& filters,
|
||||
const OwnedArray <FilterConnection>& connections);
|
||||
|
||||
FilterInGraph (const FilterInGraph&);
|
||||
const FilterInGraph& operator= (const FilterInGraph&);
|
||||
};
|
||||
*/
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
A collection of filters and some connections between them.
|
||||
*/
|
||||
class FilterGraph : public FileBasedDocument
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterGraph();
|
||||
~FilterGraph();
|
||||
|
||||
//==============================================================================
|
||||
AudioProcessorGraph& getGraph() throw() { return graph; }
|
||||
|
||||
int getNumFilters() const throw();
|
||||
const AudioProcessorGraph::Node::Ptr getNode (const int index) const throw();
|
||||
const AudioProcessorGraph::Node::Ptr getNodeForId (const uint32 uid) const throw();
|
||||
|
||||
void addFilter (const PluginDescription* desc, double x, double y);
|
||||
|
||||
void removeFilter (const uint32 filterUID);
|
||||
void disconnectFilter (const uint32 filterUID);
|
||||
|
||||
void removeIllegalConnections();
|
||||
|
||||
void setNodePosition (const int nodeId, double x, double y);
|
||||
void getNodePosition (const int nodeId, double& x, double& y) const;
|
||||
|
||||
//==============================================================================
|
||||
int getNumConnections() const throw();
|
||||
const AudioProcessorGraph::Connection* getConnection (const int index) const throw();
|
||||
|
||||
const AudioProcessorGraph::Connection* getConnectionBetween (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel) const throw();
|
||||
|
||||
bool canConnect (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel) const throw();
|
||||
|
||||
bool addConnection (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel);
|
||||
|
||||
void removeConnection (const int index);
|
||||
|
||||
void removeConnection (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel);
|
||||
|
||||
void clear();
|
||||
|
||||
|
||||
//==============================================================================
|
||||
|
||||
XmlElement* createXml() const;
|
||||
void restoreFromXml (const XmlElement& xml);
|
||||
|
||||
//==============================================================================
|
||||
const String getDocumentTitle();
|
||||
const String loadDocument (const File& file);
|
||||
const String saveDocument (const File& file);
|
||||
const File getLastDocumentOpened();
|
||||
void setLastDocumentOpened (const File& file);
|
||||
|
||||
/** The special channel index used to refer to a filter's midi channel.
|
||||
*/
|
||||
static const int midiChannelNumber;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
//friend class FilterGraphPlayer;
|
||||
//ReferenceCountedArray <FilterInGraph> filters;
|
||||
//OwnedArray <FilterConnection> connections;
|
||||
|
||||
AudioProcessorGraph graph;
|
||||
AudioProcessorPlayer player;
|
||||
|
||||
uint32 lastUID;
|
||||
uint32 getNextUID() throw();
|
||||
|
||||
void createNodeFromXml (const XmlElement& xml);
|
||||
|
||||
FilterGraph (const FilterGraph&);
|
||||
const FilterGraph& operator= (const FilterGraph&);
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
|
||||
*/
|
||||
/*class FilterGraphPlayer : public AudioIODeviceCallback,
|
||||
public MidiInputCallback,
|
||||
public ChangeListener
|
||||
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterGraphPlayer (FilterGraph& graph);
|
||||
~FilterGraphPlayer();
|
||||
|
||||
//==============================================================================
|
||||
void setAudioDeviceManager (AudioDeviceManager* dm);
|
||||
AudioDeviceManager* getAudioDeviceManager() const throw() { return deviceManager; }
|
||||
|
||||
//==============================================================================
|
||||
void audioDeviceIOCallback (const float** inputChannelData,
|
||||
int totalNumInputChannels,
|
||||
float** outputChannelData,
|
||||
int totalNumOutputChannels,
|
||||
int numSamples);
|
||||
void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock);
|
||||
void audioDeviceStopped();
|
||||
|
||||
void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message);
|
||||
|
||||
void changeListenerCallback (void*);
|
||||
|
||||
//==============================================================================
|
||||
static int compareElements (FilterInGraph* const first, FilterInGraph* const second) throw();
|
||||
|
||||
const float** inputChannelData;
|
||||
int totalNumInputChannels;
|
||||
float** outputChannelData;
|
||||
int totalNumOutputChannels;
|
||||
MidiBuffer incomingMidi;
|
||||
|
||||
MidiKeyboardState keyState;
|
||||
MidiMessageCollector messageCollector;
|
||||
|
||||
//==============================================================================
|
||||
class PlayerAwareFilter
|
||||
{
|
||||
public:
|
||||
virtual void setPlayer (FilterGraphPlayer* newPlayer) = 0;
|
||||
};
|
||||
|
||||
private:
|
||||
FilterGraph& graph;
|
||||
CriticalSection processLock;
|
||||
double sampleRate;
|
||||
int blockSize;
|
||||
AudioDeviceManager* deviceManager;
|
||||
|
||||
ReferenceCountedArray <FilterInGraph> filters;
|
||||
OwnedArray <FilterConnection> connections;
|
||||
|
||||
void update();
|
||||
|
||||
FilterGraphPlayer (const FilterGraphPlayer&);
|
||||
const FilterGraphPlayer& operator= (const FilterGraphPlayer&);
|
||||
};
|
||||
*/
|
||||
|
||||
#endif
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __JUCE_FILTERGRAPH_JUCEHEADER__
|
||||
#define __JUCE_FILTERGRAPH_JUCEHEADER__
|
||||
|
||||
class FilterInGraph;
|
||||
class FilterGraph;
|
||||
|
||||
const char* const filenameSuffix = ".filtergraph";
|
||||
const char* const filenameWildcard = "*.filtergraph";
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a connection between two pins in a FilterGraph.
|
||||
*/
|
||||
class FilterConnection
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterConnection (FilterGraph& owner);
|
||||
FilterConnection (const FilterConnection& other);
|
||||
~FilterConnection();
|
||||
|
||||
//==============================================================================
|
||||
uint32 sourceFilterID;
|
||||
int sourceChannel;
|
||||
uint32 destFilterID;
|
||||
int destChannel;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
FilterGraph& owner;
|
||||
|
||||
const FilterConnection& operator= (const FilterConnection&);
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents one of the filters in a FilterGraph.
|
||||
*/
|
||||
/*class FilterInGraph : public ReferenceCountedObject
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterInGraph (FilterGraph& owner, AudioPluginInstance* const plugin);
|
||||
~FilterInGraph();
|
||||
|
||||
//==============================================================================
|
||||
AudioPluginInstance* const filter;
|
||||
uint32 uid;
|
||||
|
||||
//==============================================================================
|
||||
void showUI (bool useGenericUI);
|
||||
|
||||
double getX() const throw() { return x; }
|
||||
double getY() const throw() { return y; }
|
||||
void setPosition (double x, double y) throw();
|
||||
|
||||
XmlElement* createXml() const;
|
||||
|
||||
static FilterInGraph* createForDescription (FilterGraph& owner,
|
||||
const PluginDescription& desc,
|
||||
String& errorMessage);
|
||||
|
||||
static FilterInGraph* createFromXml (FilterGraph& owner, const XmlElement& xml);
|
||||
|
||||
//==============================================================================
|
||||
typedef ReferenceCountedObjectPtr <FilterInGraph> Ptr;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class FilterGraphPlayer;
|
||||
FilterGraph& owner;
|
||||
double x, y;
|
||||
|
||||
friend class PluginWindow;
|
||||
Component* activeUI;
|
||||
Component* activeGenericUI;
|
||||
int lastX, lastY;
|
||||
|
||||
MidiBuffer outputMidi;
|
||||
AudioSampleBuffer processedAudio;
|
||||
MidiBuffer processedMidi;
|
||||
|
||||
void prepareBuffers (int blockSize);
|
||||
void renderBlock (int numSamples,
|
||||
const ReferenceCountedArray <FilterInGraph>& filters,
|
||||
const OwnedArray <FilterConnection>& connections);
|
||||
|
||||
FilterInGraph (const FilterInGraph&);
|
||||
const FilterInGraph& operator= (const FilterInGraph&);
|
||||
};
|
||||
*/
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
A collection of filters and some connections between them.
|
||||
*/
|
||||
class FilterGraph : public FileBasedDocument
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterGraph();
|
||||
~FilterGraph();
|
||||
|
||||
//==============================================================================
|
||||
AudioProcessorGraph& getGraph() throw() { return graph; }
|
||||
|
||||
int getNumFilters() const throw();
|
||||
const AudioProcessorGraph::Node::Ptr getNode (const int index) const throw();
|
||||
const AudioProcessorGraph::Node::Ptr getNodeForId (const uint32 uid) const throw();
|
||||
|
||||
void addFilter (const PluginDescription* desc, double x, double y);
|
||||
|
||||
void removeFilter (const uint32 filterUID);
|
||||
void disconnectFilter (const uint32 filterUID);
|
||||
|
||||
void removeIllegalConnections();
|
||||
|
||||
void setNodePosition (const int nodeId, double x, double y);
|
||||
void getNodePosition (const int nodeId, double& x, double& y) const;
|
||||
|
||||
//==============================================================================
|
||||
int getNumConnections() const throw();
|
||||
const AudioProcessorGraph::Connection* getConnection (const int index) const throw();
|
||||
|
||||
const AudioProcessorGraph::Connection* getConnectionBetween (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel) const throw();
|
||||
|
||||
bool canConnect (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel) const throw();
|
||||
|
||||
bool addConnection (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel);
|
||||
|
||||
void removeConnection (const int index);
|
||||
|
||||
void removeConnection (uint32 sourceFilterUID, int sourceFilterChannel,
|
||||
uint32 destFilterUID, int destFilterChannel);
|
||||
|
||||
void clear();
|
||||
|
||||
|
||||
//==============================================================================
|
||||
|
||||
XmlElement* createXml() const;
|
||||
void restoreFromXml (const XmlElement& xml);
|
||||
|
||||
//==============================================================================
|
||||
const String getDocumentTitle();
|
||||
const String loadDocument (const File& file);
|
||||
const String saveDocument (const File& file);
|
||||
const File getLastDocumentOpened();
|
||||
void setLastDocumentOpened (const File& file);
|
||||
|
||||
/** The special channel index used to refer to a filter's midi channel.
|
||||
*/
|
||||
static const int midiChannelNumber;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
//friend class FilterGraphPlayer;
|
||||
//ReferenceCountedArray <FilterInGraph> filters;
|
||||
//OwnedArray <FilterConnection> connections;
|
||||
|
||||
AudioProcessorGraph graph;
|
||||
AudioProcessorPlayer player;
|
||||
|
||||
uint32 lastUID;
|
||||
uint32 getNextUID() throw();
|
||||
|
||||
void createNodeFromXml (const XmlElement& xml);
|
||||
|
||||
FilterGraph (const FilterGraph&);
|
||||
const FilterGraph& operator= (const FilterGraph&);
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
|
||||
*/
|
||||
/*class FilterGraphPlayer : public AudioIODeviceCallback,
|
||||
public MidiInputCallback,
|
||||
public ChangeListener
|
||||
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
FilterGraphPlayer (FilterGraph& graph);
|
||||
~FilterGraphPlayer();
|
||||
|
||||
//==============================================================================
|
||||
void setAudioDeviceManager (AudioDeviceManager* dm);
|
||||
AudioDeviceManager* getAudioDeviceManager() const throw() { return deviceManager; }
|
||||
|
||||
//==============================================================================
|
||||
void audioDeviceIOCallback (const float** inputChannelData,
|
||||
int totalNumInputChannels,
|
||||
float** outputChannelData,
|
||||
int totalNumOutputChannels,
|
||||
int numSamples);
|
||||
void audioDeviceAboutToStart (double sampleRate, int numSamplesPerBlock);
|
||||
void audioDeviceStopped();
|
||||
|
||||
void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message);
|
||||
|
||||
void changeListenerCallback (void*);
|
||||
|
||||
//==============================================================================
|
||||
static int compareElements (FilterInGraph* const first, FilterInGraph* const second) throw();
|
||||
|
||||
const float** inputChannelData;
|
||||
int totalNumInputChannels;
|
||||
float** outputChannelData;
|
||||
int totalNumOutputChannels;
|
||||
MidiBuffer incomingMidi;
|
||||
|
||||
MidiKeyboardState keyState;
|
||||
MidiMessageCollector messageCollector;
|
||||
|
||||
//==============================================================================
|
||||
class PlayerAwareFilter
|
||||
{
|
||||
public:
|
||||
virtual void setPlayer (FilterGraphPlayer* newPlayer) = 0;
|
||||
};
|
||||
|
||||
private:
|
||||
FilterGraph& graph;
|
||||
CriticalSection processLock;
|
||||
double sampleRate;
|
||||
int blockSize;
|
||||
AudioDeviceManager* deviceManager;
|
||||
|
||||
ReferenceCountedArray <FilterInGraph> filters;
|
||||
OwnedArray <FilterConnection> connections;
|
||||
|
||||
void update();
|
||||
|
||||
FilterGraphPlayer (const FilterGraphPlayer&);
|
||||
const FilterGraphPlayer& operator= (const FilterGraphPlayer&);
|
||||
};
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
the your build.
|
||||
|
||||
Most of these are turned on or off by default, but you can override
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
|
||||
/*
|
||||
/*
|
||||
This file includes the entire juce source tree via the amalgamated file.
|
||||
|
||||
You could add the amalgamated file directly to your project, but doing it
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
the source code.
|
||||
*/
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -7969,4 +7969,3 @@ static const unsigned char temp17[] = {47,42,13,10,32,32,61,61,61,61,61,61,61,61
|
|||
111,109,109,97,110,100,77,97,110,97,103,101,114,41,13,10,123,13,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,87,105,100,103,101,116,
|
||||
115,68,101,109,111,32,40,99,111,109,109,97,110,100,77,97,110,97,103,101,114,41,59,13,10,125,13,10,0,0};
|
||||
const char* BinaryData::widgetsdemo_cpp = (const char*) temp17;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,129 +1,129 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../jucedemo_headers.h"
|
||||
|
||||
#if JUCE_QUICKTIME && ! JUCE_LINUX
|
||||
|
||||
//==============================================================================
|
||||
// so that we can easily have two QT windows each with a file browser, wrap this up as a class..
|
||||
class QuickTimeWindowWithFileBrowser : public Component,
|
||||
public FilenameComponentListener
|
||||
{
|
||||
public:
|
||||
QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
addAndMakeVisible (qtComp = new QuickTimeMovieComponent());
|
||||
|
||||
// and a file-chooser..
|
||||
addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"),
|
||||
File::nonexistent,
|
||||
true, false, false,
|
||||
T("*.*"),
|
||||
String::empty,
|
||||
T("(choose a video file to play)")));
|
||||
fileChooser->addListener (this);
|
||||
fileChooser->setBrowseButtonText (T("browse"));
|
||||
}
|
||||
|
||||
~QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp->setBounds (0, 0, getWidth(), getHeight() - 30);
|
||||
fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24);
|
||||
}
|
||||
|
||||
void filenameComponentChanged (FilenameComponent*)
|
||||
{
|
||||
// this is called when the user changes the filename in the file chooser box
|
||||
if (qtComp->loadMovie (fileChooser->getCurrentFile(), true))
|
||||
{
|
||||
// loaded the file ok, so let's start it playing..
|
||||
|
||||
qtComp->play();
|
||||
}
|
||||
else
|
||||
{
|
||||
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
|
||||
T("Couldn't load the file!"),
|
||||
T("Sorry, QuickTime didn't manage to load that file!"));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QuickTimeMovieComponent* qtComp;
|
||||
FilenameComponent* fileChooser;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class QuickTimeDemo : public Component
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
QuickTimeDemo()
|
||||
{
|
||||
setName (T("QuickTime"));
|
||||
|
||||
// add a movie component..
|
||||
addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser());
|
||||
addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser());
|
||||
}
|
||||
|
||||
~QuickTimeDemo()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f);
|
||||
qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
QuickTimeWindowWithFileBrowser* qtComp1;
|
||||
QuickTimeWindowWithFileBrowser* qtComp2;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
Component* createQuickTimeDemo()
|
||||
{
|
||||
return new QuickTimeDemo();
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../jucedemo_headers.h"
|
||||
|
||||
#if JUCE_QUICKTIME && ! JUCE_LINUX
|
||||
|
||||
//==============================================================================
|
||||
// so that we can easily have two QT windows each with a file browser, wrap this up as a class..
|
||||
class QuickTimeWindowWithFileBrowser : public Component,
|
||||
public FilenameComponentListener
|
||||
{
|
||||
public:
|
||||
QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
addAndMakeVisible (qtComp = new QuickTimeMovieComponent());
|
||||
|
||||
// and a file-chooser..
|
||||
addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"),
|
||||
File::nonexistent,
|
||||
true, false, false,
|
||||
T("*.*"),
|
||||
String::empty,
|
||||
T("(choose a video file to play)")));
|
||||
fileChooser->addListener (this);
|
||||
fileChooser->setBrowseButtonText (T("browse"));
|
||||
}
|
||||
|
||||
~QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp->setBounds (0, 0, getWidth(), getHeight() - 30);
|
||||
fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24);
|
||||
}
|
||||
|
||||
void filenameComponentChanged (FilenameComponent*)
|
||||
{
|
||||
// this is called when the user changes the filename in the file chooser box
|
||||
if (qtComp->loadMovie (fileChooser->getCurrentFile(), true))
|
||||
{
|
||||
// loaded the file ok, so let's start it playing..
|
||||
|
||||
qtComp->play();
|
||||
}
|
||||
else
|
||||
{
|
||||
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
|
||||
T("Couldn't load the file!"),
|
||||
T("Sorry, QuickTime didn't manage to load that file!"));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QuickTimeMovieComponent* qtComp;
|
||||
FilenameComponent* fileChooser;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class QuickTimeDemo : public Component
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
QuickTimeDemo()
|
||||
{
|
||||
setName (T("QuickTime"));
|
||||
|
||||
// add a movie component..
|
||||
addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser());
|
||||
addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser());
|
||||
}
|
||||
|
||||
~QuickTimeDemo()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f);
|
||||
qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
QuickTimeWindowWithFileBrowser* qtComp1;
|
||||
QuickTimeWindowWithFileBrowser* qtComp2;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
Component* createQuickTimeDemo()
|
||||
{
|
||||
return new QuickTimeDemo();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,129 +1,129 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../jucedemo_headers.h"
|
||||
|
||||
#if JUCE_QUICKTIME && ! JUCE_LINUX
|
||||
|
||||
//==============================================================================
|
||||
// so that we can easily have two QT windows each with a file browser, wrap this up as a class..
|
||||
class QuickTimeWindowWithFileBrowser : public Component,
|
||||
public FilenameComponentListener
|
||||
{
|
||||
public:
|
||||
QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
addAndMakeVisible (qtComp = new QuickTimeMovieComponent());
|
||||
|
||||
// and a file-chooser..
|
||||
addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"),
|
||||
File::nonexistent,
|
||||
true, false, false,
|
||||
T("*.*"),
|
||||
String::empty,
|
||||
T("(choose a video file to play)")));
|
||||
fileChooser->addListener (this);
|
||||
fileChooser->setBrowseButtonText (T("browse"));
|
||||
}
|
||||
|
||||
~QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp->setBounds (0, 0, getWidth(), getHeight() - 30);
|
||||
fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24);
|
||||
}
|
||||
|
||||
void filenameComponentChanged (FilenameComponent*)
|
||||
{
|
||||
// this is called when the user changes the filename in the file chooser box
|
||||
if (qtComp->loadMovie (fileChooser->getCurrentFile(), true))
|
||||
{
|
||||
// loaded the file ok, so let's start it playing..
|
||||
|
||||
qtComp->play();
|
||||
}
|
||||
else
|
||||
{
|
||||
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
|
||||
T("Couldn't load the file!"),
|
||||
T("Sorry, QuickTime didn't manage to load that file!"));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QuickTimeMovieComponent* qtComp;
|
||||
FilenameComponent* fileChooser;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class QuickTimeDemo : public Component
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
QuickTimeDemo()
|
||||
{
|
||||
setName (T("QuickTime"));
|
||||
|
||||
// add a movie component..
|
||||
addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser());
|
||||
addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser());
|
||||
}
|
||||
|
||||
~QuickTimeDemo()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f);
|
||||
qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
QuickTimeWindowWithFileBrowser* qtComp1;
|
||||
QuickTimeWindowWithFileBrowser* qtComp2;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
Component* createQuickTimeDemo()
|
||||
{
|
||||
return new QuickTimeDemo();
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../jucedemo_headers.h"
|
||||
|
||||
#if JUCE_QUICKTIME && ! JUCE_LINUX
|
||||
|
||||
//==============================================================================
|
||||
// so that we can easily have two QT windows each with a file browser, wrap this up as a class..
|
||||
class QuickTimeWindowWithFileBrowser : public Component,
|
||||
public FilenameComponentListener
|
||||
{
|
||||
public:
|
||||
QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
addAndMakeVisible (qtComp = new QuickTimeMovieComponent());
|
||||
|
||||
// and a file-chooser..
|
||||
addAndMakeVisible (fileChooser = new FilenameComponent (T("movie"),
|
||||
File::nonexistent,
|
||||
true, false, false,
|
||||
T("*.*"),
|
||||
String::empty,
|
||||
T("(choose a video file to play)")));
|
||||
fileChooser->addListener (this);
|
||||
fileChooser->setBrowseButtonText (T("browse"));
|
||||
}
|
||||
|
||||
~QuickTimeWindowWithFileBrowser()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp->setBounds (0, 0, getWidth(), getHeight() - 30);
|
||||
fileChooser->setBounds (0, getHeight() - 24, getWidth(), 24);
|
||||
}
|
||||
|
||||
void filenameComponentChanged (FilenameComponent*)
|
||||
{
|
||||
// this is called when the user changes the filename in the file chooser box
|
||||
if (qtComp->loadMovie (fileChooser->getCurrentFile(), true))
|
||||
{
|
||||
// loaded the file ok, so let's start it playing..
|
||||
|
||||
qtComp->play();
|
||||
}
|
||||
else
|
||||
{
|
||||
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
|
||||
T("Couldn't load the file!"),
|
||||
T("Sorry, QuickTime didn't manage to load that file!"));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QuickTimeMovieComponent* qtComp;
|
||||
FilenameComponent* fileChooser;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class QuickTimeDemo : public Component
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
QuickTimeDemo()
|
||||
{
|
||||
setName (T("QuickTime"));
|
||||
|
||||
// add a movie component..
|
||||
addAndMakeVisible (qtComp1 = new QuickTimeWindowWithFileBrowser());
|
||||
addAndMakeVisible (qtComp2 = new QuickTimeWindowWithFileBrowser());
|
||||
}
|
||||
|
||||
~QuickTimeDemo()
|
||||
{
|
||||
deleteAllChildren();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
qtComp1->setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f);
|
||||
qtComp2->setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
QuickTimeWindowWithFileBrowser* qtComp1;
|
||||
QuickTimeWindowWithFileBrowser* qtComp2;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
Component* createQuickTimeDemo()
|
||||
{
|
||||
return new QuickTimeDemo();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
the your build.
|
||||
|
||||
Most of these are turned on or off by default, but you can override
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
|
||||
/*
|
||||
/*
|
||||
This file includes the entire juce source tree via the amalgamated file.
|
||||
|
||||
You could add the amalgamated file directly to your project, but doing it
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
the source code.
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -911,4 +911,3 @@ static const unsigned char temp4[] = {137,80,78,71,13,10,26,10,0,0,0,13,73,72,68
|
|||
0,98,28,9,155,95,0,2,104,68,236,11,1,8,160,17,225,73,128,0,3,0,120,52,172,151,198,78,252,63,0,0,0,0,73,69,78,68,174,66,
|
||||
96,130,0,0};
|
||||
const char* BinaryData::prefs_misc_png = (const char*) temp4;
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
This file contains settings that you might want to explicitly apply to
|
||||
the your build.
|
||||
|
||||
Most of these are turned on or off by default, but you can override
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
|
||||
/*
|
||||
/*
|
||||
This file includes the entire juce source tree via the amalgamated file.
|
||||
|
||||
You could add the amalgamated file directly to your project, but doing it
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
like this allows you to put your app's config settings in the
|
||||
juce_AppConfig.h file and have them applied to both the juce headers and
|
||||
the source code.
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -362,7 +362,7 @@ void positionToCode (const RelativePositionedRectangle& position,
|
|||
positionToCode (ComponentTypeHandler::getComponentPosition (relCompW), layout, wrx, wry, wrw, wrh);
|
||||
|
||||
String hrx, hry, hrw, hrh;
|
||||
Component* const relCompH = (layout != 0 && position.rect.getHeightMode() != PositionedRectangle::absoluteSize)
|
||||
Component* const relCompH = (layout != 0 && position.rect.getHeightMode() != PositionedRectangle::absoluteSize)
|
||||
? layout->findComponentWithId (position.relativeToH) : 0;
|
||||
if (relCompH != 0)
|
||||
positionToCode (ComponentTypeHandler::getComponentPosition (relCompH), layout, hrx, hry, hrw, hrh);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
/*
|
||||
This monolithic file contains the entire Juce source tree!
|
||||
|
||||
To build an app which uses Juce, all you need to do is to add this
|
||||
To build an app which uses Juce, all you need to do is to add this
|
||||
file to your project, and include juce.h in your own cpp files.
|
||||
|
||||
*/
|
||||
|
|
@ -343,7 +343,7 @@
|
|||
#endif
|
||||
|
||||
//==============================================================================
|
||||
// some files include lots of library code, so leave them to the end to avoid cluttering
|
||||
// some files include lots of library code, so leave them to the end to avoid cluttering
|
||||
// up the build for the clean files.
|
||||
#include "juce_core/io/streams/juce_GZIPCompressorOutputStream.cpp"
|
||||
#include "juce_core/io/streams/juce_GZIPDecompressorInputStream.cpp"
|
||||
|
|
|
|||
|
|
@ -29,11 +29,10 @@
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This header contains the entire Juce source tree, and can be #included in
|
||||
This header contains the entire Juce source tree, and can be #included in
|
||||
all your source files.
|
||||
|
||||
As well as including this in your files, you should also add juce_inline.cpp
|
||||
|
|
@ -43,11 +42,11 @@
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __ALL_JUCE_HEADERS_H__
|
||||
#define __ALL_JUCE_HEADERS_H__
|
||||
#ifndef __JUCE_AMALGAMATED_TEMPLATE_JUCEHEADER__
|
||||
#define __JUCE_AMALGAMATED_TEMPLATE_JUCEHEADER__
|
||||
|
||||
#define DONT_AUTOLINK_TO_JUCE_LIBRARY 1
|
||||
|
||||
#include "../juce.h"
|
||||
|
||||
#endif
|
||||
#endif // __JUCE_AMALGAMATED_TEMPLATE_JUCEHEADER__
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ public:
|
|||
return;
|
||||
#elif JUCE_MAC
|
||||
EnterMoviesOnThread (0);
|
||||
#endif
|
||||
#endif
|
||||
if (EnterMovies() != noErr)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ AudioSourcePlayer::AudioSourcePlayer()
|
|||
sampleRate (0),
|
||||
bufferSize (0),
|
||||
tempBuffer (2, 8),
|
||||
lastGain (1.0f),
|
||||
lastGain (1.0f),
|
||||
gain (1.0f)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ void AudioDeviceManager::updateXml()
|
|||
|
||||
for (int i = 0; i < midiInsFromXml.size(); ++i)
|
||||
{
|
||||
if (! availableMidiDevices.contains (midiInsFromXml[i], true))
|
||||
if (! availableMidiDevices.contains (midiInsFromXml[i], true))
|
||||
{
|
||||
XmlElement* const m = new XmlElement (T("MIDIINPUT"));
|
||||
m->setAttribute (T("name"), midiInsFromXml[i]);
|
||||
|
|
|
|||
|
|
@ -68,21 +68,21 @@ public:
|
|||
|
||||
@param inputChannelData a set of arrays containing the audio data for each
|
||||
incoming channel - this data is valid until the function
|
||||
returns. There will be one channel of data for each input
|
||||
returns. There will be one channel of data for each input
|
||||
channel that was enabled when the audio device was opened
|
||||
(see AudioIODevice::open())
|
||||
@param numInputChannels the number of pointers to channel data in the
|
||||
@param numInputChannels the number of pointers to channel data in the
|
||||
inputChannelData array.
|
||||
@param outputChannelData a set of arrays which need to be filled with the data
|
||||
that should be sent to each outgoing channel of the device.
|
||||
There will be one channel of data for each output channel
|
||||
that was enabled when the audio device was opened (see
|
||||
that was enabled when the audio device was opened (see
|
||||
AudioIODevice::open())
|
||||
The initial contents of the array is undefined, so the
|
||||
callback function must fill all the channels with zeros if
|
||||
its output is silence. Failing to do this could cause quite
|
||||
an unpleasant noise!
|
||||
@param numOutputChannels the number of pointers to channel data in the
|
||||
@param numOutputChannels the number of pointers to channel data in the
|
||||
outputChannelData array.
|
||||
@param numSamples the number of samples in each channel of the input and
|
||||
output arrays. The number of samples will depend on the
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,442 +1,442 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
#define __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
|
||||
#include "juce_AudioProcessor.h"
|
||||
#include "../plugins/juce_AudioPluginFormatManager.h"
|
||||
#include "../plugins/juce_KnownPluginList.h"
|
||||
#include "../../../juce_core/containers/juce_ReferenceCountedArray.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
A type of AudioProcessor which plays back a graph of other AudioProcessors.
|
||||
|
||||
Use one of these objects if you want to wire-up a set of AudioProcessors
|
||||
and play back the result.
|
||||
|
||||
Processors can be added to the graph as "nodes" using addNode(), and once
|
||||
added, you can connect any of their input or output channels to other
|
||||
nodes using addConnection().
|
||||
|
||||
To play back a graph through an audio device, you might want to use an
|
||||
AudioProcessorPlayer object.
|
||||
*/
|
||||
class JUCE_API AudioProcessorGraph : public AudioProcessor,
|
||||
public AsyncUpdater
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates an empty graph.
|
||||
*/
|
||||
AudioProcessorGraph();
|
||||
|
||||
/** Destructor.
|
||||
|
||||
Any processor objects that have been added to the graph will also be deleted.
|
||||
*/
|
||||
~AudioProcessorGraph();
|
||||
|
||||
//==============================================================================
|
||||
/** Represents one of the nodes, or processors, in an AudioProcessorGraph.
|
||||
|
||||
To create a node, call AudioProcessorGraph::addNode().
|
||||
*/
|
||||
class Node : public ReferenceCountedObject
|
||||
{
|
||||
public:
|
||||
/** Destructor.
|
||||
*/
|
||||
~Node();
|
||||
|
||||
//==============================================================================
|
||||
/** The ID number assigned to this node.
|
||||
|
||||
This is assigned by the graph that owns it, and can't be changed.
|
||||
*/
|
||||
const uint32 id;
|
||||
|
||||
/** The actual processor object that this node represents.
|
||||
*/
|
||||
AudioProcessor* const processor;
|
||||
|
||||
/** A set of user-definable properties that are associated with this node.
|
||||
|
||||
This can be used to attach values to the node for whatever purpose seems
|
||||
useful. For example, you might store an x and y position if your application
|
||||
is displaying the nodes on-screen.
|
||||
*/
|
||||
PropertySet properties;
|
||||
|
||||
//==============================================================================
|
||||
/** A convenient typedef for referring to a pointer to a node object.
|
||||
*/
|
||||
typedef ReferenceCountedObjectPtr <Node> Ptr;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class AudioProcessorGraph;
|
||||
|
||||
bool isPrepared;
|
||||
|
||||
Node (const uint32 id, AudioProcessor* const processor) throw();
|
||||
|
||||
void prepare (const double sampleRate, const int blockSize, AudioProcessorGraph* const graph);
|
||||
void unprepare();
|
||||
|
||||
Node (const Node&);
|
||||
const Node& operator= (const Node&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Represents a connection between two channels of two nodes in an AudioProcessorGraph.
|
||||
|
||||
To create a connection, use AudioProcessorGraph::addConnection().
|
||||
*/
|
||||
struct Connection
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** The ID number of the node which is the input source for this connection.
|
||||
@see AudioProcessorGraph::getNodeForId
|
||||
*/
|
||||
uint32 sourceNodeId;
|
||||
|
||||
/** The index of the output channel of the source node from which this
|
||||
connection takes its data.
|
||||
|
||||
If this value is the special number AudioProcessorGraph::midiChannelIndex, then
|
||||
it is referring to the source node's midi output. Otherwise, it is the zero-based
|
||||
index of an audio output channel in the source node.
|
||||
*/
|
||||
int sourceChannelIndex;
|
||||
|
||||
/** The ID number of the node which is the destination for this connection.
|
||||
@see AudioProcessorGraph::getNodeForId
|
||||
*/
|
||||
uint32 destNodeId;
|
||||
|
||||
/** The index of the input channel of the destination node to which this
|
||||
connection delivers its data.
|
||||
|
||||
If this value is the special number AudioProcessorGraph::midiChannelIndex, then
|
||||
it is referring to the destination node's midi input. Otherwise, it is the zero-based
|
||||
index of an audio input channel in the destination node.
|
||||
*/
|
||||
int destChannelIndex;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Deletes all nodes and connections from this graph.
|
||||
|
||||
Any processor objects in the graph will be deleted.
|
||||
*/
|
||||
void clear();
|
||||
|
||||
/** Returns the number of nodes in the graph. */
|
||||
int getNumNodes() const throw() { return nodes.size(); }
|
||||
|
||||
/** Returns a pointer to one of the nodes in the graph.
|
||||
|
||||
This will return 0 if the index is out of range.
|
||||
@see getNodeForId
|
||||
*/
|
||||
Node* getNode (const int index) const throw() { return nodes [index]; }
|
||||
|
||||
/** Searches the graph for a node with the given ID number and returns it.
|
||||
|
||||
If no such node was found, this returns 0.
|
||||
@see getNode
|
||||
*/
|
||||
Node* getNodeForId (const uint32 nodeId) const throw();
|
||||
|
||||
/** Adds a node to the graph.
|
||||
|
||||
This creates a new node in the graph, for the specified processor. Once you have
|
||||
added a processor to the graph, the graph owns it and will delete it later when
|
||||
it is no longer needed.
|
||||
|
||||
The optional nodeId parameter lets you specify an ID to use for the node, but
|
||||
if the value is already in use, this new node will overwrite the old one.
|
||||
|
||||
If this succeeds, it returns a pointer to the newly-created node.
|
||||
*/
|
||||
Node* addNode (AudioProcessor* const newProcessor,
|
||||
uint32 nodeId = 0);
|
||||
|
||||
/** Deletes a node within the graph which has the specified ID.
|
||||
|
||||
This will also delete any connections that are attached to this node.
|
||||
*/
|
||||
bool removeNode (const uint32 nodeId);
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the number of connections in the graph. */
|
||||
int getNumConnections() const throw() { return connections.size(); }
|
||||
|
||||
/** Returns a pointer to one of the connections in the graph. */
|
||||
const Connection* getConnection (const int index) const throw() { return connections [index]; }
|
||||
|
||||
/** Searches for a connection between some specified channels.
|
||||
|
||||
If no such connection is found, this returns 0.
|
||||
*/
|
||||
const Connection* getConnectionBetween (const uint32 sourceNodeId,
|
||||
const int sourceChannelIndex,
|
||||
const uint32 destNodeId,
|
||||
const int destChannelIndex) const throw();
|
||||
|
||||
/** Returns true if there is a connection between any of the channels of
|
||||
two specified nodes.
|
||||
*/
|
||||
bool isConnected (const uint32 possibleSourceNodeId,
|
||||
const uint32 possibleDestNodeId) const throw();
|
||||
|
||||
/** Returns true if it would be legal to connect the specified points.
|
||||
*/
|
||||
bool canConnect (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex) const throw();
|
||||
|
||||
/** Attempts to connect two specified channels of two nodes.
|
||||
|
||||
If this isn't allowed (e.g. because you're trying to connect a midi channel
|
||||
to an audio one or other such nonsense), then it'll return false.
|
||||
*/
|
||||
bool addConnection (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex);
|
||||
|
||||
/** Deletes the connection with the specified index.
|
||||
|
||||
Returns true if a connection was actually deleted.
|
||||
*/
|
||||
void removeConnection (const int index);
|
||||
|
||||
/** Deletes any connection between two specified points.
|
||||
|
||||
Returns true if a connection was actually deleted.
|
||||
*/
|
||||
bool removeConnection (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex);
|
||||
|
||||
/** Removes all connections from the specified node.
|
||||
*/
|
||||
bool disconnectNode (const uint32 nodeId);
|
||||
|
||||
/** Performs a sanity checks of all the connections.
|
||||
|
||||
This might be useful if some of the processors are doing things like changing
|
||||
their channel counts, which could render some connections obsolete.
|
||||
*/
|
||||
bool removeIllegalConnections();
|
||||
|
||||
//==============================================================================
|
||||
/** A special number that represents the midi channel of a node.
|
||||
|
||||
This is used as a channel index value if you want to refer to the midi input
|
||||
or output instead of an audio channel.
|
||||
*/
|
||||
static const int midiChannelIndex;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/** A special type of AudioProcessor that can live inside an AudioProcessorGraph
|
||||
in order to use the audio that comes into and out of the graph itself.
|
||||
|
||||
If you create an AudioGraphIOProcessor in "input" mode, it will act as a
|
||||
node in the graph which delivers the audio that is coming into the parent
|
||||
graph. This allows you to stream the data to other nodes and process the
|
||||
incoming audio.
|
||||
|
||||
Likewise, one of these in "output" mode can be sent data which it will add to
|
||||
the sum of data being sent to the graph's output.
|
||||
|
||||
@see AudioProcessorGraph
|
||||
*/
|
||||
class AudioGraphIOProcessor : public AudioPluginInstance
|
||||
{
|
||||
public:
|
||||
/** Specifies the mode in which this processor will operate.
|
||||
*/
|
||||
enum IODeviceType
|
||||
{
|
||||
audioInputNode, /**< In this mode, the processor has output channels
|
||||
representing all the audio input channels that are
|
||||
coming into its parent audio graph. */
|
||||
audioOutputNode, /**< In this mode, the processor has input channels
|
||||
representing all the audio output channels that are
|
||||
going out of its parent audio graph. */
|
||||
midiInputNode, /**< In this mode, the processor has a midi output which
|
||||
delivers the same midi data that is arriving at its
|
||||
parent graph. */
|
||||
midiOutputNode /**< In this mode, the processor has a midi input and
|
||||
any data sent to it will be passed out of the parent
|
||||
graph. */
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the mode of this processor. */
|
||||
IODeviceType getType() const throw() { return type; }
|
||||
|
||||
/** Returns the parent graph to which this processor belongs, or 0 if it
|
||||
hasn't yet been added to one. */
|
||||
AudioProcessorGraph* getParentGraph() const throw() { return graph; }
|
||||
|
||||
/** True if this is an audio or midi input. */
|
||||
bool isInput() const throw();
|
||||
/** True if this is an audio or midi output. */
|
||||
bool isOutput() const throw();
|
||||
|
||||
//==============================================================================
|
||||
AudioGraphIOProcessor (const IODeviceType type);
|
||||
~AudioGraphIOProcessor();
|
||||
|
||||
const String getName() const;
|
||||
void fillInPluginDescription (PluginDescription& d) const;
|
||||
|
||||
void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock);
|
||||
void releaseResources();
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
|
||||
|
||||
const String getInputChannelName (const int channelIndex) const;
|
||||
const String getOutputChannelName (const int channelIndex) const;
|
||||
bool isInputChannelStereoPair (int index) const;
|
||||
bool isOutputChannelStereoPair (int index) const;
|
||||
bool acceptsMidi() const;
|
||||
bool producesMidi() const;
|
||||
|
||||
AudioProcessorEditor* createEditor();
|
||||
|
||||
int getNumParameters();
|
||||
const String getParameterName (int);
|
||||
float getParameter (int);
|
||||
const String getParameterText (int);
|
||||
void setParameter (int, float);
|
||||
|
||||
int getNumPrograms();
|
||||
int getCurrentProgram();
|
||||
void setCurrentProgram (int);
|
||||
const String getProgramName (int);
|
||||
void changeProgramName (int, const String&);
|
||||
|
||||
void getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData);
|
||||
void setStateInformation (const void* data, int sizeInBytes);
|
||||
|
||||
/** @internal */
|
||||
void setParentGraph (AudioProcessorGraph* const graph) throw();
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
const IODeviceType type;
|
||||
AudioProcessorGraph* graph;
|
||||
|
||||
AudioGraphIOProcessor (const AudioGraphIOProcessor&);
|
||||
const AudioGraphIOProcessor& operator= (const AudioGraphIOProcessor&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
// AudioProcessor methods:
|
||||
|
||||
const String getName() const;
|
||||
|
||||
void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock);
|
||||
void releaseResources();
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
|
||||
|
||||
const String getInputChannelName (const int channelIndex) const;
|
||||
const String getOutputChannelName (const int channelIndex) const;
|
||||
bool isInputChannelStereoPair (int index) const;
|
||||
bool isOutputChannelStereoPair (int index) const;
|
||||
|
||||
bool acceptsMidi() const;
|
||||
bool producesMidi() const;
|
||||
|
||||
AudioProcessorEditor* createEditor() { return 0; }
|
||||
|
||||
int getNumParameters() { return 0; }
|
||||
const String getParameterName (int) { return String::empty; }
|
||||
float getParameter (int) { return 0; }
|
||||
const String getParameterText (int) { return String::empty; }
|
||||
void setParameter (int, float) { }
|
||||
|
||||
int getNumPrograms() { return 0; }
|
||||
int getCurrentProgram() { return 0; }
|
||||
void setCurrentProgram (int) { }
|
||||
const String getProgramName (int) { return String::empty; }
|
||||
void changeProgramName (int, const String&) { }
|
||||
|
||||
void getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData);
|
||||
void setStateInformation (const void* data, int sizeInBytes);
|
||||
|
||||
/** @internal */
|
||||
void handleAsyncUpdate();
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
ReferenceCountedArray <Node> nodes;
|
||||
OwnedArray <Connection> connections;
|
||||
int lastNodeId;
|
||||
AudioSampleBuffer renderingBuffers;
|
||||
OwnedArray <MidiBuffer> midiBuffers;
|
||||
|
||||
CriticalSection renderLock;
|
||||
VoidArray renderingOps;
|
||||
|
||||
friend class AudioGraphIOProcessor;
|
||||
AudioSampleBuffer* currentAudioInputBuffer;
|
||||
AudioSampleBuffer currentAudioOutputBuffer;
|
||||
MidiBuffer* currentMidiInputBuffer;
|
||||
MidiBuffer currentMidiOutputBuffer;
|
||||
|
||||
void clearRenderingSequence();
|
||||
void buildRenderingSequence();
|
||||
|
||||
bool isAnInputTo (const uint32 possibleInputId,
|
||||
const uint32 possibleDestinationId,
|
||||
const int recursionCheck) const throw();
|
||||
|
||||
AudioProcessorGraph (const AudioProcessorGraph&);
|
||||
const AudioProcessorGraph& operator= (const AudioProcessorGraph&);
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
#define __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
|
||||
#include "juce_AudioProcessor.h"
|
||||
#include "../plugins/juce_AudioPluginFormatManager.h"
|
||||
#include "../plugins/juce_KnownPluginList.h"
|
||||
#include "../../../juce_core/containers/juce_ReferenceCountedArray.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
A type of AudioProcessor which plays back a graph of other AudioProcessors.
|
||||
|
||||
Use one of these objects if you want to wire-up a set of AudioProcessors
|
||||
and play back the result.
|
||||
|
||||
Processors can be added to the graph as "nodes" using addNode(), and once
|
||||
added, you can connect any of their input or output channels to other
|
||||
nodes using addConnection().
|
||||
|
||||
To play back a graph through an audio device, you might want to use an
|
||||
AudioProcessorPlayer object.
|
||||
*/
|
||||
class JUCE_API AudioProcessorGraph : public AudioProcessor,
|
||||
public AsyncUpdater
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates an empty graph.
|
||||
*/
|
||||
AudioProcessorGraph();
|
||||
|
||||
/** Destructor.
|
||||
|
||||
Any processor objects that have been added to the graph will also be deleted.
|
||||
*/
|
||||
~AudioProcessorGraph();
|
||||
|
||||
//==============================================================================
|
||||
/** Represents one of the nodes, or processors, in an AudioProcessorGraph.
|
||||
|
||||
To create a node, call AudioProcessorGraph::addNode().
|
||||
*/
|
||||
class Node : public ReferenceCountedObject
|
||||
{
|
||||
public:
|
||||
/** Destructor.
|
||||
*/
|
||||
~Node();
|
||||
|
||||
//==============================================================================
|
||||
/** The ID number assigned to this node.
|
||||
|
||||
This is assigned by the graph that owns it, and can't be changed.
|
||||
*/
|
||||
const uint32 id;
|
||||
|
||||
/** The actual processor object that this node represents.
|
||||
*/
|
||||
AudioProcessor* const processor;
|
||||
|
||||
/** A set of user-definable properties that are associated with this node.
|
||||
|
||||
This can be used to attach values to the node for whatever purpose seems
|
||||
useful. For example, you might store an x and y position if your application
|
||||
is displaying the nodes on-screen.
|
||||
*/
|
||||
PropertySet properties;
|
||||
|
||||
//==============================================================================
|
||||
/** A convenient typedef for referring to a pointer to a node object.
|
||||
*/
|
||||
typedef ReferenceCountedObjectPtr <Node> Ptr;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class AudioProcessorGraph;
|
||||
|
||||
bool isPrepared;
|
||||
|
||||
Node (const uint32 id, AudioProcessor* const processor) throw();
|
||||
|
||||
void prepare (const double sampleRate, const int blockSize, AudioProcessorGraph* const graph);
|
||||
void unprepare();
|
||||
|
||||
Node (const Node&);
|
||||
const Node& operator= (const Node&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Represents a connection between two channels of two nodes in an AudioProcessorGraph.
|
||||
|
||||
To create a connection, use AudioProcessorGraph::addConnection().
|
||||
*/
|
||||
struct Connection
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** The ID number of the node which is the input source for this connection.
|
||||
@see AudioProcessorGraph::getNodeForId
|
||||
*/
|
||||
uint32 sourceNodeId;
|
||||
|
||||
/** The index of the output channel of the source node from which this
|
||||
connection takes its data.
|
||||
|
||||
If this value is the special number AudioProcessorGraph::midiChannelIndex, then
|
||||
it is referring to the source node's midi output. Otherwise, it is the zero-based
|
||||
index of an audio output channel in the source node.
|
||||
*/
|
||||
int sourceChannelIndex;
|
||||
|
||||
/** The ID number of the node which is the destination for this connection.
|
||||
@see AudioProcessorGraph::getNodeForId
|
||||
*/
|
||||
uint32 destNodeId;
|
||||
|
||||
/** The index of the input channel of the destination node to which this
|
||||
connection delivers its data.
|
||||
|
||||
If this value is the special number AudioProcessorGraph::midiChannelIndex, then
|
||||
it is referring to the destination node's midi input. Otherwise, it is the zero-based
|
||||
index of an audio input channel in the destination node.
|
||||
*/
|
||||
int destChannelIndex;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Deletes all nodes and connections from this graph.
|
||||
|
||||
Any processor objects in the graph will be deleted.
|
||||
*/
|
||||
void clear();
|
||||
|
||||
/** Returns the number of nodes in the graph. */
|
||||
int getNumNodes() const throw() { return nodes.size(); }
|
||||
|
||||
/** Returns a pointer to one of the nodes in the graph.
|
||||
|
||||
This will return 0 if the index is out of range.
|
||||
@see getNodeForId
|
||||
*/
|
||||
Node* getNode (const int index) const throw() { return nodes [index]; }
|
||||
|
||||
/** Searches the graph for a node with the given ID number and returns it.
|
||||
|
||||
If no such node was found, this returns 0.
|
||||
@see getNode
|
||||
*/
|
||||
Node* getNodeForId (const uint32 nodeId) const throw();
|
||||
|
||||
/** Adds a node to the graph.
|
||||
|
||||
This creates a new node in the graph, for the specified processor. Once you have
|
||||
added a processor to the graph, the graph owns it and will delete it later when
|
||||
it is no longer needed.
|
||||
|
||||
The optional nodeId parameter lets you specify an ID to use for the node, but
|
||||
if the value is already in use, this new node will overwrite the old one.
|
||||
|
||||
If this succeeds, it returns a pointer to the newly-created node.
|
||||
*/
|
||||
Node* addNode (AudioProcessor* const newProcessor,
|
||||
uint32 nodeId = 0);
|
||||
|
||||
/** Deletes a node within the graph which has the specified ID.
|
||||
|
||||
This will also delete any connections that are attached to this node.
|
||||
*/
|
||||
bool removeNode (const uint32 nodeId);
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the number of connections in the graph. */
|
||||
int getNumConnections() const throw() { return connections.size(); }
|
||||
|
||||
/** Returns a pointer to one of the connections in the graph. */
|
||||
const Connection* getConnection (const int index) const throw() { return connections [index]; }
|
||||
|
||||
/** Searches for a connection between some specified channels.
|
||||
|
||||
If no such connection is found, this returns 0.
|
||||
*/
|
||||
const Connection* getConnectionBetween (const uint32 sourceNodeId,
|
||||
const int sourceChannelIndex,
|
||||
const uint32 destNodeId,
|
||||
const int destChannelIndex) const throw();
|
||||
|
||||
/** Returns true if there is a connection between any of the channels of
|
||||
two specified nodes.
|
||||
*/
|
||||
bool isConnected (const uint32 possibleSourceNodeId,
|
||||
const uint32 possibleDestNodeId) const throw();
|
||||
|
||||
/** Returns true if it would be legal to connect the specified points.
|
||||
*/
|
||||
bool canConnect (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex) const throw();
|
||||
|
||||
/** Attempts to connect two specified channels of two nodes.
|
||||
|
||||
If this isn't allowed (e.g. because you're trying to connect a midi channel
|
||||
to an audio one or other such nonsense), then it'll return false.
|
||||
*/
|
||||
bool addConnection (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex);
|
||||
|
||||
/** Deletes the connection with the specified index.
|
||||
|
||||
Returns true if a connection was actually deleted.
|
||||
*/
|
||||
void removeConnection (const int index);
|
||||
|
||||
/** Deletes any connection between two specified points.
|
||||
|
||||
Returns true if a connection was actually deleted.
|
||||
*/
|
||||
bool removeConnection (const uint32 sourceNodeId, const int sourceChannelIndex,
|
||||
const uint32 destNodeId, const int destChannelIndex);
|
||||
|
||||
/** Removes all connections from the specified node.
|
||||
*/
|
||||
bool disconnectNode (const uint32 nodeId);
|
||||
|
||||
/** Performs a sanity checks of all the connections.
|
||||
|
||||
This might be useful if some of the processors are doing things like changing
|
||||
their channel counts, which could render some connections obsolete.
|
||||
*/
|
||||
bool removeIllegalConnections();
|
||||
|
||||
//==============================================================================
|
||||
/** A special number that represents the midi channel of a node.
|
||||
|
||||
This is used as a channel index value if you want to refer to the midi input
|
||||
or output instead of an audio channel.
|
||||
*/
|
||||
static const int midiChannelIndex;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/** A special type of AudioProcessor that can live inside an AudioProcessorGraph
|
||||
in order to use the audio that comes into and out of the graph itself.
|
||||
|
||||
If you create an AudioGraphIOProcessor in "input" mode, it will act as a
|
||||
node in the graph which delivers the audio that is coming into the parent
|
||||
graph. This allows you to stream the data to other nodes and process the
|
||||
incoming audio.
|
||||
|
||||
Likewise, one of these in "output" mode can be sent data which it will add to
|
||||
the sum of data being sent to the graph's output.
|
||||
|
||||
@see AudioProcessorGraph
|
||||
*/
|
||||
class AudioGraphIOProcessor : public AudioPluginInstance
|
||||
{
|
||||
public:
|
||||
/** Specifies the mode in which this processor will operate.
|
||||
*/
|
||||
enum IODeviceType
|
||||
{
|
||||
audioInputNode, /**< In this mode, the processor has output channels
|
||||
representing all the audio input channels that are
|
||||
coming into its parent audio graph. */
|
||||
audioOutputNode, /**< In this mode, the processor has input channels
|
||||
representing all the audio output channels that are
|
||||
going out of its parent audio graph. */
|
||||
midiInputNode, /**< In this mode, the processor has a midi output which
|
||||
delivers the same midi data that is arriving at its
|
||||
parent graph. */
|
||||
midiOutputNode /**< In this mode, the processor has a midi input and
|
||||
any data sent to it will be passed out of the parent
|
||||
graph. */
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the mode of this processor. */
|
||||
IODeviceType getType() const throw() { return type; }
|
||||
|
||||
/** Returns the parent graph to which this processor belongs, or 0 if it
|
||||
hasn't yet been added to one. */
|
||||
AudioProcessorGraph* getParentGraph() const throw() { return graph; }
|
||||
|
||||
/** True if this is an audio or midi input. */
|
||||
bool isInput() const throw();
|
||||
/** True if this is an audio or midi output. */
|
||||
bool isOutput() const throw();
|
||||
|
||||
//==============================================================================
|
||||
AudioGraphIOProcessor (const IODeviceType type);
|
||||
~AudioGraphIOProcessor();
|
||||
|
||||
const String getName() const;
|
||||
void fillInPluginDescription (PluginDescription& d) const;
|
||||
|
||||
void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock);
|
||||
void releaseResources();
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
|
||||
|
||||
const String getInputChannelName (const int channelIndex) const;
|
||||
const String getOutputChannelName (const int channelIndex) const;
|
||||
bool isInputChannelStereoPair (int index) const;
|
||||
bool isOutputChannelStereoPair (int index) const;
|
||||
bool acceptsMidi() const;
|
||||
bool producesMidi() const;
|
||||
|
||||
AudioProcessorEditor* createEditor();
|
||||
|
||||
int getNumParameters();
|
||||
const String getParameterName (int);
|
||||
float getParameter (int);
|
||||
const String getParameterText (int);
|
||||
void setParameter (int, float);
|
||||
|
||||
int getNumPrograms();
|
||||
int getCurrentProgram();
|
||||
void setCurrentProgram (int);
|
||||
const String getProgramName (int);
|
||||
void changeProgramName (int, const String&);
|
||||
|
||||
void getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData);
|
||||
void setStateInformation (const void* data, int sizeInBytes);
|
||||
|
||||
/** @internal */
|
||||
void setParentGraph (AudioProcessorGraph* const graph) throw();
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
const IODeviceType type;
|
||||
AudioProcessorGraph* graph;
|
||||
|
||||
AudioGraphIOProcessor (const AudioGraphIOProcessor&);
|
||||
const AudioGraphIOProcessor& operator= (const AudioGraphIOProcessor&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
// AudioProcessor methods:
|
||||
|
||||
const String getName() const;
|
||||
|
||||
void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock);
|
||||
void releaseResources();
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
|
||||
|
||||
const String getInputChannelName (const int channelIndex) const;
|
||||
const String getOutputChannelName (const int channelIndex) const;
|
||||
bool isInputChannelStereoPair (int index) const;
|
||||
bool isOutputChannelStereoPair (int index) const;
|
||||
|
||||
bool acceptsMidi() const;
|
||||
bool producesMidi() const;
|
||||
|
||||
AudioProcessorEditor* createEditor() { return 0; }
|
||||
|
||||
int getNumParameters() { return 0; }
|
||||
const String getParameterName (int) { return String::empty; }
|
||||
float getParameter (int) { return 0; }
|
||||
const String getParameterText (int) { return String::empty; }
|
||||
void setParameter (int, float) { }
|
||||
|
||||
int getNumPrograms() { return 0; }
|
||||
int getCurrentProgram() { return 0; }
|
||||
void setCurrentProgram (int) { }
|
||||
const String getProgramName (int) { return String::empty; }
|
||||
void changeProgramName (int, const String&) { }
|
||||
|
||||
void getStateInformation (JUCE_NAMESPACE::MemoryBlock& destData);
|
||||
void setStateInformation (const void* data, int sizeInBytes);
|
||||
|
||||
/** @internal */
|
||||
void handleAsyncUpdate();
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
ReferenceCountedArray <Node> nodes;
|
||||
OwnedArray <Connection> connections;
|
||||
int lastNodeId;
|
||||
AudioSampleBuffer renderingBuffers;
|
||||
OwnedArray <MidiBuffer> midiBuffers;
|
||||
|
||||
CriticalSection renderLock;
|
||||
VoidArray renderingOps;
|
||||
|
||||
friend class AudioGraphIOProcessor;
|
||||
AudioSampleBuffer* currentAudioInputBuffer;
|
||||
AudioSampleBuffer currentAudioOutputBuffer;
|
||||
MidiBuffer* currentMidiInputBuffer;
|
||||
MidiBuffer currentMidiOutputBuffer;
|
||||
|
||||
void clearRenderingSequence();
|
||||
void buildRenderingSequence();
|
||||
|
||||
bool isAnInputTo (const uint32 possibleInputId,
|
||||
const uint32 possibleDestinationId,
|
||||
const int recursionCheck) const throw();
|
||||
|
||||
AudioProcessorGraph (const AudioProcessorGraph&);
|
||||
const AudioProcessorGraph& operator= (const AudioProcessorGraph&);
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__
|
||||
|
|
|
|||
|
|
@ -549,7 +549,7 @@ void ComboBox::showPopup()
|
|||
else if (item->isHeading)
|
||||
menu.addSectionHeader (item->name);
|
||||
else
|
||||
menu.addItem (item->itemId, item->name,
|
||||
menu.addItem (item->itemId, item->name,
|
||||
item->isEnabled, item->itemId == currentId);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ BEGIN_JUCE_NAMESPACE
|
|||
#include "../../graphics/imaging/juce_ImageCache.h"
|
||||
|
||||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
Time* creationTime, bool* isReadOnly) throw();
|
||||
bool juce_findFileNext (void* handle, String& resultFile,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ public:
|
|||
do its own repainting, but only to repaint when the
|
||||
performAnyPendingRepaintsNow() method is called. */
|
||||
windowIsSemiTransparent = (1 << 31) /**< Not intended for public use - makes a window transparent. */
|
||||
|
||||
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -1,344 +1,344 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../../../../../juce_core/basics/juce_StandardHeader.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable: 4390 4611)
|
||||
#endif
|
||||
|
||||
namespace zlibNamespace
|
||||
{
|
||||
#undef OS_CODE
|
||||
#undef fdopen
|
||||
#include "../../../../../juce_core/io/streams/zlib/zlib.h"
|
||||
#undef OS_CODE
|
||||
}
|
||||
|
||||
namespace pnglibNamespace
|
||||
{
|
||||
using namespace zlibNamespace;
|
||||
using ::malloc;
|
||||
using ::free;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
using ::abs;
|
||||
#define PNG_INTERNAL
|
||||
#define NO_DUMMY_DECL
|
||||
#define PNG_SETJMP_NOT_SUPPORTED
|
||||
|
||||
#include "pnglib/png.h"
|
||||
#include "pnglib/pngconf.h"
|
||||
|
||||
#define PNG_NO_EXTERN
|
||||
#include "pnglib/png.c"
|
||||
#include "pnglib/pngerror.c"
|
||||
#include "pnglib/pngget.c"
|
||||
#include "pnglib/pngmem.c"
|
||||
#include "pnglib/pngread.c"
|
||||
#include "pnglib/pngpread.c"
|
||||
#include "pnglib/pngrio.c"
|
||||
#include "pnglib/pngrtran.c"
|
||||
#include "pnglib/pngrutil.c"
|
||||
#include "pnglib/pngset.c"
|
||||
#include "pnglib/pngtrans.c"
|
||||
#include "pnglib/pngwio.c"
|
||||
#include "pnglib/pngwrite.c"
|
||||
#include "pnglib/pngwtran.c"
|
||||
#include "pnglib/pngwutil.c"
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
|
||||
#include "../juce_Image.h"
|
||||
#include "../../../../../juce_core/io/juce_InputStream.h"
|
||||
#include "../../../../../juce_core/io/juce_OutputStream.h"
|
||||
#include "../../colour/juce_PixelFormats.h"
|
||||
|
||||
using namespace pnglibNamespace;
|
||||
using ::malloc;
|
||||
using ::free;
|
||||
|
||||
//==============================================================================
|
||||
static void pngReadCallback (png_structp pngReadStruct, png_bytep data, png_size_t length) throw()
|
||||
{
|
||||
InputStream* const in = (InputStream*) png_get_io_ptr (pngReadStruct);
|
||||
in->read (data, (int) length);
|
||||
}
|
||||
|
||||
struct PNGErrorStruct {};
|
||||
|
||||
static void pngErrorCallback (png_structp, png_const_charp)
|
||||
{
|
||||
throw PNGErrorStruct();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
Image* juce_loadPNGImageFromStream (InputStream& in) throw()
|
||||
{
|
||||
Image* image = 0;
|
||||
|
||||
png_structp pngReadStruct;
|
||||
png_infop pngInfoStruct;
|
||||
|
||||
pngReadStruct = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
|
||||
|
||||
if (pngReadStruct != 0)
|
||||
{
|
||||
pngInfoStruct = png_create_info_struct (pngReadStruct);
|
||||
|
||||
if (pngInfoStruct == 0)
|
||||
{
|
||||
png_destroy_read_struct (&pngReadStruct, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
png_set_error_fn (pngReadStruct, 0, pngErrorCallback, pngErrorCallback);
|
||||
|
||||
// read the header..
|
||||
png_set_read_fn (pngReadStruct, &in, pngReadCallback);
|
||||
|
||||
png_uint_32 width, height;
|
||||
int bitDepth, colorType, interlaceType;
|
||||
|
||||
try
|
||||
{
|
||||
png_read_info (pngReadStruct, pngInfoStruct);
|
||||
|
||||
png_get_IHDR (pngReadStruct, pngInfoStruct,
|
||||
&width, &height,
|
||||
&bitDepth, &colorType,
|
||||
&interlaceType, 0, 0);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
png_destroy_read_struct (&pngReadStruct, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bitDepth == 16)
|
||||
png_set_strip_16 (pngReadStruct);
|
||||
|
||||
if (colorType == PNG_COLOR_TYPE_PALETTE)
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (bitDepth < 8)
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (png_get_valid (pngReadStruct, pngInfoStruct, PNG_INFO_tRNS))
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb (pngReadStruct);
|
||||
|
||||
png_set_add_alpha (pngReadStruct, 0xff, PNG_FILLER_AFTER);
|
||||
|
||||
const bool hasAlphaChan = (colorType & PNG_COLOR_MASK_ALPHA) != 0
|
||||
|| pngInfoStruct->num_trans > 0;
|
||||
|
||||
// Load the image into a temp buffer in the pnglib format..
|
||||
uint8* const tempBuffer = (uint8*) juce_malloc (height * (width << 2));
|
||||
|
||||
png_bytepp rows = (png_bytepp) juce_malloc (sizeof (png_bytep) * height);
|
||||
int y;
|
||||
for (y = (int) height; --y >= 0;)
|
||||
rows[y] = (png_bytep) (tempBuffer + (width << 2) * y);
|
||||
|
||||
bool crashed = false;
|
||||
|
||||
try
|
||||
{
|
||||
png_read_image (pngReadStruct, rows);
|
||||
png_read_end (pngReadStruct, pngInfoStruct);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
crashed = true;
|
||||
}
|
||||
|
||||
juce_free (rows);
|
||||
png_destroy_read_struct (&pngReadStruct, &pngInfoStruct, 0);
|
||||
|
||||
if (crashed)
|
||||
return 0;
|
||||
|
||||
// now convert the data to a juce image format..
|
||||
image = new Image (hasAlphaChan ? Image::ARGB : Image::RGB,
|
||||
width, height, hasAlphaChan);
|
||||
|
||||
int stride, pixelStride;
|
||||
uint8* const pixels = image->lockPixelDataReadWrite (0, 0, width, height, stride, pixelStride);
|
||||
uint8* srcRow = tempBuffer;
|
||||
uint8* destRow = pixels;
|
||||
|
||||
for (y = 0; y < (int) height; ++y)
|
||||
{
|
||||
const uint8* src = srcRow;
|
||||
srcRow += (width << 2);
|
||||
uint8* dest = destRow;
|
||||
destRow += stride;
|
||||
|
||||
if (hasAlphaChan)
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
((PixelARGB*) dest)->setARGB (src[3], src[0], src[1], src[2]);
|
||||
((PixelARGB*) dest)->premultiply();
|
||||
dest += pixelStride;
|
||||
src += 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
((PixelRGB*) dest)->setARGB (0, src[0], src[1], src[2]);
|
||||
dest += pixelStride;
|
||||
src += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
image->releasePixelDataReadWrite (pixels);
|
||||
juce_free (tempBuffer);
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
static void pngWriteDataCallback (png_structp png_ptr, png_bytep data, png_size_t length) throw()
|
||||
{
|
||||
OutputStream* const out = (OutputStream*) png_ptr->io_ptr;
|
||||
|
||||
const bool ok = out->write (data, length);
|
||||
|
||||
(void) ok;
|
||||
jassert (ok);
|
||||
}
|
||||
|
||||
bool juce_writePNGImageToStream (const Image& image, OutputStream& out) throw()
|
||||
{
|
||||
const int width = image.getWidth();
|
||||
const int height = image.getHeight();
|
||||
|
||||
png_structp pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
|
||||
|
||||
if (pngWriteStruct == 0)
|
||||
return false;
|
||||
|
||||
png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct);
|
||||
|
||||
if (pngInfoStruct == 0)
|
||||
{
|
||||
png_destroy_write_struct (&pngWriteStruct, (png_infopp) 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
png_set_write_fn (pngWriteStruct, &out, pngWriteDataCallback, 0);
|
||||
|
||||
png_set_IHDR (pngWriteStruct, pngInfoStruct, width, height, 8,
|
||||
image.hasAlphaChannel() ? PNG_COLOR_TYPE_RGB_ALPHA
|
||||
: PNG_COLOR_TYPE_RGB,
|
||||
PNG_INTERLACE_NONE,
|
||||
PNG_COMPRESSION_TYPE_BASE,
|
||||
PNG_FILTER_TYPE_BASE);
|
||||
|
||||
png_bytep rowData = (png_bytep) juce_malloc (width * 4 * sizeof (png_byte));
|
||||
|
||||
png_color_8 sig_bit;
|
||||
sig_bit.red = 8;
|
||||
sig_bit.green = 8;
|
||||
sig_bit.blue = 8;
|
||||
sig_bit.alpha = 8;
|
||||
png_set_sBIT (pngWriteStruct, pngInfoStruct, &sig_bit);
|
||||
|
||||
png_write_info (pngWriteStruct, pngInfoStruct);
|
||||
|
||||
png_set_shift (pngWriteStruct, &sig_bit);
|
||||
png_set_packing (pngWriteStruct);
|
||||
|
||||
for (int y = 0; y < height; ++y)
|
||||
{
|
||||
uint8* dst = (uint8*) rowData;
|
||||
int stride, pixelStride;
|
||||
const uint8* pixels = image.lockPixelDataReadOnly (0, y, width, 1, stride, pixelStride);
|
||||
const uint8* src = pixels;
|
||||
|
||||
if (image.hasAlphaChannel())
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
PixelARGB p (*(const PixelARGB*) src);
|
||||
p.unpremultiply();
|
||||
|
||||
*dst++ = p.getRed();
|
||||
*dst++ = p.getGreen();
|
||||
*dst++ = p.getBlue();
|
||||
*dst++ = p.getAlpha();
|
||||
src += pixelStride;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
*dst++ = ((const PixelRGB*) src)->getRed();
|
||||
*dst++ = ((const PixelRGB*) src)->getGreen();
|
||||
*dst++ = ((const PixelRGB*) src)->getBlue();
|
||||
src += pixelStride;
|
||||
}
|
||||
}
|
||||
|
||||
png_write_rows (pngWriteStruct, &rowData, 1);
|
||||
image.releasePixelDataReadOnly (pixels);
|
||||
}
|
||||
|
||||
juce_free (rowData);
|
||||
|
||||
png_write_end (pngWriteStruct, pngInfoStruct);
|
||||
png_destroy_write_struct (&pngWriteStruct, &pngInfoStruct);
|
||||
|
||||
out.flush();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../../../../../juce_core/basics/juce_StandardHeader.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable: 4390 4611)
|
||||
#endif
|
||||
|
||||
namespace zlibNamespace
|
||||
{
|
||||
#undef OS_CODE
|
||||
#undef fdopen
|
||||
#include "../../../../../juce_core/io/streams/zlib/zlib.h"
|
||||
#undef OS_CODE
|
||||
}
|
||||
|
||||
namespace pnglibNamespace
|
||||
{
|
||||
using namespace zlibNamespace;
|
||||
using ::malloc;
|
||||
using ::free;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
using ::abs;
|
||||
#define PNG_INTERNAL
|
||||
#define NO_DUMMY_DECL
|
||||
#define PNG_SETJMP_NOT_SUPPORTED
|
||||
|
||||
#include "pnglib/png.h"
|
||||
#include "pnglib/pngconf.h"
|
||||
|
||||
#define PNG_NO_EXTERN
|
||||
#include "pnglib/png.c"
|
||||
#include "pnglib/pngerror.c"
|
||||
#include "pnglib/pngget.c"
|
||||
#include "pnglib/pngmem.c"
|
||||
#include "pnglib/pngread.c"
|
||||
#include "pnglib/pngpread.c"
|
||||
#include "pnglib/pngrio.c"
|
||||
#include "pnglib/pngrtran.c"
|
||||
#include "pnglib/pngrutil.c"
|
||||
#include "pnglib/pngset.c"
|
||||
#include "pnglib/pngtrans.c"
|
||||
#include "pnglib/pngwio.c"
|
||||
#include "pnglib/pngwrite.c"
|
||||
#include "pnglib/pngwtran.c"
|
||||
#include "pnglib/pngwutil.c"
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
|
||||
#include "../juce_Image.h"
|
||||
#include "../../../../../juce_core/io/juce_InputStream.h"
|
||||
#include "../../../../../juce_core/io/juce_OutputStream.h"
|
||||
#include "../../colour/juce_PixelFormats.h"
|
||||
|
||||
using namespace pnglibNamespace;
|
||||
using ::malloc;
|
||||
using ::free;
|
||||
|
||||
//==============================================================================
|
||||
static void pngReadCallback (png_structp pngReadStruct, png_bytep data, png_size_t length) throw()
|
||||
{
|
||||
InputStream* const in = (InputStream*) png_get_io_ptr (pngReadStruct);
|
||||
in->read (data, (int) length);
|
||||
}
|
||||
|
||||
struct PNGErrorStruct {};
|
||||
|
||||
static void pngErrorCallback (png_structp, png_const_charp)
|
||||
{
|
||||
throw PNGErrorStruct();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
Image* juce_loadPNGImageFromStream (InputStream& in) throw()
|
||||
{
|
||||
Image* image = 0;
|
||||
|
||||
png_structp pngReadStruct;
|
||||
png_infop pngInfoStruct;
|
||||
|
||||
pngReadStruct = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
|
||||
|
||||
if (pngReadStruct != 0)
|
||||
{
|
||||
pngInfoStruct = png_create_info_struct (pngReadStruct);
|
||||
|
||||
if (pngInfoStruct == 0)
|
||||
{
|
||||
png_destroy_read_struct (&pngReadStruct, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
png_set_error_fn (pngReadStruct, 0, pngErrorCallback, pngErrorCallback);
|
||||
|
||||
// read the header..
|
||||
png_set_read_fn (pngReadStruct, &in, pngReadCallback);
|
||||
|
||||
png_uint_32 width, height;
|
||||
int bitDepth, colorType, interlaceType;
|
||||
|
||||
try
|
||||
{
|
||||
png_read_info (pngReadStruct, pngInfoStruct);
|
||||
|
||||
png_get_IHDR (pngReadStruct, pngInfoStruct,
|
||||
&width, &height,
|
||||
&bitDepth, &colorType,
|
||||
&interlaceType, 0, 0);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
png_destroy_read_struct (&pngReadStruct, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bitDepth == 16)
|
||||
png_set_strip_16 (pngReadStruct);
|
||||
|
||||
if (colorType == PNG_COLOR_TYPE_PALETTE)
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (bitDepth < 8)
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (png_get_valid (pngReadStruct, pngInfoStruct, PNG_INFO_tRNS))
|
||||
png_set_expand (pngReadStruct);
|
||||
|
||||
if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb (pngReadStruct);
|
||||
|
||||
png_set_add_alpha (pngReadStruct, 0xff, PNG_FILLER_AFTER);
|
||||
|
||||
const bool hasAlphaChan = (colorType & PNG_COLOR_MASK_ALPHA) != 0
|
||||
|| pngInfoStruct->num_trans > 0;
|
||||
|
||||
// Load the image into a temp buffer in the pnglib format..
|
||||
uint8* const tempBuffer = (uint8*) juce_malloc (height * (width << 2));
|
||||
|
||||
png_bytepp rows = (png_bytepp) juce_malloc (sizeof (png_bytep) * height);
|
||||
int y;
|
||||
for (y = (int) height; --y >= 0;)
|
||||
rows[y] = (png_bytep) (tempBuffer + (width << 2) * y);
|
||||
|
||||
bool crashed = false;
|
||||
|
||||
try
|
||||
{
|
||||
png_read_image (pngReadStruct, rows);
|
||||
png_read_end (pngReadStruct, pngInfoStruct);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
crashed = true;
|
||||
}
|
||||
|
||||
juce_free (rows);
|
||||
png_destroy_read_struct (&pngReadStruct, &pngInfoStruct, 0);
|
||||
|
||||
if (crashed)
|
||||
return 0;
|
||||
|
||||
// now convert the data to a juce image format..
|
||||
image = new Image (hasAlphaChan ? Image::ARGB : Image::RGB,
|
||||
width, height, hasAlphaChan);
|
||||
|
||||
int stride, pixelStride;
|
||||
uint8* const pixels = image->lockPixelDataReadWrite (0, 0, width, height, stride, pixelStride);
|
||||
uint8* srcRow = tempBuffer;
|
||||
uint8* destRow = pixels;
|
||||
|
||||
for (y = 0; y < (int) height; ++y)
|
||||
{
|
||||
const uint8* src = srcRow;
|
||||
srcRow += (width << 2);
|
||||
uint8* dest = destRow;
|
||||
destRow += stride;
|
||||
|
||||
if (hasAlphaChan)
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
((PixelARGB*) dest)->setARGB (src[3], src[0], src[1], src[2]);
|
||||
((PixelARGB*) dest)->premultiply();
|
||||
dest += pixelStride;
|
||||
src += 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
((PixelRGB*) dest)->setARGB (0, src[0], src[1], src[2]);
|
||||
dest += pixelStride;
|
||||
src += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
image->releasePixelDataReadWrite (pixels);
|
||||
juce_free (tempBuffer);
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
static void pngWriteDataCallback (png_structp png_ptr, png_bytep data, png_size_t length) throw()
|
||||
{
|
||||
OutputStream* const out = (OutputStream*) png_ptr->io_ptr;
|
||||
|
||||
const bool ok = out->write (data, length);
|
||||
|
||||
(void) ok;
|
||||
jassert (ok);
|
||||
}
|
||||
|
||||
bool juce_writePNGImageToStream (const Image& image, OutputStream& out) throw()
|
||||
{
|
||||
const int width = image.getWidth();
|
||||
const int height = image.getHeight();
|
||||
|
||||
png_structp pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
|
||||
|
||||
if (pngWriteStruct == 0)
|
||||
return false;
|
||||
|
||||
png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct);
|
||||
|
||||
if (pngInfoStruct == 0)
|
||||
{
|
||||
png_destroy_write_struct (&pngWriteStruct, (png_infopp) 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
png_set_write_fn (pngWriteStruct, &out, pngWriteDataCallback, 0);
|
||||
|
||||
png_set_IHDR (pngWriteStruct, pngInfoStruct, width, height, 8,
|
||||
image.hasAlphaChannel() ? PNG_COLOR_TYPE_RGB_ALPHA
|
||||
: PNG_COLOR_TYPE_RGB,
|
||||
PNG_INTERLACE_NONE,
|
||||
PNG_COMPRESSION_TYPE_BASE,
|
||||
PNG_FILTER_TYPE_BASE);
|
||||
|
||||
png_bytep rowData = (png_bytep) juce_malloc (width * 4 * sizeof (png_byte));
|
||||
|
||||
png_color_8 sig_bit;
|
||||
sig_bit.red = 8;
|
||||
sig_bit.green = 8;
|
||||
sig_bit.blue = 8;
|
||||
sig_bit.alpha = 8;
|
||||
png_set_sBIT (pngWriteStruct, pngInfoStruct, &sig_bit);
|
||||
|
||||
png_write_info (pngWriteStruct, pngInfoStruct);
|
||||
|
||||
png_set_shift (pngWriteStruct, &sig_bit);
|
||||
png_set_packing (pngWriteStruct);
|
||||
|
||||
for (int y = 0; y < height; ++y)
|
||||
{
|
||||
uint8* dst = (uint8*) rowData;
|
||||
int stride, pixelStride;
|
||||
const uint8* pixels = image.lockPixelDataReadOnly (0, y, width, 1, stride, pixelStride);
|
||||
const uint8* src = pixels;
|
||||
|
||||
if (image.hasAlphaChannel())
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
PixelARGB p (*(const PixelARGB*) src);
|
||||
p.unpremultiply();
|
||||
|
||||
*dst++ = p.getRed();
|
||||
*dst++ = p.getGreen();
|
||||
*dst++ = p.getBlue();
|
||||
*dst++ = p.getAlpha();
|
||||
src += pixelStride;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = width; --i >= 0;)
|
||||
{
|
||||
*dst++ = ((const PixelRGB*) src)->getRed();
|
||||
*dst++ = ((const PixelRGB*) src)->getGreen();
|
||||
*dst++ = ((const PixelRGB*) src)->getBlue();
|
||||
src += pixelStride;
|
||||
}
|
||||
}
|
||||
|
||||
png_write_rows (pngWriteStruct, &rowData, 1);
|
||||
image.releasePixelDataReadOnly (pixels);
|
||||
}
|
||||
|
||||
juce_free (rowData);
|
||||
|
||||
png_write_end (pngWriteStruct, pngInfoStruct);
|
||||
png_destroy_write_struct (&pngWriteStruct, &pngInfoStruct);
|
||||
|
||||
out.flush();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ class JUCE_API BlowFish
|
|||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates an object that can encode/decode based on the specified key.
|
||||
|
||||
/** Creates an object that can encode/decode based on the specified key.
|
||||
|
||||
The key data can be up to 72 bytes long.
|
||||
*/
|
||||
BlowFish (const uint8* keyData, int keyBytes);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ void* juce_findFileStart (const String& directory, const String& wildCard, Strin
|
|||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
Time* modTime, Time* creationTime, bool* isReadOnly) throw();
|
||||
bool juce_findFileNext (void* handle, String& resultFile,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
Time* modTime, Time* creationTime, bool* isReadOnly) throw();
|
||||
void juce_findFileClose (void* handle) throw();
|
||||
|
||||
|
|
|
|||
|
|
@ -86,12 +86,12 @@ const String juce_getVolumeLabel (const String& filenameOnVolume, int& volumeSer
|
|||
// juce_firstResultFile gets the name of the file (not the whole pathname) and
|
||||
// the other pointers, if non-null, are set based on the properties of the file.
|
||||
void* juce_findFileStart (const String& directory, const String& wildCard, String& firstResultFile,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize, Time* modTime,
|
||||
Time* creationTime, bool* isReadOnly) throw();
|
||||
|
||||
// returns false when no more files are found
|
||||
bool juce_findFileNext (void* handle, String& resultFile,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
bool* isDirectory, bool* isHidden, int64* fileSize,
|
||||
Time* modTime, Time* creationTime, bool* isReadOnly) throw();
|
||||
|
||||
void juce_findFileClose (void* handle) throw();
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ public:
|
|||
createHeadersAndPostData (url);
|
||||
|
||||
headers += extraHeaders;
|
||||
|
||||
|
||||
if (! headers.endsWithChar (T('\n')))
|
||||
headers << "\r\n";
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ const char inflate_copyright[] =
|
|||
table index bits. It will differ if the request is greater than the
|
||||
longest code or if it is less than the shortest code.
|
||||
*/
|
||||
int inflate_table (codetype type,
|
||||
unsigned short FAR *lens,
|
||||
unsigned codes,
|
||||
int inflate_table (codetype type,
|
||||
unsigned short FAR *lens,
|
||||
unsigned codes,
|
||||
code FAR * FAR *table,
|
||||
unsigned FAR *bits,
|
||||
unsigned short FAR *work)
|
||||
|
|
|
|||
|
|
@ -1167,7 +1167,7 @@ local void bi_windup (deflate_state *s)
|
|||
* Copy a stored block, storing first the length and its
|
||||
* one's complement if requested.
|
||||
*/
|
||||
local void copy_block(deflate_state *s,
|
||||
local void copy_block(deflate_state *s,
|
||||
charf *buf, /* the input data */
|
||||
unsigned len, /* its length */
|
||||
int header) /* true if block header must be written */
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ public:
|
|||
|
||||
char buffer [30];
|
||||
|
||||
if (inputStream != 0
|
||||
if (inputStream != 0
|
||||
&& inputStream->setPosition (zei.streamOffset)
|
||||
&& inputStream->read (buffer, 30) == 30
|
||||
&& littleEndianInt (buffer) == 0x04034b50)
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ public:
|
|||
ZipFile (const File& file);
|
||||
|
||||
/** Creates a ZipFile for an input source.
|
||||
|
||||
|
||||
The inputSource object will be owned by the zip file, which will delete
|
||||
it later when not needed.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -728,7 +728,7 @@ public:
|
|||
This will replace the contents of the string with the output of this
|
||||
formatted printf.
|
||||
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
this may expect differect encodings on different platforms.
|
||||
|
||||
@see formatted
|
||||
|
|
@ -740,7 +740,7 @@ public:
|
|||
This will return a string which is the result of a sprintf using the
|
||||
arguments passed-in.
|
||||
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
this may expect differect encodings on different platforms.
|
||||
|
||||
@see printf, vprintf
|
||||
|
|
@ -753,7 +753,7 @@ public:
|
|||
formatted printf. Used by other methods, this is public in case it's
|
||||
useful for other purposes where you want to pass a va_list through directly.
|
||||
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
Note that using the %s token with a juce string is probably a bad idea, as
|
||||
this may expect differect encodings on different platforms.
|
||||
|
||||
@see printf, formatted
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue