| @@ -557,6 +557,7 @@ public: | |||
| bufferSpace.setSize (2, 16); | |||
| midiEvents.clear(); | |||
| incomingEvents.clear(); | |||
| prepared = false; | |||
| } | |||
| @@ -591,6 +592,7 @@ public: | |||
| GetMaxFramesPerSlice()); | |||
| midiEvents.clear(); | |||
| incomingEvents.clear(); | |||
| juce_free (channels); | |||
| channels = (float**) juce_calloc (sizeof (float*) * jmax (juceFilter->getNumInputChannels(), | |||
| @@ -699,6 +701,12 @@ public: | |||
| break; | |||
| } | |||
| { | |||
| const ScopedLock sl (incomingMidiLock); | |||
| midiEvents.clear(); | |||
| incomingEvents.swap (midiEvents); | |||
| } | |||
| { | |||
| AudioSampleBuffer buffer (channels, jmax (numIn, numOut), numSamples); | |||
| @@ -784,12 +792,13 @@ protected: | |||
| #endif | |||
| { | |||
| #if JucePlugin_WantsMidiInput | |||
| const ScopedLock sl (incomingMidiLock); | |||
| JUCE_NAMESPACE::uint8 data [4]; | |||
| data[0] = nStatus | inChannel; | |||
| data[1] = inData1; | |||
| data[2] = inData2; | |||
| midiEvents.addEvent (data, 3, inStartFrame); | |||
| incomingEvents.addEvent (data, 3, inStartFrame); | |||
| #endif | |||
| return noErr; | |||
| @@ -798,7 +807,8 @@ protected: | |||
| OSStatus HandleSysEx (const UInt8* inData, UInt32 inLength) | |||
| { | |||
| #if JucePlugin_WantsMidiInput | |||
| midiEvents.addEvent (inData, inLength, 0); | |||
| const ScopedLock sl (incomingMidiLock); | |||
| incomingEvents.addEvent (inData, inLength, 0); | |||
| #endif | |||
| return noErr; | |||
| } | |||
| @@ -866,12 +876,13 @@ private: | |||
| AudioProcessor* juceFilter; | |||
| AudioSampleBuffer bufferSpace; | |||
| float** channels; | |||
| MidiBuffer midiEvents; | |||
| MidiBuffer midiEvents, incomingEvents; | |||
| bool prepared; | |||
| SMPTETime lastSMPTETime; | |||
| AUChannelInfo channelInfo [numChannelConfigs]; | |||
| AudioUnitEvent auEvent; | |||
| mutable MemoryBlock presetsArray; | |||
| CriticalSection incomingMidiLock; | |||
| }; | |||
| //============================================================================== | |||
| @@ -3785,6 +3785,12 @@ const var var::call (const var::identifier& method, const var& arg1, const var& | |||
| return invoke (method, args, 4); | |||
| } | |||
| const var var::call (const var::identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const | |||
| { | |||
| var args[] = { arg1, arg2, arg3, arg4, arg5 }; | |||
| return invoke (method, args, 5); | |||
| } | |||
| var::identifier::identifier (const String& name_) throw() | |||
| : name (name_), | |||
| hashCode (name_.hashCode()) | |||
| @@ -8265,12 +8271,8 @@ const String URL::addEscapeChars (const String& s, const bool isParameter) | |||
| { | |||
| const char c = *utf8++; | |||
| if (c == ' ') | |||
| { | |||
| result += T('+'); | |||
| } | |||
| else if (CharacterFunctions::isLetterOrDigit (c) | |||
| || CharacterFunctions::indexOfChar (legalChars, c, false) >= 0) | |||
| if (CharacterFunctions::isLetterOrDigit (c) | |||
| || CharacterFunctions::indexOfChar (legalChars, c, false) >= 0) | |||
| { | |||
| result << c; | |||
| } | |||
| @@ -23472,7 +23474,7 @@ void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, | |||
| // this needs to be a value in the future - RTFM for this method! | |||
| jassert (millisecondCounterToStartAt > 0); | |||
| samplesPerSecondForBuffer *= 0.001; | |||
| const double timeScaleFactor = 1000.0 / samplesPerSecondForBuffer; | |||
| MidiBuffer::Iterator i (buffer); | |||
| @@ -23481,7 +23483,7 @@ void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, | |||
| while (i.getNextEvent (data, len, time)) | |||
| { | |||
| const double eventTime = millisecondCounterToStartAt + samplesPerSecondForBuffer * time; | |||
| const double eventTime = millisecondCounterToStartAt + timeScaleFactor * time; | |||
| PendingMessage* const m | |||
| = new PendingMessage (data, len, eventTime); | |||
| @@ -24223,15 +24225,6 @@ AudioSampleBuffer::~AudioSampleBuffer() throw() | |||
| juce_free (channels); | |||
| } | |||
| float* AudioSampleBuffer::getSampleData (const int channelNumber, | |||
| const int sampleOffset) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| jassert (((unsigned int) sampleOffset) < (unsigned int) size); | |||
| return channels [channelNumber] + sampleOffset; | |||
| } | |||
| void AudioSampleBuffer::setSize (const int newNumChannels, | |||
| const int newNumSamples, | |||
| const bool keepExistingContent, | |||
| @@ -25053,6 +25046,13 @@ const MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) throw() | |||
| return *this; | |||
| } | |||
| void MidiBuffer::swap (MidiBuffer& other) | |||
| { | |||
| swapVariables <uint8*> (this->elements, other.elements); | |||
| swapVariables <int> (this->numAllocated, other.numAllocated); | |||
| swapVariables <int> (this->bytesUsed, other.bytesUsed); | |||
| } | |||
| MidiBuffer::~MidiBuffer() throw() | |||
| { | |||
| } | |||
| @@ -11454,6 +11454,8 @@ public: | |||
| const var call (const identifier& method, const var& arg1, const var& arg2, const var& arg3); | |||
| /** If this variant is an object, this invokes one of its methods with 4 arguments. */ | |||
| const var call (const identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; | |||
| /** If this variant is an object, this invokes one of its methods with 5 arguments. */ | |||
| const var call (const identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; | |||
| /** If this variant is an object, this invokes one of its methods with a list of arguments. */ | |||
| const var invoke (const identifier& method, const var* arguments, int numArguments) const; | |||
| @@ -26057,6 +26059,13 @@ public: | |||
| */ | |||
| int getLastEventTime() const throw(); | |||
| /** Exchanges the contents of this buffer with another one. | |||
| This is a quick operation, because no memory allocating or copying is done, it | |||
| just swaps the internal state of the two buffers. | |||
| */ | |||
| void swap (MidiBuffer& other); | |||
| /** | |||
| Used to iterate through the events in a MidiBuffer. | |||
| @@ -27110,13 +27119,29 @@ public: | |||
| */ | |||
| int getNumSamples() const throw() { return size; } | |||
| /** Returns a pointer one of the buffer's channels. | |||
| For speed, this doesn't check whether the channel number is out of range, | |||
| so be careful when using it! | |||
| */ | |||
| float* getSampleData (const int channelNumber) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| return channels [channelNumber]; | |||
| } | |||
| /** Returns a pointer to a sample in one of the buffer's channels. | |||
| For speed, this doesn't check whether the channel and sample number | |||
| are legal, so be careful when using it! | |||
| are out-of-range, so be careful when using it! | |||
| */ | |||
| float* getSampleData (const int channelNumber, | |||
| const int sampleOffset = 0) const throw(); | |||
| const int sampleOffset) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| jassert (((unsigned int) sampleOffset) < (unsigned int) size); | |||
| return channels [channelNumber] + sampleOffset; | |||
| } | |||
| /** Returns an array of pointers to the channels in the buffer. | |||
| @@ -63,7 +63,7 @@ void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, | |||
| // this needs to be a value in the future - RTFM for this method! | |||
| jassert (millisecondCounterToStartAt > 0); | |||
| samplesPerSecondForBuffer *= 0.001; | |||
| const double timeScaleFactor = 1000.0 / samplesPerSecondForBuffer; | |||
| MidiBuffer::Iterator i (buffer); | |||
| @@ -72,7 +72,7 @@ void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, | |||
| while (i.getNextEvent (data, len, time)) | |||
| { | |||
| const double eventTime = millisecondCounterToStartAt + samplesPerSecondForBuffer * time; | |||
| const double eventTime = millisecondCounterToStartAt + timeScaleFactor * time; | |||
| PendingMessage* const m | |||
| = new PendingMessage (data, len, eventTime); | |||
| @@ -169,15 +169,6 @@ AudioSampleBuffer::~AudioSampleBuffer() throw() | |||
| juce_free (channels); | |||
| } | |||
| float* AudioSampleBuffer::getSampleData (const int channelNumber, | |||
| const int sampleOffset) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| jassert (((unsigned int) sampleOffset) < (unsigned int) size); | |||
| return channels [channelNumber] + sampleOffset; | |||
| } | |||
| void AudioSampleBuffer::setSize (const int newNumChannels, | |||
| const int newNumSamples, | |||
| const bool keepExistingContent, | |||
| @@ -108,13 +108,29 @@ public: | |||
| */ | |||
| int getNumSamples() const throw() { return size; } | |||
| /** Returns a pointer one of the buffer's channels. | |||
| For speed, this doesn't check whether the channel number is out of range, | |||
| so be careful when using it! | |||
| */ | |||
| float* getSampleData (const int channelNumber) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| return channels [channelNumber]; | |||
| } | |||
| /** Returns a pointer to a sample in one of the buffer's channels. | |||
| For speed, this doesn't check whether the channel and sample number | |||
| are legal, so be careful when using it! | |||
| are out-of-range, so be careful when using it! | |||
| */ | |||
| float* getSampleData (const int channelNumber, | |||
| const int sampleOffset = 0) const throw(); | |||
| const int sampleOffset) const throw() | |||
| { | |||
| jassert (((unsigned int) channelNumber) < (unsigned int) numChannels); | |||
| jassert (((unsigned int) sampleOffset) < (unsigned int) size); | |||
| return channels [channelNumber] + sampleOffset; | |||
| } | |||
| /** Returns an array of pointers to the channels in the buffer. | |||
| @@ -72,6 +72,13 @@ const MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) throw() | |||
| return *this; | |||
| } | |||
| void MidiBuffer::swap (MidiBuffer& other) | |||
| { | |||
| swapVariables <uint8*> (this->elements, other.elements); | |||
| swapVariables <int> (this->numAllocated, other.numAllocated); | |||
| swapVariables <int> (this->bytesUsed, other.bytesUsed); | |||
| } | |||
| MidiBuffer::~MidiBuffer() throw() | |||
| { | |||
| } | |||
| @@ -155,6 +155,14 @@ public: | |||
| */ | |||
| int getLastEventTime() const throw(); | |||
| //============================================================================== | |||
| /** Exchanges the contents of this buffer with another one. | |||
| This is a quick operation, because no memory allocating or copying is done, it | |||
| just swaps the internal state of the two buffers. | |||
| */ | |||
| void swap (MidiBuffer& other); | |||
| //============================================================================== | |||
| /** | |||
| Used to iterate through the events in a MidiBuffer. | |||
| @@ -525,12 +525,8 @@ const String URL::addEscapeChars (const String& s, const bool isParameter) | |||
| { | |||
| const char c = *utf8++; | |||
| if (c == ' ') | |||
| { | |||
| result += T('+'); | |||
| } | |||
| else if (CharacterFunctions::isLetterOrDigit (c) | |||
| || CharacterFunctions::indexOfChar (legalChars, c, false) >= 0) | |||
| if (CharacterFunctions::isLetterOrDigit (c) | |||
| || CharacterFunctions::indexOfChar (legalChars, c, false) >= 0) | |||
| { | |||
| result << c; | |||
| } | |||