@@ -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. | |||
*/ | |||
@@ -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 | |||
@@ -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 | |||