void CodeDocument::setNewLineCharacters (const String& newLineChars_) noexcept { jassert (newLineChars_ == "\r\n" || newLineChars_ == "\n" || newLineChars_ == "\r"); newLineChars = newLineChars_; }
void RelativeCoordinatePositionerBase::componentBeingDeleted (Component& comp) { jassert (sourceComponents.contains (&comp)); sourceComponents.removeValue (&comp); registeredOk = false; }
dsp* FaustgenFactory::createDSPAux(FaustAudioPluginInstance* instance) { dsp* dsp = nullptr; std::string error; String logStr; // Factory already allocated if (fDSPfactory) { dsp = fDSPfactory->createDSPInstance(); logStr << "Factory already allocated, " << dsp->getNumInputs() << " input(s), " << dsp->getNumOutputs() << " output(s)"; goto end; } // Tries to create from bitcode if (fBitCode.length() > 0) { fDSPfactory = createFactoryFromBitcode(); if (fDSPfactory) { dsp = fDSPfactory->createDSPInstance(); logStr << "Compilation from bitcode succeeded, " << dsp->getNumInputs() << " input(s), " << dsp->getNumOutputs() << " output(s)"; goto end; } } // Otherwise tries to create from source code if (fSourceCode.length() > 0) { fDSPfactory = createFactoryFromSourceCode(instance); if (fDSPfactory) { dsp = fDSPfactory->createDSPInstance(); logStr << "Compilation from source code succeeded, " << dsp->getNumInputs() << " input(s), " << dsp->getNumOutputs() << " output(s)"; goto end; } } // Otherwise creates default DSP keeping the same input/output number fDSPfactory = createDSPFactoryFromString("default", DEFAULT_CODE, 0, 0, getTarget(), error, LLVM_OPTIMIZATION); jassert(fDSPfactory); if (fDSPfactory) { dsp = fDSPfactory->createDSPInstance(); logStr << "Allocation of default DSP succeeded, " << dsp->getNumInputs() << " input(s), " << dsp->getNumOutputs() << " output(s)"; } end: LOG(logStr); jassert(dsp); // Prepare JSON JSONUI builder(dsp->getNumInputs(), dsp->getNumOutputs()); dsp->metadata(&builder); dsp->buildUserInterface(&builder); fJSON = String(builder.JSON()); //LOG(fJSON); return dsp; }
ReadWriteLock::~ReadWriteLock() noexcept { jassert (readerThreads.size() == 0); jassert (numWriters == 0); }
//============================================================================== void Joystick::addListener (JoystickListener* const listener) { jassert (listener != 0); if (listener != 0) listeners.add (listener); }
int64 AudioFormatReader::searchForLevel (int64 startSample, int64 numSamplesToSearch, const double magnitudeRangeMinimum, const double magnitudeRangeMaximum, const int minimumConsecutiveSamples) { if (numSamplesToSearch == 0) return -1; const int bufferSize = 4096; HeapBlock<int> tempSpace (bufferSize * 2 + 64); int* tempBuffer[3]; tempBuffer[0] = tempSpace.getData(); tempBuffer[1] = tempSpace.getData() + bufferSize; tempBuffer[2] = 0; int consecutive = 0; int64 firstMatchPos = -1; jassert (magnitudeRangeMaximum > magnitudeRangeMinimum); const double doubleMin = jlimit (0.0, (double) std::numeric_limits<int>::max(), magnitudeRangeMinimum * std::numeric_limits<int>::max()); const double doubleMax = jlimit (doubleMin, (double) std::numeric_limits<int>::max(), magnitudeRangeMaximum * std::numeric_limits<int>::max()); const int intMagnitudeRangeMinimum = roundToInt (doubleMin); const int intMagnitudeRangeMaximum = roundToInt (doubleMax); while (numSamplesToSearch != 0) { const int numThisTime = (int) jmin (abs64 (numSamplesToSearch), (int64) bufferSize); int64 bufferStart = startSample; if (numSamplesToSearch < 0) bufferStart -= numThisTime; if (bufferStart >= (int) lengthInSamples) break; read (tempBuffer, 2, bufferStart, numThisTime, false); int num = numThisTime; while (--num >= 0) { if (numSamplesToSearch < 0) --startSample; bool matches = false; const int index = (int) (startSample - bufferStart); if (usesFloatingPointData) { const float sample1 = std::abs (((float*) tempBuffer[0]) [index]); if (sample1 >= magnitudeRangeMinimum && sample1 <= magnitudeRangeMaximum) { matches = true; } else if (numChannels > 1) { const float sample2 = std::abs (((float*) tempBuffer[1]) [index]); matches = (sample2 >= magnitudeRangeMinimum && sample2 <= magnitudeRangeMaximum); } } else { const int sample1 = abs (tempBuffer[0] [index]); if (sample1 >= intMagnitudeRangeMinimum && sample1 <= intMagnitudeRangeMaximum) { matches = true; } else if (numChannels > 1) { const int sample2 = abs (tempBuffer[1][index]); matches = (sample2 >= intMagnitudeRangeMinimum && sample2 <= intMagnitudeRangeMaximum); } } if (matches) { if (firstMatchPos < 0) firstMatchPos = startSample; if (++consecutive >= minimumConsecutiveSamples) { if (firstMatchPos < 0 || firstMatchPos >= lengthInSamples) return -1; return firstMatchPos; } } else { consecutive = 0; firstMatchPos = -1; } if (numSamplesToSearch > 0) ++startSample; } if (numSamplesToSearch > 0) numSamplesToSearch -= numThisTime; else numSamplesToSearch += numThisTime; } return -1; }
void ColourGradient::removeColour (int index) { jassert (index > 0 && index < colours.size() - 1); colours.remove (index); }
MPESynthesiserVoice* MPESynthesiser::findVoiceToSteal (MPENote noteToStealVoiceFor) const { // This voice-stealing algorithm applies the following heuristics: // - Re-use the oldest notes first // - Protect the lowest & topmost notes, even if sustained, but not if they've been released. // apparently you are trying to render audio without having any voices... jassert (voices.size() > 0); // These are the voices we want to protect (ie: only steal if unavoidable) MPESynthesiserVoice* low = nullptr; // Lowest sounding note, might be sustained, but NOT in release phase MPESynthesiserVoice* top = nullptr; // Highest sounding note, might be sustained, but NOT in release phase // this is a list of voices we can steal, sorted by how long they've been running Array<MPESynthesiserVoice*> usableVoices; usableVoices.ensureStorageAllocated (voices.size()); for (int i = 0; i < voices.size(); ++i) { MPESynthesiserVoice* const voice = voices.getUnchecked (i); jassert (voice->isActive()); // We wouldn't be here otherwise MPEVoiceAgeSorter sorter; usableVoices.addSorted (sorter, voice); if (! voice->isPlayingButReleased()) // Don't protect released notes { const int noteNumber = voice->getCurrentlyPlayingNote().initialNote; if (low == nullptr || noteNumber < low->getCurrentlyPlayingNote().initialNote) low = voice; if (top == nullptr || noteNumber > top->getCurrentlyPlayingNote().initialNote) top = voice; } } // Eliminate pathological cases (ie: only 1 note playing): we always give precedence to the lowest note(s) if (top == low) top = nullptr; const int numUsableVoices = usableVoices.size(); // If we want to re-use the voice to trigger a new note, // then The oldest note that's playing the same note number is ideal. if (noteToStealVoiceFor.isValid()) { for (int i = 0; i < numUsableVoices; ++i) { MPESynthesiserVoice* const voice = usableVoices.getUnchecked (i); if (voice->getCurrentlyPlayingNote().initialNote == noteToStealVoiceFor.initialNote) return voice; } } // Oldest voice that has been released (no finger on it and not held by sustain pedal) for (int i = 0; i < numUsableVoices; ++i) { MPESynthesiserVoice* const voice = usableVoices.getUnchecked (i); if (voice != low && voice != top && voice->isPlayingButReleased()) return voice; } // Oldest voice that doesn't have a finger on it: for (int i = 0; i < numUsableVoices; ++i) { MPESynthesiserVoice* const voice = usableVoices.getUnchecked (i); if (voice != low && voice != top && voice->getCurrentlyPlayingNote().keyState != MPENote::keyDown && voice->getCurrentlyPlayingNote().keyState != MPENote::keyDownAndSustained) return voice; } // Oldest voice that isn't protected for (int i = 0; i < numUsableVoices; ++i) { MPESynthesiserVoice* const voice = usableVoices.getUnchecked (i); if (voice != low && voice != top) return voice; } // We've only got "protected" voices now: lowest note takes priority jassert (low != nullptr); // Duophonic synth: give priority to the bass note: if (top != nullptr) return top; return low; }
//============================================================================== void MPESynthesiser::startVoice (MPESynthesiserVoice* voice, MPENote noteToStart) { jassert (voice != nullptr); voice->currentlyPlayingNote = noteToStart; voice->noteStarted(); }
void Project::Item::setFile (const RelativePath& file) { jassert (isFile()); state.setProperty (Ids::file, file.toUnixStyle(), getUndoManager()); state.setProperty (Ids::name, file.getFileName(), getUndoManager()); }
ProjectExporter* Project::createExporter (int index) { jassert (index >= 0 && index < getNumExporters()); return ProjectExporter::createExporter (*this, getExporters().getChild (index)); }
void Project::Item::setFile (const File& file) { setFile (RelativePath (project.getRelativePathForFile (file), RelativePath::projectFolder)); jassert (getFile() == file); }
void CodeDocument::remove (const int startPos, const int endPos, const bool undoable) { if (endPos <= startPos) return; if (undoable) { undoManager.perform (new CodeDocumentDeleteAction (*this, startPos, endPos)); } else { Position startPosition (this, startPos); Position endPosition (this, endPos); maximumLineLength = -1; const int firstAffectedLine = startPosition.getLineNumber(); const int endLine = endPosition.getLineNumber(); int lastAffectedLine = firstAffectedLine + 1; CodeDocumentLine* const firstLine = lines.getUnchecked (firstAffectedLine); if (firstAffectedLine == endLine) { firstLine->line = firstLine->line.substring (0, startPosition.getIndexInLine()) + firstLine->line.substring (endPosition.getIndexInLine()); firstLine->updateLength(); } else { lastAffectedLine = lines.size(); CodeDocumentLine* const lastLine = lines.getUnchecked (endLine); jassert (lastLine != nullptr); firstLine->line = firstLine->line.substring (0, startPosition.getIndexInLine()) + lastLine->line.substring (endPosition.getIndexInLine()); firstLine->updateLength(); int numLinesToRemove = endLine - firstAffectedLine; lines.removeRange (firstAffectedLine + 1, numLinesToRemove); } int i; for (i = firstAffectedLine + 1; i < lines.size(); ++i) { CodeDocumentLine* const l = lines.getUnchecked (i); const CodeDocumentLine* const previousLine = lines.getUnchecked (i - 1); l->lineStartInFile = previousLine->lineStartInFile + previousLine->lineLength; } checkLastLineStatus(); const int totalChars = getNumCharacters(); for (i = 0; i < positionsToMaintain.size(); ++i) { CodeDocument::Position* p = positionsToMaintain.getUnchecked(i); if (p->getPosition() > startPosition.getPosition()) p->setPosition (jmax (startPos, p->getPosition() + startPos - endPos)); if (p->getPosition() > totalChars) p->setPosition (totalChars); } sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); } }
void CodeDocument::insert (const String& text, const int insertPos, const bool undoable) { if (text.isEmpty()) return; if (undoable) { undoManager.perform (new CodeDocumentInsertAction (*this, text, insertPos)); } else { Position pos (this, insertPos); const int firstAffectedLine = pos.getLineNumber(); int lastAffectedLine = firstAffectedLine + 1; CodeDocumentLine* const firstLine = lines [firstAffectedLine]; String textInsideOriginalLine (text); if (firstLine != nullptr) { const int index = pos.getIndexInLine(); textInsideOriginalLine = firstLine->line.substring (0, index) + textInsideOriginalLine + firstLine->line.substring (index); } maximumLineLength = -1; Array <CodeDocumentLine*> newLines; CodeDocumentLine::createLines (newLines, textInsideOriginalLine); jassert (newLines.size() > 0); CodeDocumentLine* const newFirstLine = newLines.getUnchecked (0); newFirstLine->lineStartInFile = firstLine != nullptr ? firstLine->lineStartInFile : 0; lines.set (firstAffectedLine, newFirstLine); if (newLines.size() > 1) { for (int i = 1; i < newLines.size(); ++i) { CodeDocumentLine* const l = newLines.getUnchecked (i); lines.insert (firstAffectedLine + i, l); } lastAffectedLine = lines.size(); } int i, lineStart = newFirstLine->lineStartInFile; for (i = firstAffectedLine; i < lines.size(); ++i) { CodeDocumentLine* const l = lines.getUnchecked (i); l->lineStartInFile = lineStart; lineStart += l->lineLength; } checkLastLineStatus(); const int newTextLength = text.length(); for (i = 0; i < positionsToMaintain.size(); ++i) { CodeDocument::Position* const p = positionsToMaintain.getUnchecked(i); if (p->getPosition() >= insertPos) p->setPosition (p->getPosition() + newTextLength); } sendListenerChangeMessage (firstAffectedLine, lastAffectedLine); } }
void* getUser32Function (const char* functionName) { HMODULE module = GetModuleHandleA ("user32.dll"); jassert (module != 0); return (void*) GetProcAddress (module, functionName); }
void MPESynthesiser::stopVoice (MPESynthesiserVoice* voice, MPENote noteToStop, bool allowTailOff) { jassert (voice != nullptr); voice->currentlyPlayingNote = noteToStop; voice->noteStopped (allowTailOff); }
//============================================================================== void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChannelData, const int numInputChannels, float** const outputChannelData, const int numOutputChannels, const int numSamples) { // these should have been prepared by audioDeviceAboutToStart()... jassert (sampleRate > 0 && blockSize > 0); incomingMidi.clear(); messageCollector.removeNextBlockOfMessages (incomingMidi, numSamples); int totalNumChans = 0; if (numInputChannels > numOutputChannels) { // if there aren't enough output channels for the number of // inputs, we need to create some temporary extra ones (can't // use the input data in case it gets written to) tempBuffer.setSize (numInputChannels - numOutputChannels, numSamples, false, false, true); for (int i = 0; i < numOutputChannels; ++i) { channels[totalNumChans] = outputChannelData[i]; memcpy (channels[totalNumChans], inputChannelData[i], sizeof (float) * (size_t) numSamples); ++totalNumChans; } for (int i = numOutputChannels; i < numInputChannels; ++i) { channels[totalNumChans] = tempBuffer.getSampleData (i - numOutputChannels, 0); memcpy (channels[totalNumChans], inputChannelData[i], sizeof (float) * (size_t) numSamples); ++totalNumChans; } } else { for (int i = 0; i < numInputChannels; ++i) { channels[totalNumChans] = outputChannelData[i]; memcpy (channels[totalNumChans], inputChannelData[i], sizeof (float) * (size_t) numSamples); ++totalNumChans; } for (int i = numInputChannels; i < numOutputChannels; ++i) { channels[totalNumChans] = outputChannelData[i]; zeromem (channels[totalNumChans], sizeof (float) * (size_t) numSamples); ++totalNumChans; } } AudioSampleBuffer buffer (channels, totalNumChans, numSamples); { const ScopedLock sl (lock); if (processor != nullptr) { const ScopedLock sl2 (processor->getCallbackLock()); if (! processor->isSuspended()) { processor->processBlock (buffer, incomingMidi); return; } } } for (int i = 0; i < numOutputChannels; ++i) FloatVectorOperations::clear (outputChannelData[i], numSamples); }
Logger::~Logger() { // You're deleting this logger while it's still being used! // Always call Logger::setCurrentLogger (nullptr) before deleting the active logger. jassert (currentLogger != this); }
bool AudioFormatReader::read (int* const* destSamples, int numDestChannels, int64 startSampleInSource, int numSamplesToRead, const bool fillLeftoverChannelsWithCopies) { jassert (numDestChannels > 0); // you have to actually give this some channels to work with! const size_t originalNumSamplesToRead = (size_t) numSamplesToRead; int startOffsetInDestBuffer = 0; if (startSampleInSource < 0) { const int silence = (int) jmin (-startSampleInSource, (int64) numSamplesToRead); for (int i = numDestChannels; --i >= 0;) if (destSamples[i] != nullptr) zeromem (destSamples[i], sizeof (int) * (size_t) silence); startOffsetInDestBuffer += silence; numSamplesToRead -= silence; startSampleInSource = 0; } if (numSamplesToRead <= 0) return true; if (! readSamples (const_cast<int**> (destSamples), jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer, startSampleInSource, numSamplesToRead)) return false; if (numDestChannels > (int) numChannels) { if (fillLeftoverChannelsWithCopies) { int* lastFullChannel = destSamples[0]; for (int i = (int) numChannels; --i > 0;) { if (destSamples[i] != nullptr) { lastFullChannel = destSamples[i]; break; } } if (lastFullChannel != nullptr) for (int i = (int) numChannels; i < numDestChannels; ++i) if (destSamples[i] != nullptr) memcpy (destSamples[i], lastFullChannel, sizeof (int) * originalNumSamplesToRead); } else { for (int i = (int) numChannels; i < numDestChannels; ++i) if (destSamples[i] != nullptr) zeromem (destSamples[i], sizeof (int) * originalNumSamplesToRead); } } return true; }
//in kSourceThread, FPoint p is the current location of the selected source, as read on the automation void SourceMover::move(FPoint pointXY01, MoverType mt) { if (mMoverType != mt){ return; } //move selected source to pointXY01 (and store in setOldSrcLocRT) only if not kSourceThread. In kSourceThread it is already being moved by automation if (mMoverType != kSourceThread){ mFilter->setSourceXY01(mSelectedSrc, pointXY01); mFilter->setOldSrcLocRT(mSelectedSrc, mFilter->convertXy012Rt(pointXY01)); if (!mField->isDestructed()){ //mField could be null when we're exiting while playing mField->updatePositionTrace(pointXY01.x, pointXY01.y); } } // if we're not in independent mode and have more than 1 source if (mFilter->getMovementMode() != 0 && mFilter->getNumberOfSources() > 1) { //calculate delta for selected source //in normal, non-source-thread mode, we calculate delta for selected source compared to its starting point FPoint oldSelSrcPosRT = (mMoverType == kSourceThread) ? mFilter->getOldSrcLocRT(mSelectedSrc) : mSourcesDownRT[mSelectedSrc]; FPoint newSelSrcPosRT = mFilter->getSourceRT(mSelectedSrc); //in kSourceThread, this will be the same as mFilter->convertXy012Rt(pointXY01) FPoint delSelSrcPosRT = newSelSrcPosRT - oldSelSrcPosRT; if (delSelSrcPosRT.isOrigin()){ return; //return if delta is null } float vxo = pointXY01.x, vyo = pointXY01.y; if (kSourceThread){ mFilter->setPreventSourceLocationUpdate(true); } for (int iCurSrc = 0; iCurSrc < mFilter->getNumberOfSources(); iCurSrc++) { if (iCurSrc == mSelectedSrc) { mFilter->setOldSrcLocRT(iCurSrc, newSelSrcPosRT); continue; } //all x's and y's here are actually r's and t's switch(mFilter->getMovementMode()) { case 1: // circular case 2: // circular, fixed radius case 3: // circular, fixed angle case 4:{ // circular, fully fixed //calculate new position for curSrc using delta for selected source FPoint oldCurSrcPosRT = (mMoverType == kSourceThread) ? mFilter->getOldSrcLocRT(iCurSrc) : mSourcesDownRT[iCurSrc]; FPoint newCurSrcPosRT = oldCurSrcPosRT + delSelSrcPosRT; if (newCurSrcPosRT.x < 0){ newCurSrcPosRT.x = 0; } if (newCurSrcPosRT.x > kRadiusMax){ newCurSrcPosRT.x = kRadiusMax; } if (newCurSrcPosRT.y < 0){ newCurSrcPosRT.y += kThetaMax; } if (newCurSrcPosRT.y > kThetaMax){ newCurSrcPosRT.y -= kThetaMax; } mFilter->setSourceRT(iCurSrc, newCurSrcPosRT, false); mFilter->setOldSrcLocRT(iCurSrc, newCurSrcPosRT); break; } case 5:{ // delta lock FPoint delSelSrcPosXY; if (mMoverType == kSourceThread){ delSelSrcPosXY = mFilter->convertRt2Xy(newSelSrcPosRT) - mFilter->convertRt2Xy(oldSelSrcPosRT); } else { delSelSrcPosXY = mFilter->getSourceXY(mSelectedSrc) - mSourcesDownXY[mSelectedSrc]; } //calculate new position for curSrc using delta for selected source FPoint oldCurSrcPosXY = (mMoverType == kSourceThread) ? mFilter->convertRt2Xy(mFilter->getOldSrcLocRT(iCurSrc)) : mSourcesDownXY[iCurSrc]; FPoint newCurSrcPosXY = oldCurSrcPosXY + delSelSrcPosXY; mFilter->setSourceXY(iCurSrc, newCurSrcPosXY, false); mFilter->setOldSrcLocRT(iCurSrc, mFilter->convertXy2Rt(newCurSrcPosXY, false)); break; } case 6: // sym x vyo = 1 - vyo; mFilter->setSourceXY01(iCurSrc, FPoint(vxo, vyo)); break; case 7: // sym y vxo = 1 - vxo; mFilter->setSourceXY01(iCurSrc, FPoint(vxo, vyo)); break; default: jassert(0); break; } } if (kSourceThread){ mFilter->setPreventSourceLocationUpdate(false); } } }
String ProjectTreeViewBase::getUniqueName() const { jassert (item.getID().isNotEmpty()); return item.getID(); }
JUCE_COMRESULT DrawGlyphRun (void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE, DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* runDescription, IUnknown* clientDrawingEffect) { TextLayout* const layout = static_cast<TextLayout*> (clientDrawingContext); if (baselineOriginY != lastOriginY) { lastOriginY = baselineOriginY; ++currentLine; if (currentLine >= layout->getNumLines()) { jassert (currentLine == layout->getNumLines()); TextLayout::Line* const newLine = new TextLayout::Line(); layout->addLine (newLine); newLine->lineOrigin = Point<float> (baselineOriginX, baselineOriginY); } } TextLayout::Line& glyphLine = layout->getLine (currentLine); DWRITE_FONT_METRICS dwFontMetrics; glyphRun->fontFace->GetMetrics (&dwFontMetrics); glyphLine.ascent = jmax (glyphLine.ascent, scaledFontSize (dwFontMetrics.ascent, dwFontMetrics, glyphRun)); glyphLine.descent = jmax (glyphLine.descent, scaledFontSize (dwFontMetrics.descent, dwFontMetrics, glyphRun)); String fontFamily, fontStyle; getFontFamilyAndStyle (glyphRun, fontFamily, fontStyle); TextLayout::Run* const glyphRunLayout = new TextLayout::Run (Range<int> (runDescription->textPosition, runDescription->textPosition + runDescription->stringLength), glyphRun->glyphCount); glyphLine.runs.add (glyphRunLayout); glyphRun->fontFace->GetMetrics (&dwFontMetrics); const float totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent); const float fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight; glyphRunLayout->font = Font (fontFamily, fontStyle, glyphRun->fontEmSize / fontHeightToEmSizeFactor); glyphRunLayout->colour = getColourOf (static_cast<ID2D1SolidColorBrush*> (clientDrawingEffect)); const Point<float> lineOrigin (layout->getLine (currentLine).lineOrigin); float x = baselineOriginX - lineOrigin.x; for (UINT32 i = 0; i < glyphRun->glyphCount; ++i) { const float advance = glyphRun->glyphAdvances[i]; if ((glyphRun->bidiLevel & 1) != 0) x -= advance; // RTL text glyphRunLayout->glyphs.add (TextLayout::Glyph (glyphRun->glyphIndices[i], Point<float> (x, baselineOriginY - lineOrigin.y), advance)); if ((glyphRun->bidiLevel & 1) == 0) x += advance; // LTR text } return S_OK; }
MemoryOutputStream::MemoryOutputStream (void* destBuffer, size_t destBufferSize) : blockToUse (nullptr), externalData (destBuffer), position (0), size (0), availableSize (destBufferSize) { jassert (externalData != nullptr); // This must be a valid pointer. }
String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup, const bool treatAsChosenDevice) { jassert (&newSetup != ¤tSetup); // this will have no effect if (newSetup == currentSetup && currentAudioDevice != nullptr) return String::empty; if (! (newSetup == currentSetup)) sendChangeMessage(); stopDevice(); const String newInputDeviceName (numInputChansNeeded == 0 ? String::empty : newSetup.inputDeviceName); const String newOutputDeviceName (numOutputChansNeeded == 0 ? String::empty : newSetup.outputDeviceName); String error; AudioIODeviceType* type = getCurrentDeviceTypeObject(); if (type == nullptr || (newInputDeviceName.isEmpty() && newOutputDeviceName.isEmpty())) { deleteCurrentDevice(); if (treatAsChosenDevice) updateXml(); return String::empty; } if (currentSetup.inputDeviceName != newInputDeviceName || currentSetup.outputDeviceName != newOutputDeviceName || currentAudioDevice == nullptr) { deleteCurrentDevice(); scanDevicesIfNeeded(); if (newOutputDeviceName.isNotEmpty() && ! type->getDeviceNames (false).contains (newOutputDeviceName)) { return "No such device: " + newOutputDeviceName; } if (newInputDeviceName.isNotEmpty() && ! type->getDeviceNames (true).contains (newInputDeviceName)) { return "No such device: " + newInputDeviceName; } currentAudioDevice = type->createDevice (newOutputDeviceName, newInputDeviceName); if (currentAudioDevice == nullptr) error = "Can't open the audio device!\n\n" "This may be because another application is currently using the same device - " "if so, you should close any other applications and try again!"; else error = currentAudioDevice->getLastError(); if (error.isNotEmpty()) { deleteCurrentDevice(); return error; } if (newSetup.useDefaultInputChannels) { inputChannels.clear(); inputChannels.setRange (0, numInputChansNeeded, true); } if (newSetup.useDefaultOutputChannels) { outputChannels.clear(); outputChannels.setRange (0, numOutputChansNeeded, true); } if (newInputDeviceName.isEmpty()) inputChannels.clear(); if (newOutputDeviceName.isEmpty()) outputChannels.clear(); } if (! newSetup.useDefaultInputChannels) inputChannels = newSetup.inputChannels; if (! newSetup.useDefaultOutputChannels) outputChannels = newSetup.outputChannels; currentSetup = newSetup; currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); currentSetup.bufferSize = chooseBestBufferSize (newSetup.bufferSize); error = currentAudioDevice->open (inputChannels, outputChannels, currentSetup.sampleRate, currentSetup.bufferSize); if (error.isEmpty()) { currentDeviceType = currentAudioDevice->getTypeName(); currentAudioDevice->start (callbackHandler); currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); for (int i = 0; i < availableDeviceTypes.size(); ++i) if (availableDeviceTypes.getUnchecked (i)->getTypeName() == currentDeviceType) *(lastDeviceTypeConfigs.getUnchecked (i)) = currentSetup; if (treatAsChosenDevice) updateXml(); } else { deleteCurrentDevice(); } return error; }
//============================================================================== DrawableText::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) : ValueTreeWrapperBase (state_) { jassert (state.hasType (valueTreeType)); }
double AudioDeviceManager::getCurrentInputLevel() const { jassert (inputLevelMeasurementEnabledCount.get() > 0); // you need to call enableInputLevelMeasurement() before using this! return inputLevel; }
void RelativeCoordinatePositionerBase::markerListBeingDeleted (MarkerList* markerList) { jassert (sourceMarkerLists.contains (markerList)); sourceMarkerLists.removeValue (markerList); }
//============================================================================== void ComponentBoundsConstrainer::checkBounds (Rectangle<int>& bounds, const Rectangle<int>& old, const Rectangle<int>& limits, const bool isStretchingTop, const bool isStretchingLeft, const bool isStretchingBottom, const bool isStretchingRight) { // constrain the size if it's being stretched.. if (isStretchingLeft) bounds.setLeft (jlimit (old.getRight() - maxW, old.getRight() - minW, bounds.getX())); if (isStretchingRight) bounds.setWidth (jlimit (minW, maxW, bounds.getWidth())); if (isStretchingTop) bounds.setTop (jlimit (old.getBottom() - maxH, old.getBottom() - minH, bounds.getY())); if (isStretchingBottom) bounds.setHeight (jlimit (minH, maxH, bounds.getHeight())); if (bounds.isEmpty()) return; if (minOffTop > 0) { const int limit = limits.getY() + jmin (minOffTop - bounds.getHeight(), 0); if (bounds.getY() < limit) { if (isStretchingTop) bounds.setTop (limits.getY()); else bounds.setY (limit); } } if (minOffLeft > 0) { const int limit = limits.getX() + jmin (minOffLeft - bounds.getWidth(), 0); if (bounds.getX() < limit) { if (isStretchingLeft) bounds.setLeft (limits.getX()); else bounds.setX (limit); } } if (minOffBottom > 0) { const int limit = limits.getBottom() - jmin (minOffBottom, bounds.getHeight()); if (bounds.getY() > limit) { if (isStretchingBottom) bounds.setBottom (limits.getBottom()); else bounds.setY (limit); } } if (minOffRight > 0) { const int limit = limits.getRight() - jmin (minOffRight, bounds.getWidth()); if (bounds.getX() > limit) { if (isStretchingRight) bounds.setRight (limits.getRight()); else bounds.setX (limit); } } // constrain the aspect ratio if one has been specified.. if (aspectRatio > 0.0) { bool adjustWidth; if ((isStretchingTop || isStretchingBottom) && ! (isStretchingLeft || isStretchingRight)) { adjustWidth = true; } else if ((isStretchingLeft || isStretchingRight) && ! (isStretchingTop || isStretchingBottom)) { adjustWidth = false; } else { const double oldRatio = (old.getHeight() > 0) ? std::abs (old.getWidth() / (double) old.getHeight()) : 0.0; const double newRatio = std::abs (bounds.getWidth() / (double) bounds.getHeight()); adjustWidth = (oldRatio > newRatio); } if (adjustWidth) { bounds.setWidth (roundToInt (bounds.getHeight() * aspectRatio)); if (bounds.getWidth() > maxW || bounds.getWidth() < minW) { bounds.setWidth (jlimit (minW, maxW, bounds.getWidth())); bounds.setHeight (roundToInt (bounds.getWidth() / aspectRatio)); } } else { bounds.setHeight (roundToInt (bounds.getWidth() / aspectRatio)); if (bounds.getHeight() > maxH || bounds.getHeight() < minH) { bounds.setHeight (jlimit (minH, maxH, bounds.getHeight())); bounds.setWidth (roundToInt (bounds.getHeight() * aspectRatio)); } } if ((isStretchingTop || isStretchingBottom) && ! (isStretchingLeft || isStretchingRight)) { bounds.setX (old.getX() + (old.getWidth() - bounds.getWidth()) / 2); } else if ((isStretchingLeft || isStretchingRight) && ! (isStretchingTop || isStretchingBottom)) { bounds.setY (old.getY() + (old.getHeight() - bounds.getHeight()) / 2); } else { if (isStretchingLeft) bounds.setX (old.getRight() - bounds.getWidth()); if (isStretchingTop) bounds.setY (old.getBottom() - bounds.getHeight()); } } jassert (! bounds.isEmpty()); }
PathPoint* getPoint() const { PathPoint* p = getElement()->getPoint (index); jassert (p != nullptr); return p; }
CodeDocument::Position::Position (const Position& other) noexcept : owner (other.owner), characterPos (other.characterPos), line (other.line), indexInLine (other.indexInLine), positionMaintained (false) { jassert (*this == other); }