Refactoring: Remove duplicate code (#4310)
This commit is contained in:
@@ -125,48 +125,9 @@ public:
|
||||
*/
|
||||
static inline sample_t oscillate( float _ph, float _wavelen, Waveforms _wave )
|
||||
{
|
||||
// high wavelen/ low freq
|
||||
if( _wavelen > TLENS[ MAXTBL ] )
|
||||
{
|
||||
const int t = MAXTBL;
|
||||
const int tlen = TLENS[t];
|
||||
const float ph = fraction( _ph );
|
||||
const float lookupf = ph * static_cast<float>( tlen );
|
||||
const int lookup = static_cast<int>( lookupf );
|
||||
const float ip = fraction( lookupf );
|
||||
|
||||
const sample_t s1 = s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
const sample_t s2 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 1 ) % tlen );
|
||||
const int lm = lookup == 0 ? tlen - 1 : lookup - 1;
|
||||
const sample_t s0 = s_waveforms[ _wave ].sampleAt( t, lm );
|
||||
const sample_t s3 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 2 ) % tlen );
|
||||
const sample_t sr = optimal4pInterpolate( s0, s1, s2, s3, ip );
|
||||
|
||||
return sr;
|
||||
}
|
||||
// low wavelen/ high freq
|
||||
if( _wavelen < 3.0f )
|
||||
{
|
||||
const int t = 0;
|
||||
const int tlen = TLENS[t];
|
||||
const float ph = fraction( _ph );
|
||||
const float lookupf = ph * static_cast<float>( tlen );
|
||||
const int lookup = static_cast<int>( lookupf );
|
||||
const float ip = fraction( lookupf );
|
||||
|
||||
const sample_t s1 = s_waveforms[ _wave ].sampleAt( t, lookup );
|
||||
const sample_t s2 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 1 ) % tlen );
|
||||
const int lm = lookup == 0 ? tlen - 1 : lookup - 1;
|
||||
const sample_t s0 = s_waveforms[ _wave ].sampleAt( t, lm );
|
||||
const sample_t s3 = s_waveforms[ _wave ].sampleAt( t, ( lookup + 2 ) % tlen );
|
||||
const sample_t sr = optimal4pInterpolate( s0, s1, s2, s3, ip );
|
||||
|
||||
return sr;
|
||||
}
|
||||
|
||||
// get the next higher tlen
|
||||
int t = MAXTBL - 1;
|
||||
while( _wavelen < TLENS[t] ) { t--; }
|
||||
int t = 0;
|
||||
while( t < MAXTBL && _wavelen >= TLENS[t+1] ) { t++; }
|
||||
|
||||
int tlen = TLENS[t];
|
||||
const float ph = fraction( _ph );
|
||||
|
||||
@@ -245,15 +245,37 @@ namespace DspEffectLibrary
|
||||
} ;
|
||||
|
||||
|
||||
class FoldbackDistortion : public MonoBase<FoldbackDistortion>
|
||||
template<class T>
|
||||
class DistortionBase : public MonoBase<T>
|
||||
{
|
||||
public:
|
||||
FoldbackDistortion( float threshold, float gain ) :
|
||||
DistortionBase( float threshold, float gain ) :
|
||||
m_threshold( threshold ),
|
||||
m_gain( gain )
|
||||
{
|
||||
}
|
||||
|
||||
void setThreshold( float threshold )
|
||||
{
|
||||
m_threshold = threshold;
|
||||
}
|
||||
|
||||
void setGain( float gain )
|
||||
{
|
||||
m_gain = gain;
|
||||
}
|
||||
|
||||
protected:
|
||||
float m_threshold;
|
||||
float m_gain;
|
||||
};
|
||||
|
||||
|
||||
class FoldbackDistortion : public DistortionBase<FoldbackDistortion>
|
||||
{
|
||||
public:
|
||||
using DistortionBase<FoldbackDistortion>::DistortionBase;
|
||||
|
||||
sample_t nextSample( sample_t in )
|
||||
{
|
||||
if( in >= m_threshold || in < -m_threshold )
|
||||
@@ -262,54 +284,18 @@ namespace DspEffectLibrary
|
||||
}
|
||||
return in * m_gain;
|
||||
}
|
||||
|
||||
void setThreshold( float threshold )
|
||||
{
|
||||
m_threshold = threshold;
|
||||
}
|
||||
|
||||
void setGain( float gain )
|
||||
{
|
||||
m_gain = gain;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
float m_threshold;
|
||||
float m_gain;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
class Distortion : public MonoBase<Distortion>
|
||||
class Distortion : public DistortionBase<Distortion>
|
||||
{
|
||||
public:
|
||||
Distortion( float threshold, float gain ) :
|
||||
m_threshold( threshold ),
|
||||
m_gain( gain )
|
||||
{
|
||||
}
|
||||
using DistortionBase<Distortion>::DistortionBase;
|
||||
|
||||
sample_t nextSample( sample_t in )
|
||||
{
|
||||
return m_gain * ( in * ( fabsf( in )+m_threshold ) / ( in*in +( m_threshold-1 )* fabsf( in ) + 1 ) );
|
||||
}
|
||||
|
||||
void setThreshold( float threshold )
|
||||
{
|
||||
m_threshold = threshold;
|
||||
}
|
||||
|
||||
void setGain( float gain )
|
||||
{
|
||||
m_gain = gain;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
float m_threshold;
|
||||
float m_gain;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -334,6 +334,11 @@ private:
|
||||
uint16_t getPluginInputs( const LADSPA_Descriptor * _descriptor );
|
||||
uint16_t getPluginOutputs( const LADSPA_Descriptor * _descriptor );
|
||||
|
||||
const LADSPA_PortDescriptor* getPortDescriptor( const ladspa_key_t& _plugin,
|
||||
uint32_t _port );
|
||||
const LADSPA_PortRangeHint* getPortRangeHint( const ladspa_key_t& _plugin,
|
||||
uint32_t _port );
|
||||
|
||||
typedef QMap<ladspa_key_t, ladspaManagerDescription *>
|
||||
ladspaManagerMapType;
|
||||
ladspaManagerMapType m_ladspaManagerMap;
|
||||
|
||||
@@ -64,6 +64,8 @@ private:
|
||||
QString pathForTrack( const Track *track, int num );
|
||||
void restoreMutedState();
|
||||
|
||||
void render( QString outputPath );
|
||||
|
||||
const Mixer::qualitySettings m_qualitySettings;
|
||||
const Mixer::qualitySettings m_oldQualitySettings;
|
||||
const OutputSettings m_outputSettings;
|
||||
|
||||
@@ -103,12 +103,12 @@ public:
|
||||
} ;
|
||||
|
||||
|
||||
SampleBuffer();
|
||||
// constructor which either loads sample _audio_file or decodes
|
||||
// base64-data out of string
|
||||
SampleBuffer( const QString & _audio_file = QString(),
|
||||
bool _is_base64_data = false );
|
||||
SampleBuffer( const QString & _audio_file, bool _is_base64_data = false );
|
||||
SampleBuffer( const sampleFrame * _data, const f_cnt_t _frames );
|
||||
SampleBuffer( const f_cnt_t _frames );
|
||||
explicit SampleBuffer( const f_cnt_t _frames );
|
||||
|
||||
virtual ~SampleBuffer();
|
||||
|
||||
|
||||
@@ -38,8 +38,8 @@ class AudioPort;
|
||||
class SamplePlayHandle : public PlayHandle
|
||||
{
|
||||
public:
|
||||
SamplePlayHandle( const QString& sampleFile );
|
||||
SamplePlayHandle( SampleBuffer* sampleBuffer );
|
||||
SamplePlayHandle( const QString& sampleFile );
|
||||
SamplePlayHandle( SampleTCO* tco );
|
||||
virtual ~SamplePlayHandle();
|
||||
|
||||
|
||||
@@ -438,6 +438,7 @@ private slots:
|
||||
void cloneTrack();
|
||||
void removeTrack();
|
||||
void updateMenu();
|
||||
void toggleRecording(bool on);
|
||||
void recordingOn();
|
||||
void recordingOff();
|
||||
void clearTrack();
|
||||
|
||||
@@ -69,25 +69,6 @@ private slots:
|
||||
|
||||
|
||||
private:
|
||||
struct VstSyncData
|
||||
{
|
||||
bool isPlaying;
|
||||
float ppqPos;
|
||||
int timeSigNumer;
|
||||
int timeSigDenom;
|
||||
bool isCycle;
|
||||
bool hasSHM;
|
||||
float cycleStart;
|
||||
float cycleEnd;
|
||||
int m_bufferSize;
|
||||
int m_sampleRate;
|
||||
int m_bpm;
|
||||
|
||||
#ifdef VST_SNC_LATENCY
|
||||
float m_latency;
|
||||
#endif
|
||||
} ;
|
||||
|
||||
VstSyncData* m_syncData;
|
||||
|
||||
int m_shmID;
|
||||
|
||||
@@ -162,19 +162,8 @@ void EffectChain::moveDown( Effect * _effect )
|
||||
{
|
||||
if( _effect != m_effects.last() )
|
||||
{
|
||||
int i = 0;
|
||||
for( EffectList::Iterator it = m_effects.begin();
|
||||
it != m_effects.end(); it++, i++ )
|
||||
{
|
||||
if( *it == _effect )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Effect * temp = m_effects[i + 1];
|
||||
m_effects[i + 1] = _effect;
|
||||
m_effects[i] = temp;
|
||||
int i = m_effects.indexOf(_effect);
|
||||
std::swap(m_effects[i + 1], m_effects[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,19 +174,8 @@ void EffectChain::moveUp( Effect * _effect )
|
||||
{
|
||||
if( _effect != m_effects.first() )
|
||||
{
|
||||
int i = 0;
|
||||
for( EffectList::Iterator it = m_effects.begin();
|
||||
it != m_effects.end(); it++, i++ )
|
||||
{
|
||||
if( *it == _effect )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Effect * temp = m_effects[i - 1];
|
||||
m_effects[i - 1] = _effect;
|
||||
m_effects[i] = temp;
|
||||
int i = m_effects.indexOf(_effect);
|
||||
std::swap(m_effects[i - 1], m_effects[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -235,6 +235,26 @@ uint16_t LadspaManager::getPluginOutputs(
|
||||
return outputs;
|
||||
}
|
||||
|
||||
const LADSPA_PortDescriptor* LadspaManager::getPortDescriptor(const ladspa_key_t &_plugin, uint32_t _port)
|
||||
{
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && _port < getPortCount( _plugin ) )
|
||||
{
|
||||
return( & descriptor->PortDescriptors[_port] );
|
||||
}
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
const LADSPA_PortRangeHint *LadspaManager::getPortRangeHint(const ladspa_key_t &_plugin, uint32_t _port)
|
||||
{
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && _port < getPortCount( _plugin ) )
|
||||
{
|
||||
return( & descriptor->PortRangeHints[_port] );
|
||||
}
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -248,19 +268,8 @@ l_sortable_plugin_t LadspaManager::getSortedPlugins()
|
||||
|
||||
QString LadspaManager::getLabel( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Label ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( QString( "" ) );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->Label : "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -269,19 +278,9 @@ QString LadspaManager::getLabel( const ladspa_key_t & _plugin )
|
||||
bool LadspaManager::hasRealTimeDependency(
|
||||
const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_REALTIME( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? LADSPA_IS_REALTIME( descriptor->Properties )
|
||||
: false );
|
||||
}
|
||||
|
||||
|
||||
@@ -289,19 +288,9 @@ bool LadspaManager::hasRealTimeDependency(
|
||||
|
||||
bool LadspaManager::isInplaceBroken( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_INPLACE_BROKEN( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? LADSPA_IS_INPLACE_BROKEN( descriptor->Properties )
|
||||
: false );
|
||||
}
|
||||
|
||||
|
||||
@@ -310,19 +299,9 @@ bool LadspaManager::isInplaceBroken( const ladspa_key_t & _plugin )
|
||||
bool LadspaManager::isRealTimeCapable(
|
||||
const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_HARD_RT_CAPABLE( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? LADSPA_IS_HARD_RT_CAPABLE( descriptor->Properties )
|
||||
: false );
|
||||
}
|
||||
|
||||
|
||||
@@ -330,19 +309,8 @@ bool LadspaManager::isRealTimeCapable(
|
||||
|
||||
QString LadspaManager::getName( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Name ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( QString( "" ) );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->Name : "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -350,19 +318,8 @@ QString LadspaManager::getName( const ladspa_key_t & _plugin )
|
||||
|
||||
QString LadspaManager::getMaker( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Maker ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( QString( "" ) );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->Maker : "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -370,19 +327,8 @@ QString LadspaManager::getMaker( const ladspa_key_t & _plugin )
|
||||
|
||||
QString LadspaManager::getCopyright( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Copyright ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( QString( "" ) );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->Copyright : "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -390,19 +336,8 @@ QString LadspaManager::getCopyright( const ladspa_key_t & _plugin )
|
||||
|
||||
uint32_t LadspaManager::getPortCount( const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( descriptor->PortCount );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( 0 );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->PortCount : 0 );
|
||||
}
|
||||
|
||||
|
||||
@@ -411,22 +346,8 @@ uint32_t LadspaManager::getPortCount( const ladspa_key_t & _plugin )
|
||||
bool LadspaManager::isPortInput( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_INPUT
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto * descriptor = getPortDescriptor( _plugin, _port );
|
||||
return( descriptor && LADSPA_IS_PORT_INPUT( * descriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -435,22 +356,8 @@ bool LadspaManager::isPortInput( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::isPortOutput( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_OUTPUT
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto * descriptor = getPortDescriptor( _plugin, _port );
|
||||
return( descriptor && LADSPA_IS_PORT_OUTPUT( * descriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -459,22 +366,8 @@ bool LadspaManager::isPortOutput( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::isPortAudio( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_AUDIO
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto * descriptor = getPortDescriptor( _plugin, _port );
|
||||
return( descriptor && LADSPA_IS_PORT_AUDIO( * descriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -483,22 +376,8 @@ bool LadspaManager::isPortAudio( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::isPortControl( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_CONTROL
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto * descriptor = getPortDescriptor( _plugin, _port );
|
||||
return( descriptor && LADSPA_IS_PORT_CONTROL( * descriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -508,22 +387,8 @@ bool LadspaManager::areHintsSampleRateDependent(
|
||||
const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_SAMPLE_RATE ( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
return portRangeHint && LADSPA_IS_HINT_SAMPLE_RATE( portRangeHint->HintDescriptor );
|
||||
}
|
||||
|
||||
|
||||
@@ -532,59 +397,26 @@ bool LadspaManager::areHintsSampleRateDependent(
|
||||
float LadspaManager::getLowerBound( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
if( portRangeHint && LADSPA_IS_HINT_BOUNDED_BELOW( portRangeHint->HintDescriptor ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_BELOW( hintDescriptor ) )
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].LowerBound );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NOHINT );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NOHINT );
|
||||
return( portRangeHint->LowerBound );
|
||||
}
|
||||
return( NOHINT );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
float LadspaManager::getUpperBound( const ladspa_key_t & _plugin, uint32_t _port )
|
||||
float LadspaManager::getUpperBound( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
if( portRangeHint && LADSPA_IS_HINT_BOUNDED_ABOVE( portRangeHint->HintDescriptor ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_ABOVE( hintDescriptor ) )
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].UpperBound );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NOHINT );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NOHINT );
|
||||
return( portRangeHint->UpperBound );
|
||||
}
|
||||
return( NOHINT );
|
||||
}
|
||||
|
||||
|
||||
@@ -593,22 +425,8 @@ float LadspaManager::getUpperBound( const ladspa_key_t & _plugin, uint32
|
||||
bool LadspaManager::isPortToggled( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_TOGGLED( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
return( portRangeHint && LADSPA_IS_HINT_TOGGLED( portRangeHint->HintDescriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -617,69 +435,54 @@ bool LadspaManager::isPortToggled( const ladspa_key_t & _plugin,
|
||||
float LadspaManager::getDefaultSetting( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
if( portRangeHint )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor = portRangeHint->HintDescriptor;
|
||||
switch( hintDescriptor & LADSPA_HINT_DEFAULT_MASK )
|
||||
{
|
||||
case LADSPA_HINT_DEFAULT_NONE:
|
||||
return( NOHINT );
|
||||
case LADSPA_HINT_DEFAULT_MINIMUM:
|
||||
return( descriptor->PortRangeHints[_port].
|
||||
LowerBound );
|
||||
return( portRangeHint->LowerBound );
|
||||
case LADSPA_HINT_DEFAULT_LOW:
|
||||
if( LADSPA_IS_HINT_LOGARITHMIC
|
||||
( hintDescriptor ) )
|
||||
{
|
||||
return( exp( log( descriptor->PortRangeHints[_port].LowerBound )
|
||||
* 0.75
|
||||
+ log( descriptor->PortRangeHints[_port].UpperBound )
|
||||
* 0.25 ) );
|
||||
return( exp( log( portRangeHint->LowerBound ) * 0.75 +
|
||||
log( portRangeHint->UpperBound ) * 0.25 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].LowerBound
|
||||
* 0.75
|
||||
+ descriptor->PortRangeHints[_port].UpperBound
|
||||
* 0.25 );
|
||||
return( portRangeHint->LowerBound * 0.75 +
|
||||
portRangeHint->UpperBound * 0.25 );
|
||||
}
|
||||
case LADSPA_HINT_DEFAULT_MIDDLE:
|
||||
if( LADSPA_IS_HINT_LOGARITHMIC
|
||||
( hintDescriptor ) )
|
||||
{
|
||||
return( sqrt( descriptor->PortRangeHints[_port].LowerBound
|
||||
* descriptor->PortRangeHints[_port].UpperBound ) );
|
||||
return( sqrt( portRangeHint->LowerBound
|
||||
* portRangeHint->UpperBound ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( 0.5 * ( descriptor->PortRangeHints[_port].LowerBound
|
||||
+ descriptor->PortRangeHints[_port].UpperBound ) );
|
||||
return( 0.5 * ( portRangeHint->LowerBound
|
||||
+ portRangeHint->UpperBound ) );
|
||||
}
|
||||
case LADSPA_HINT_DEFAULT_HIGH:
|
||||
if( LADSPA_IS_HINT_LOGARITHMIC
|
||||
( hintDescriptor ) )
|
||||
{
|
||||
return( exp( log( descriptor->PortRangeHints[_port].LowerBound )
|
||||
* 0.25
|
||||
+ log( descriptor->PortRangeHints[_port].UpperBound )
|
||||
* 0.75 ) );
|
||||
return( exp( log( portRangeHint->LowerBound ) * 0.25 +
|
||||
log( portRangeHint->UpperBound ) * 0.75 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].LowerBound
|
||||
* 0.25
|
||||
+ descriptor->PortRangeHints[_port].UpperBound
|
||||
* 0.75 );
|
||||
return( portRangeHint->LowerBound * 0.25 +
|
||||
portRangeHint->UpperBound * 0.75 );
|
||||
}
|
||||
case LADSPA_HINT_DEFAULT_MAXIMUM:
|
||||
return( descriptor->PortRangeHints[_port].UpperBound );
|
||||
return( portRangeHint->UpperBound );
|
||||
case LADSPA_HINT_DEFAULT_0:
|
||||
return( 0.0 );
|
||||
case LADSPA_HINT_DEFAULT_1:
|
||||
@@ -704,22 +507,8 @@ float LadspaManager::getDefaultSetting( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::isLogarithmic( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_LOGARITHMIC( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
return( portRangeHint && LADSPA_IS_HINT_LOGARITHMIC( portRangeHint->HintDescriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -728,22 +517,8 @@ bool LadspaManager::isLogarithmic( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::isInteger( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_INTEGER( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
const auto* portRangeHint = getPortRangeHint( _plugin, _port );
|
||||
return( portRangeHint && LADSPA_IS_HINT_INTEGER( portRangeHint->HintDescriptor ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -777,21 +552,8 @@ bool LadspaManager::isEnum( const ladspa_key_t & _plugin, uint32_t _port )
|
||||
QString LadspaManager::getPortName( const ladspa_key_t & _plugin,
|
||||
uint32_t _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) &&
|
||||
_port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( QString( descriptor->PortNames[_port] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( QString( "" ) );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->PortNames[_port] : QString( "" ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -800,19 +562,8 @@ QString LadspaManager::getPortName( const ladspa_key_t & _plugin,
|
||||
const void * LadspaManager::getImplementationData(
|
||||
const ladspa_key_t & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( descriptor->ImplementationData );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NULL );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ? descriptor->ImplementationData : NULL );
|
||||
}
|
||||
|
||||
|
||||
@@ -843,20 +594,10 @@ LADSPA_Handle LadspaManager::instantiate(
|
||||
const ladspa_key_t & _plugin,
|
||||
uint32_t _sample_rate )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( ( descriptor->instantiate )
|
||||
( descriptor, _sample_rate ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return( NULL );
|
||||
}
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
return( descriptor ?
|
||||
( descriptor->instantiate )( descriptor, _sample_rate ) :
|
||||
NULL );
|
||||
}
|
||||
|
||||
|
||||
@@ -867,20 +608,13 @@ bool LadspaManager::connectPort( const ladspa_key_t & _plugin,
|
||||
uint32_t _port,
|
||||
LADSPA_Data * _data_location )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->connect_port != NULL &&
|
||||
_port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->connect_port != NULL )
|
||||
{
|
||||
( descriptor->connect_port )
|
||||
( _instance, _port, _data_location );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->connect_port )
|
||||
( _instance, _port, _data_location );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -891,18 +625,11 @@ bool LadspaManager::connectPort( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::activate( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->activate != NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->activate != NULL )
|
||||
{
|
||||
( descriptor->activate ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->activate ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -914,18 +641,11 @@ bool LadspaManager::run( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
uint32_t _sample_count )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->run!= NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run != NULL )
|
||||
{
|
||||
( descriptor->run ) ( _instance, _sample_count );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->run ) ( _instance, _sample_count );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -937,19 +657,12 @@ bool LadspaManager::runAdding( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
uint32_t _sample_count )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->run_adding!= NULL
|
||||
&& descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding != NULL &&
|
||||
descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
( descriptor->run_adding ) ( _instance, _sample_count );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->run_adding ) ( _instance, _sample_count );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -961,20 +674,12 @@ bool LadspaManager::setRunAddingGain( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
LADSPA_Data _gain )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->run_adding!= NULL
|
||||
&& descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding != NULL &&
|
||||
descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
( descriptor->set_run_adding_gain )
|
||||
( _instance, _gain );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->set_run_adding_gain ) ( _instance, _gain );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -985,18 +690,11 @@ bool LadspaManager::setRunAddingGain( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::deactivate( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->deactivate!= NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->deactivate != NULL )
|
||||
{
|
||||
( descriptor->deactivate ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->deactivate ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
@@ -1007,18 +705,11 @@ bool LadspaManager::deactivate( const ladspa_key_t & _plugin,
|
||||
bool LadspaManager::cleanup( const ladspa_key_t & _plugin,
|
||||
LADSPA_Handle _instance )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
const LADSPA_Descriptor * descriptor = getDescriptor( _plugin );
|
||||
if( descriptor && descriptor->cleanup!= NULL )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->cleanup != NULL )
|
||||
{
|
||||
( descriptor->cleanup ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
( descriptor->cleanup ) ( _instance );
|
||||
return( true );
|
||||
}
|
||||
return( false );
|
||||
}
|
||||
|
||||
@@ -88,30 +88,7 @@ void RenderManager::renderNextTrack()
|
||||
// for multi-render, prefix each output file with a different number
|
||||
int trackNum = m_tracksToRender.size() + 1;
|
||||
|
||||
// create a renderer for this track
|
||||
m_activeRenderer = make_unique<ProjectRenderer>(
|
||||
m_qualitySettings,
|
||||
m_outputSettings,
|
||||
m_format,
|
||||
pathForTrack(renderTrack, trackNum));
|
||||
|
||||
if ( m_activeRenderer->isReady() )
|
||||
{
|
||||
// pass progress signals through
|
||||
connect( m_activeRenderer.get(), SIGNAL( progressChanged( int ) ),
|
||||
this, SIGNAL( progressChanged( int ) ) );
|
||||
|
||||
// when it is finished, render the next track
|
||||
connect( m_activeRenderer.get(), SIGNAL( finished() ),
|
||||
this, SLOT( renderNextTrack() ) );
|
||||
|
||||
m_activeRenderer->startProcessing();
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug( "Renderer failed to acquire a file device!" );
|
||||
renderNextTrack();
|
||||
}
|
||||
render( pathForTrack(renderTrack, trackNum) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,12 +130,17 @@ void RenderManager::renderTracks()
|
||||
|
||||
// Render the song into a single track
|
||||
void RenderManager::renderProject()
|
||||
{
|
||||
render( m_outputPath );
|
||||
}
|
||||
|
||||
void RenderManager::render(QString outputPath)
|
||||
{
|
||||
m_activeRenderer = make_unique<ProjectRenderer>(
|
||||
m_qualitySettings,
|
||||
m_outputSettings,
|
||||
m_format,
|
||||
m_outputPath);
|
||||
outputPath);
|
||||
|
||||
if( m_activeRenderer->isReady() )
|
||||
{
|
||||
@@ -166,7 +148,8 @@ void RenderManager::renderProject()
|
||||
connect( m_activeRenderer.get(), SIGNAL( progressChanged( int ) ),
|
||||
this, SIGNAL( progressChanged( int ) ) );
|
||||
|
||||
// as we have not queued any tracks, renderNextTrack will just clean up
|
||||
// when it is finished, render the next track.
|
||||
// if we have not queued any tracks, renderNextTrack will just clean up
|
||||
connect( m_activeRenderer.get(), SIGNAL( finished() ),
|
||||
this, SLOT( renderNextTrack() ) );
|
||||
|
||||
@@ -175,7 +158,7 @@ void RenderManager::renderProject()
|
||||
else
|
||||
{
|
||||
qDebug( "Renderer failed to acquire a file device!" );
|
||||
emit finished();
|
||||
renderNextTrack();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,34 +59,8 @@
|
||||
#include "FileDialog.h"
|
||||
|
||||
|
||||
SampleBuffer::SampleBuffer( const QString & _audio_file,
|
||||
bool _is_base64_data ) :
|
||||
m_audioFile( ( _is_base64_data == true ) ? "" : _audio_file ),
|
||||
m_origData( NULL ),
|
||||
m_origFrames( 0 ),
|
||||
m_data( NULL ),
|
||||
m_frames( 0 ),
|
||||
m_startFrame( 0 ),
|
||||
m_endFrame( 0 ),
|
||||
m_loopStartFrame( 0 ),
|
||||
m_loopEndFrame( 0 ),
|
||||
m_amplification( 1.0f ),
|
||||
m_reversed( false ),
|
||||
m_frequency( BaseFreq ),
|
||||
m_sampleRate( Engine::mixer()->baseSampleRate() )
|
||||
{
|
||||
if( _is_base64_data == true )
|
||||
{
|
||||
loadFromBase64( _audio_file );
|
||||
}
|
||||
connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( sampleRateChanged() ) );
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SampleBuffer::SampleBuffer( const sampleFrame * _data, const f_cnt_t _frames ) :
|
||||
SampleBuffer::SampleBuffer() :
|
||||
m_audioFile( "" ),
|
||||
m_origData( NULL ),
|
||||
m_origFrames( 0 ),
|
||||
@@ -101,42 +75,56 @@ SampleBuffer::SampleBuffer( const sampleFrame * _data, const f_cnt_t _frames ) :
|
||||
m_frequency( BaseFreq ),
|
||||
m_sampleRate( Engine::mixer()->baseSampleRate() )
|
||||
{
|
||||
|
||||
connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( sampleRateChanged() ) );
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SampleBuffer::SampleBuffer( const QString & _audio_file,
|
||||
bool _is_base64_data )
|
||||
: SampleBuffer()
|
||||
{
|
||||
if( _is_base64_data )
|
||||
{
|
||||
loadFromBase64( _audio_file );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_audioFile = _audio_file;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SampleBuffer::SampleBuffer( const sampleFrame * _data, const f_cnt_t _frames )
|
||||
: SampleBuffer()
|
||||
{
|
||||
if( _frames > 0 )
|
||||
{
|
||||
m_origData = MM_ALLOC( sampleFrame, _frames );
|
||||
memcpy( m_origData, _data, _frames * BYTES_PER_FRAME );
|
||||
m_origFrames = _frames;
|
||||
update();
|
||||
}
|
||||
connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( sampleRateChanged() ) );
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SampleBuffer::SampleBuffer( const f_cnt_t _frames ) :
|
||||
m_audioFile( "" ),
|
||||
m_origData( NULL ),
|
||||
m_origFrames( 0 ),
|
||||
m_data( NULL ),
|
||||
m_frames( 0 ),
|
||||
m_startFrame( 0 ),
|
||||
m_endFrame( 0 ),
|
||||
m_loopStartFrame( 0 ),
|
||||
m_loopEndFrame( 0 ),
|
||||
m_amplification( 1.0f ),
|
||||
m_reversed( false ),
|
||||
m_frequency( BaseFreq ),
|
||||
m_sampleRate( Engine::mixer()->baseSampleRate() )
|
||||
SampleBuffer::SampleBuffer( const f_cnt_t _frames )
|
||||
: SampleBuffer()
|
||||
{
|
||||
if( _frames > 0 )
|
||||
{
|
||||
m_origData = MM_ALLOC( sampleFrame, _frames );
|
||||
memset( m_origData, 0, _frames * BYTES_PER_FRAME );
|
||||
m_origFrames = _frames;
|
||||
update();
|
||||
}
|
||||
connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( sampleRateChanged() ) );
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -32,23 +32,6 @@
|
||||
|
||||
|
||||
|
||||
SamplePlayHandle::SamplePlayHandle( const QString& sampleFile ) :
|
||||
PlayHandle( TypeSamplePlayHandle ),
|
||||
m_sampleBuffer( new SampleBuffer( sampleFile ) ),
|
||||
m_doneMayReturnTrue( true ),
|
||||
m_frame( 0 ),
|
||||
m_ownAudioPort( true ),
|
||||
m_defaultVolumeModel( DefaultVolume, MinVolume, MaxVolume, 1 ),
|
||||
m_volumeModel( &m_defaultVolumeModel ),
|
||||
m_track( NULL ),
|
||||
m_bbTrack( NULL )
|
||||
{
|
||||
setAudioPort( new AudioPort( "SamplePlayHandle", false ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SamplePlayHandle::SamplePlayHandle( SampleBuffer* sampleBuffer ) :
|
||||
PlayHandle( TypeSamplePlayHandle ),
|
||||
m_sampleBuffer( sharedObject::ref( sampleBuffer ) ),
|
||||
@@ -66,17 +49,20 @@ SamplePlayHandle::SamplePlayHandle( SampleBuffer* sampleBuffer ) :
|
||||
|
||||
|
||||
|
||||
SamplePlayHandle::SamplePlayHandle( SampleTCO* tco ) :
|
||||
PlayHandle( TypeSamplePlayHandle ),
|
||||
m_sampleBuffer( sharedObject::ref( tco->sampleBuffer() ) ),
|
||||
m_doneMayReturnTrue( true ),
|
||||
m_frame( 0 ),
|
||||
m_ownAudioPort( false ),
|
||||
m_defaultVolumeModel( DefaultVolume, MinVolume, MaxVolume, 1 ),
|
||||
m_volumeModel( &m_defaultVolumeModel ),
|
||||
m_track( tco->getTrack() ),
|
||||
m_bbTrack( NULL )
|
||||
SamplePlayHandle::SamplePlayHandle( const QString& sampleFile ) :
|
||||
SamplePlayHandle( new SampleBuffer( sampleFile ) )
|
||||
{
|
||||
sharedObject::unref( m_sampleBuffer );
|
||||
setAudioPort( new AudioPort( "SamplePlayHandle", false ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SamplePlayHandle::SamplePlayHandle( SampleTCO* tco ) :
|
||||
SamplePlayHandle( tco->sampleBuffer() )
|
||||
{
|
||||
m_track = tco->getTrack();
|
||||
setAudioPort( ( (SampleTrack *)tco->getTrack() )->audioPort() );
|
||||
}
|
||||
|
||||
|
||||
@@ -1936,35 +1936,31 @@ void TrackOperationsWidget::updateMenu()
|
||||
}
|
||||
|
||||
|
||||
void TrackOperationsWidget::recordingOn()
|
||||
void TrackOperationsWidget::toggleRecording( bool on )
|
||||
{
|
||||
AutomationTrackView * atv = dynamic_cast<AutomationTrackView *>( m_trackView );
|
||||
if( atv )
|
||||
{
|
||||
const Track::tcoVector & tcov = atv->getTrack()->getTCOs();
|
||||
for( Track::tcoVector::const_iterator it = tcov.begin(); it != tcov.end(); ++it )
|
||||
for( TrackContentObject * tco : atv->getTrack()->getTCOs() )
|
||||
{
|
||||
AutomationPattern * ap = dynamic_cast<AutomationPattern *>( *it );
|
||||
if( ap ) { ap->setRecording( true ); }
|
||||
AutomationPattern * ap = dynamic_cast<AutomationPattern *>( tco );
|
||||
if( ap ) { ap->setRecording( on ); }
|
||||
}
|
||||
atv->update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TrackOperationsWidget::recordingOn()
|
||||
{
|
||||
toggleRecording( true );
|
||||
}
|
||||
|
||||
|
||||
void TrackOperationsWidget::recordingOff()
|
||||
{
|
||||
AutomationTrackView * atv = dynamic_cast<AutomationTrackView *>( m_trackView );
|
||||
if( atv )
|
||||
{
|
||||
const Track::tcoVector & tcov = atv->getTrack()->getTCOs();
|
||||
for( Track::tcoVector::const_iterator it = tcov.begin(); it != tcov.end(); ++it )
|
||||
{
|
||||
AutomationPattern * ap = dynamic_cast<AutomationPattern *>( *it );
|
||||
if( ap ) { ap->setRecording( false ); }
|
||||
}
|
||||
atv->update();
|
||||
}
|
||||
toggleRecording( false );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "denormals.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFileInfo>
|
||||
#include <QLocale>
|
||||
#include <QTimer>
|
||||
@@ -223,7 +224,17 @@ void fileCheck( QString &file )
|
||||
}
|
||||
}
|
||||
|
||||
int usageError(const QString& message)
|
||||
{
|
||||
qCritical().noquote() << QString("\n%1.\n\nTry \"%2 --help\" for more information.\n\n")
|
||||
.arg( message ).arg( qApp->arguments()[0] );
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
int noInputFileError()
|
||||
{
|
||||
return usageError( "No input file specified" );
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char * * argv )
|
||||
@@ -328,9 +339,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo input file specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return noInputFileError();
|
||||
}
|
||||
|
||||
|
||||
@@ -366,9 +375,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo input file specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return noInputFileError();
|
||||
}
|
||||
|
||||
|
||||
@@ -385,9 +392,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo input file specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return noInputFileError();
|
||||
}
|
||||
|
||||
|
||||
@@ -404,9 +409,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo output file specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No output file specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -418,9 +421,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo output format specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No output format specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -448,9 +449,7 @@ int main( int argc, char * * argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid output format %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid output format %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg == "--samplerate" || arg == "-s" )
|
||||
@@ -459,9 +458,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo samplerate specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No samplerate specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -472,9 +469,7 @@ int main( int argc, char * * argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid samplerate %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid samplerate %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg == "--bitrate" || arg == "-b" )
|
||||
@@ -483,9 +478,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo bitrate specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No bitrate specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -499,9 +492,7 @@ int main( int argc, char * * argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid bitrate %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid bitrate %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg == "--mode" || arg == "-m" )
|
||||
@@ -510,9 +501,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo stereo mode specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No stereo mode specified" );
|
||||
}
|
||||
|
||||
QString const mode( argv[i] );
|
||||
@@ -531,9 +520,7 @@ int main( int argc, char * * argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid stereo mode %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid stereo mode %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg =="--float" || arg == "-a" )
|
||||
@@ -546,9 +533,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo interpolation method specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No interpolation method specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -572,9 +557,7 @@ int main( int argc, char * * argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid interpolation method %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid interpolation method %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg == "--oversampling" || arg == "-x" )
|
||||
@@ -583,9 +566,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo oversampling specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No oversampling specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -606,9 +587,7 @@ int main( int argc, char * * argv )
|
||||
qs.oversampling = Mixer::qualitySettings::Oversampling_8x;
|
||||
break;
|
||||
default:
|
||||
printf( "\nInvalid oversampling %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid oversampling %1" ).arg( argv[i] ) );
|
||||
}
|
||||
}
|
||||
else if( arg == "--import" )
|
||||
@@ -617,12 +596,9 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo file specified for importing.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No file specified for importing" );
|
||||
}
|
||||
|
||||
|
||||
fileToImport = QString::fromLocal8Bit( argv[i] );
|
||||
|
||||
// exit after import? (only for debugging)
|
||||
@@ -638,9 +614,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo profile specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No profile specified" );
|
||||
}
|
||||
|
||||
|
||||
@@ -652,9 +626,7 @@ int main( int argc, char * * argv )
|
||||
|
||||
if( i == argc )
|
||||
{
|
||||
printf( "\nNo configuration file specified.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( "No configuration file specified" );
|
||||
}
|
||||
|
||||
configFile = QString::fromLocal8Bit( argv[i] );
|
||||
@@ -663,9 +635,7 @@ int main( int argc, char * * argv )
|
||||
{
|
||||
if( argv[i][0] == '-' )
|
||||
{
|
||||
printf( "\nInvalid option %s.\n\n"
|
||||
"Try \"%s --help\" for more information.\n\n", argv[i], argv[0] );
|
||||
return EXIT_FAILURE;
|
||||
return usageError( QString( "Invalid option %1" ).arg( argv[i] ) );
|
||||
}
|
||||
fileToLoad = QString::fromLocal8Bit( argv[i] );
|
||||
}
|
||||
|
||||
@@ -1497,43 +1497,32 @@ void MainWindow::fillTemplatesMenu()
|
||||
{
|
||||
m_templatesMenu->clear();
|
||||
|
||||
QDir user_d( ConfigManager::inst()->userTemplateDir() );
|
||||
QStringList templates = user_d.entryList( QStringList( "*.mpt" ),
|
||||
QDir::Files | QDir::Readable );
|
||||
auto addTemplatesFromDir = [this]( QDir dir ) {
|
||||
QStringList templates = dir.entryList( QStringList( "*.mpt" ),
|
||||
QDir::Files | QDir::Readable );
|
||||
|
||||
m_custom_templates_count = templates.count();
|
||||
for( QStringList::iterator it = templates.begin();
|
||||
it != templates.end(); ++it )
|
||||
{
|
||||
m_templatesMenu->addAction(
|
||||
embed::getIconPixmap( "project_file" ),
|
||||
( *it ).left( ( *it ).length() - 4 ) );
|
||||
if ( templates.size() && ! m_templatesMenu->actions().isEmpty() )
|
||||
{
|
||||
m_templatesMenu->addSeparator();
|
||||
}
|
||||
|
||||
for( QStringList::iterator it = templates.begin();
|
||||
it != templates.end(); ++it )
|
||||
{
|
||||
m_templatesMenu->addAction(
|
||||
embed::getIconPixmap( "project_file" ),
|
||||
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
|
||||
#ifdef LMMS_BUILD_APPLE
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(true);
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(true);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
QDir d( ConfigManager::inst()->factoryProjectsDir() + "templates" );
|
||||
templates = d.entryList( QStringList( "*.mpt" ),
|
||||
QDir::Files | QDir::Readable );
|
||||
return templates.size();
|
||||
};
|
||||
|
||||
|
||||
if( m_custom_templates_count > 0 && !templates.isEmpty() )
|
||||
{
|
||||
m_templatesMenu->addSeparator();
|
||||
}
|
||||
for( QStringList::iterator it = templates.begin();
|
||||
it != templates.end(); ++it )
|
||||
{
|
||||
m_templatesMenu->addAction(
|
||||
embed::getIconPixmap( "project_file" ),
|
||||
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
|
||||
#ifdef LMMS_BUILD_APPLE
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
|
||||
m_templatesMenu->actions().last()->setIconVisibleInMenu(true);
|
||||
#endif
|
||||
}
|
||||
m_custom_templates_count = addTemplatesFromDir( ConfigManager::inst()->userTemplateDir() );
|
||||
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user