void Echo::PositionChanged() { m_bufferSize = m_sampleRate * 2u; try { m_delayLine.assign(m_bufferSize * 2, 0); } MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e) { MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e); m_bufferSize = 0; } m_writePos = 0; }
void Echo::Resume() //----------------- { m_isResumed = true; m_sampleRate = m_SndFile.GetSampleRate(); m_bufferSize = m_sampleRate * 2u; RecalculateEchoParams(); try { m_delayLine.assign(m_bufferSize * 2, 0); } MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e) { MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e); m_bufferSize = 0; } m_writePos = 0; }
static bool StringToEnvelope(const std::string &s, InstrumentEnvelope &env, const CModSpecifications &specs) //---------------------------------------------------------------------------------------------------------- { uint32 susBegin = 0, susEnd = 0, loopBegin = 0, loopEnd = 0, bSus = 0, bLoop = 0, bCarry = 0, nPoints = 0, releaseNode = ENV_RELEASE_NODE_UNSET; size_t length = s.size(), pos = strlen(pszEnvHdr); if(length <= pos || mpt::CompareNoCaseAscii(s.c_str(), pszEnvHdr, pos - 2)) { return false; } sscanf(&s[pos], pszEnvFmt, &nPoints, &susBegin, &susEnd, &loopBegin, &loopEnd, &bSus, &bLoop, &bCarry); while (pos < length && s[pos] != '\r' && s[pos] != '\n') pos++; nPoints = MIN(nPoints, specs.envelopePointsMax); if (susEnd >= nPoints) susEnd = 0; if (susBegin > susEnd) susBegin = susEnd; if (loopEnd >= nPoints) loopEnd = 0; if (loopBegin > loopEnd) loopBegin = loopEnd; try { env.resize(nPoints); } MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e) { MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e); return false; } env.nSustainStart = susBegin; env.nSustainEnd = susEnd; env.nLoopStart = loopBegin; env.nLoopEnd = loopEnd; env.nReleaseNode = releaseNode; env.dwFlags.set(ENV_LOOP, bLoop != 0); env.dwFlags.set(ENV_SUSTAIN, bSus != 0); env.dwFlags.set(ENV_CARRY, bCarry != 0); env.dwFlags.set(ENV_ENABLED, nPoints > 0); int oldn = 0; for(auto &p : env) { while (pos < length && (s[pos] < '0' || s[pos] > '9')) pos++; if (pos >= length) break; int n1 = atoi(&s[pos]); while (pos < length && s[pos] != ',') pos++; while (pos < length && (s[pos] < '0' || s[pos] > '9')) pos++; if (pos >= length) break; int n2 = atoi(&s[pos]); if (n1 < oldn) n1 = oldn + 1; Limit(n2, ENVELOPE_MIN, ENVELOPE_MAX); p.tick = (uint16)n1; p.value = (uint8)n2; oldn = n1; while (pos < length && s[pos] != '\r' && s[pos] != '\n') pos++; if (pos >= length) break; } env.Sanitize(); // Read release node information. env.nReleaseNode = ENV_RELEASE_NODE_UNSET; if(pos < length) { uint8 r = static_cast<uint8>(atoi(&s[pos])); if(r == 0 || r >= nPoints || !specs.hasReleaseNode) r = ENV_RELEASE_NODE_UNSET; env.nReleaseNode = r; } return true; }