bugfixes, new plugin "Vibed" and more

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@111 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2006-03-27 12:19:04 +00:00
parent 87985c092c
commit 462c48d012
73 changed files with 3180 additions and 80 deletions

View File

@@ -472,9 +472,10 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n )
// now follows code for arpeggio
if( _n->baseNote() == FALSE || m_arpDirectionBtnGrp->value() == OFF ||
!m_arpGroupBox->isActive() ||
( _n->released() && _n->releaseFramesDone() >=
if( _n->baseNote() == FALSE ||
( m_arpDirectionBtnGrp->value() + 1) == OFF ||
!m_arpGroupBox->isActive() ||
( _n->released() && _n->releaseFramesDone() >=
_n->actualReleaseFramesToDo() ) )
{
return;
@@ -483,13 +484,13 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n )
const int selected_arp = m_arpComboBox->value();
constNotePlayHandleVector cnphv = notePlayHandle::nphsOfChannelTrack(
_n->getInstrumentTrack() );
constNotePlayHandleVector cnphv = notePlayHandle::nphsOfInstrumentTrack(
_n->getInstrumentTrack() );
if( m_arpModeComboBox->value() != FREE && cnphv.size() == 0 )
{
// maybe we're playing only a preset-preview-note?
cnphv = presetPreviewPlayHandle::nphsOfChannelTrack(
_n->getInstrumentTrack() );
cnphv = presetPreviewPlayHandle::nphsOfInstrumentTrack(
_n->getInstrumentTrack() );
if( cnphv.size() == 0 )
{
// still nothing found here, so lets return
@@ -654,7 +655,7 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc,
_this.setAttribute( "arprange", m_arpRangeKnob->value() );
_this.setAttribute( "arptime", m_arpTimeKnob->value() );
_this.setAttribute( "arpgate", m_arpGateKnob->value() );
_this.setAttribute( "arpdir", m_arpDirectionBtnGrp->value() );
_this.setAttribute( "arpdir", m_arpDirectionBtnGrp->value() + 1 );
_this.setAttribute( "arpsyncmode",
( int ) m_arpTimeKnob->getSyncMode() );
@@ -675,14 +676,14 @@ void arpAndChordsTabWidget::loadSettings( const QDomElement & _this )
m_arpTimeKnob->setValue( _this.attribute( "arptime" ).toFloat() );
m_arpGateKnob->setValue( _this.attribute( "arpgate" ).toFloat() );
m_arpDirectionBtnGrp->setInitValue(
_this.attribute( "arpdir" ).toInt() );
_this.attribute( "arpdir" ).toInt() - 1 );
m_arpTimeKnob->setSyncMode(
( tempoSyncKnob::tempoSyncMode ) _this.attribute(
"arpsyncmode" ).toInt() );
m_arpModeComboBox->setValue( _this.attribute( "arpmode" ).toInt() );
m_arpGroupBox->setState( m_arpDirectionBtnGrp->value() != OFF &&
m_arpGroupBox->setState( _this.attribute( "arpdir" ).toInt() != OFF &&
!_this.attribute( "arpdisabled" ).toInt() );
}

View File

@@ -27,6 +27,7 @@
#include "import_filter.h"
#include "track_container.h"
#include "project_journal.h"
#ifdef QT4
@@ -75,6 +76,10 @@ void importFilter::import( const QString & _file_to_import,
#endif
);
// do not record changes while importing files
const bool j = _tc->eng()->getProjectJournal()->isJournalling();
_tc->eng()->getProjectJournal()->setJournalling( FALSE );
for( vvector<plugin::descriptor>::iterator it = d.begin();
it != d.end(); ++it )
{
@@ -93,6 +98,8 @@ void importFilter::import( const QString & _file_to_import,
}
}
_tc->eng()->getProjectJournal()->setJournalling( j );
delete[] s;
if( successful == FALSE )

View File

@@ -348,7 +348,7 @@ int notePlayHandle::index( void ) const
constNotePlayHandleVector notePlayHandle::nphsOfChannelTrack(
constNotePlayHandleVector notePlayHandle::nphsOfInstrumentTrack(
const instrumentTrack * _it )
{
const playHandleVector & phv = _it->eng()->getMixer()->playHandles();

View File

@@ -56,12 +56,15 @@ class previewTrackContainer : public trackContainer
public:
previewTrackContainer( engine * _engine ) :
trackContainer( _engine ),
m_previewChannelTrack( dynamic_cast<instrumentTrack *>(
track::create( track::CHANNEL_TRACK,
this ) )),
m_previewInstrumentTrack( NULL ),
m_previewNote( NULL ),
m_dataMutex()
{
setJournalling( FALSE );
m_previewInstrumentTrack = dynamic_cast<instrumentTrack *>(
track::create( track::CHANNEL_TRACK,
this ) );
m_previewInstrumentTrack->setJournalling( FALSE );
hide();
}
@@ -81,9 +84,9 @@ public:
return( "previewtc" );
}
instrumentTrack * previewChannelTrack( void )
instrumentTrack * previewInstrumentTrack( void )
{
return( m_previewChannelTrack );
return( m_previewInstrumentTrack );
}
notePlayHandle * previewNote( void )
@@ -108,7 +111,7 @@ public:
private:
instrumentTrack * m_previewChannelTrack;
instrumentTrack * m_previewInstrumentTrack;
notePlayHandle * m_previewNote;
QMutex m_dataMutex;
@@ -141,21 +144,21 @@ presetPreviewPlayHandle::presetPreviewPlayHandle(
multimediaProject mmp( _preset_file );
previewTC()->previewChannelTrack()->loadTrackSpecificSettings(
printf("load track sp\n");
previewTC()->previewInstrumentTrack()->loadTrackSpecificSettings(
mmp.content().firstChild().toElement() );
printf("here\n");
// make sure, our preset-preview-track does not appear in any MIDI-
// devices list, so just disable receiving/sending MIDI-events at all
previewTC()->previewChannelTrack()->m_midiPort->setMode(
previewTC()->previewInstrumentTrack()->m_midiPort->setMode(
midiPort::DUMMY );
// create temporary note
note n();
// create note-play-handle for it
m_previewNote = new notePlayHandle( previewTC()->previewChannelTrack(),
0, ~0,
m_previewNote = new notePlayHandle(
previewTC()->previewInstrumentTrack(), 0, ~0,
note( NULL, 0, 0, static_cast<tones>( A ),
static_cast<octaves>( DEFAULT_OCTAVE-1 ), 100 ) );
static_cast<octaves>( DEFAULT_OCTAVE - 1 ), 100 ) );
previewTC()->setPreviewNote( m_previewNote );
@@ -210,7 +213,7 @@ void presetPreviewPlayHandle::cleanUp( engine * _engine )
constNotePlayHandleVector presetPreviewPlayHandle::nphsOfChannelTrack(
constNotePlayHandleVector presetPreviewPlayHandle::nphsOfInstrumentTrack(
const instrumentTrack * _it )
{
constNotePlayHandleVector cnphv;

View File

@@ -1368,7 +1368,8 @@ void songEditor::clearProject( void )
eng()->getProjectNotes()->clear();
eng()->getProjectJournal()->clear();
eng()->getProjectJournal()->clearInvalidJournallingObjects();
eng()->getProjectJournal()->clearJournal();
eng()->getProjectJournal()->setJournalling( TRUE );
}

View File

@@ -595,7 +595,7 @@ trackContentWidget::~trackContentWidget()
trackContentObject * FASTCALL trackContentWidget::getTCO( csize _tco_num )
trackContentObject * trackContentWidget::getTCO( csize _tco_num )
{
if( _tco_num < m_trackContentObjects.size() )
{
@@ -618,8 +618,7 @@ csize trackContentWidget::numOfTCOs( void )
trackContentObject * FASTCALL trackContentWidget::addTCO(
trackContentObject * _tco )
trackContentObject * trackContentWidget::addTCO( trackContentObject * _tco )
{
QMap<QString, QVariant> map;
map["id"] = _tco->id();
@@ -639,7 +638,7 @@ trackContentObject * FASTCALL trackContentWidget::addTCO(
void FASTCALL trackContentWidget::removeTCO( csize _tco_num, bool _also_delete )
void trackContentWidget::removeTCO( csize _tco_num, bool _also_delete )
{
removeTCO( getTCO( _tco_num ), _also_delete );
}
@@ -661,10 +660,12 @@ void trackContentWidget::removeTCO( trackContentObject * _tco,
map["id"] = _tco->id();
map["state"] = mmp.toString();
addJournalEntry( journalEntry( REMOVE_TCO, map ) );
if( _also_delete )
{
delete _tco;
}
m_trackContentObjects.erase( it );
getTrack()->eng()->getSongEditor()->setModified();
}
@@ -873,15 +874,16 @@ void trackContentWidget::undoStep( journalEntry & _je )
case ADD_TCO:
{
QMap<QString, QVariant> map = _je.data().toMap();
journallingObject * jo =
eng()->getProjectJournal()->getJournallingObject( map["id"].toInt() );
assert( jo != NULL );
trackContentObject * tco =
dynamic_cast<trackContentObject *>(
eng()->getProjectJournal()->getJournallingObject( map["id"].toInt() ) );
assert( tco != NULL );
multimediaProject mmp(
multimediaProject::JOURNAL_DATA );
jo->saveState( mmp, mmp.content() );
tco->saveState( mmp, mmp.content() );
map["state"] = mmp.toString();
_je.data() = map;
delete jo;
tco->close();
break;
}
@@ -1141,6 +1143,7 @@ void trackOperationsWidget::muteBtnRightClicked( void )
trackWidget::trackWidget( track * _track, QWidget * _parent ) :
QWidget( _parent ),
journallingObject( _track->eng() ),
m_track( _track ),
m_trackOperationsWidget( this ),
m_trackSettingsWidget( this ),
@@ -1232,6 +1235,46 @@ void trackWidget::changePosition( const midiTime & _new_pos )
void trackWidget::undoStep( journalEntry & _je )
{
saveJournallingState( FALSE );
switch( _je.actionID() )
{
case MOVE_TRACK:
{
trackContainer * tc = m_track->getTrackContainer();
if( _je.data().toInt() > 0 )
{
tc->moveTrackUp( m_track );
}
else
{
tc->moveTrackDown( m_track );
}
break;
}
case RESIZE_TRACK:
setFixedHeight( tMax<int>( height() +
_je.data().toInt(),
MINIMAL_TRACK_HEIGHT ) );
m_track->getTrackContainer()->realignTracks();
break;
}
restoreJournallingState();
}
void trackWidget::redoStep( journalEntry & _je )
{
journalEntry je( _je.actionID(), -_je.data().toInt() );
undoStep( je );
}
void trackWidget::dragEnterEvent( QDragEnterEvent * _dee )
{
stringPairDrag::processDragEnterEvent( _dee, "track_" +
@@ -1320,6 +1363,7 @@ void trackWidget::mouseMoveEvent( QMouseEvent * _me )
{
tc->moveTrackDown( m_track );
}
addJournalEntry( journalEntry( MOVE_TRACK, _me->y() ) );
}
}
else if( m_action == RESIZE_TRACK )
@@ -1429,7 +1473,7 @@ track::~track()
track * FASTCALL track::create( trackTypes _tt, trackContainer * _tc )
track * track::create( trackTypes _tt, trackContainer * _tc )
{
// while adding track, pause mixer for not getting into any trouble
// because of track being not created completely so far
@@ -1460,8 +1504,7 @@ track * FASTCALL track::create( trackTypes _tt, trackContainer * _tc )
track * FASTCALL track::create( const QDomElement & _this,
trackContainer * _tc )
track * track::create( const QDomElement & _this, trackContainer * _tc )
{
track * t = create( static_cast<trackTypes>( _this.attribute(
"type" ).toInt() ), _tc );
@@ -1472,7 +1515,7 @@ track * FASTCALL track::create( const QDomElement & _this,
track * FASTCALL track::clone( track * _track )
track * track::clone( track * _track )
{
QDomDocument doc;
QDomElement parent = doc.createElement( "clone" );
@@ -1492,7 +1535,7 @@ tact track::length( void ) const
void FASTCALL track::saveSettings( QDomDocument & _doc, QDomElement & _this )
void track::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
csize num_of_tcos = getTrackContentWidget()->numOfTCOs();
@@ -1518,7 +1561,7 @@ void FASTCALL track::saveSettings( QDomDocument & _doc, QDomElement & _this )
void FASTCALL track::loadSettings( const QDomElement & _this )
void track::loadSettings( const QDomElement & _this )
{
if( _this.attribute( "type" ).toInt() != type() )
{
@@ -1550,7 +1593,11 @@ void FASTCALL track::loadSettings( const QDomElement & _this )
trackContentObject * tco = createTCO(
midiTime( 0 ) );
tco->restoreState( node.toElement() );
getTrackContentWidget()->saveJournallingState(
FALSE );
addTCO( tco );
getTrackContentWidget()->
restoreJournallingState();
}
}
node = node.nextSibling();
@@ -1566,7 +1613,7 @@ void FASTCALL track::loadSettings( const QDomElement & _this )
trackContentObject * FASTCALL track::addTCO( trackContentObject * _tco )
trackContentObject * track::addTCO( trackContentObject * _tco )
{
return( getTrackContentWidget()->addTCO( _tco ) );
}
@@ -1574,7 +1621,7 @@ trackContentObject * FASTCALL track::addTCO( trackContentObject * _tco )
void FASTCALL track::removeTCO( csize _tco_num )
void track::removeTCO( csize _tco_num )
{
getTrackContentWidget()->removeTCO( _tco_num );
}
@@ -1590,7 +1637,7 @@ csize track::numOfTCOs( void )
trackContentObject * FASTCALL track::getTCO( csize _tco_num )
trackContentObject * track::getTCO( csize _tco_num )
{
return( getTrackContentWidget()->getTCO( _tco_num ) );
@@ -1599,7 +1646,7 @@ trackContentObject * FASTCALL track::getTCO( csize _tco_num )
csize FASTCALL track::getTCONum( trackContentObject * _tco )
csize track::getTCONum( trackContentObject * _tco )
{
for( csize i = 0; i < getTrackContentWidget()->numOfTCOs(); ++i )
{
@@ -1608,16 +1655,14 @@ csize FASTCALL track::getTCONum( trackContentObject * _tco )
return( i );
}
}
#ifdef LMMS_DEBUG
qFatal( "track::getTCONum(...) -> _tco not found!\n" );
#endif
qWarning( "track::getTCONum(...) -> _tco not found!\n" );
return( 0 );
}
void FASTCALL track::getTCOsInRange( vlist<trackContentObject *> & _tco_v,
void track::getTCOsInRange( vlist<trackContentObject *> & _tco_v,
const midiTime & _start,
const midiTime & _end )
{
@@ -1655,7 +1700,7 @@ void FASTCALL track::getTCOsInRange( vlist<trackContentObject *> & _tco_v,
void FASTCALL track::swapPositionOfTCOs( csize _tco_num1, csize _tco_num2 )
void track::swapPositionOfTCOs( csize _tco_num1, csize _tco_num2 )
{
getTrackContentWidget()->swapPositionOfTCOs( _tco_num1, _tco_num2 );
}

View File

@@ -61,6 +61,7 @@
#include "import_filter.h"
#include "instrument.h"
#include "rubberband.h"
#include "project_journal.h"
@@ -202,6 +203,10 @@ void trackContainer::cloneTrack( track * _track )
void trackContainer::addTrack( track * _track )
{
QMap<QString, QVariant> map;
map["id"] = _track->id();
addJournalEntry( journalEntry( ADD_TRACK, map ) );
m_trackWidgets.push_back( _track->getTrackWidget() );
#ifndef QT4
m_scrollArea->addChild( _track->getTrackWidget() );
@@ -221,6 +226,13 @@ void trackContainer::removeTrack( track * _track )
m_trackWidgets.end(), _track->getTrackWidget() );
if( it != m_trackWidgets.end() )
{
QMap<QString, QVariant> map;
multimediaProject mmp( multimediaProject::JOURNAL_DATA );
_track->saveState( mmp, mmp.content() );
map["id"] = _track->id();
map["state"] = mmp.toString();
addJournalEntry( journalEntry( REMOVE_TRACK, map ) );
eng()->getMixer()->pause();
#ifndef QT4
m_scrollArea->removeChild( _track->getTrackWidget() );
@@ -417,6 +429,60 @@ void trackContainer::setPixelsPerTact( Uint16 _ppt )
void trackContainer::undoStep( journalEntry & _je )
{
saveJournallingState( FALSE );
switch( _je.actionID() )
{
case ADD_TRACK:
{
QMap<QString, QVariant> map = _je.data().toMap();
track * tr =
dynamic_cast<track *>(
eng()->getProjectJournal()->getJournallingObject( map["id"].toInt() ) );
assert( tr != NULL );
multimediaProject mmp(
multimediaProject::JOURNAL_DATA );
tr->saveState( mmp, mmp.content() );
map["state"] = mmp.toString();
_je.data() = map;
removeTrack( tr );
break;
}
case REMOVE_TRACK:
{
multimediaProject mmp(
_je.data().toMap()["state"].toString(), FALSE );
track::create( mmp.content().firstChild().toElement(),
this );
break;
}
}
restoreJournallingState();
}
void trackContainer::redoStep( journalEntry & _je )
{
switch( _je.actionID() )
{
case ADD_TRACK:
case REMOVE_TRACK:
_je.actionID() = ( _je.actionID() == ADD_TRACK ) ?
REMOVE_TRACK : ADD_TRACK;
undoStep( _je );
_je.actionID() = ( _je.actionID() == ADD_TRACK ) ?
REMOVE_TRACK : ADD_TRACK;
break;
}
}
void trackContainer::dragEnterEvent( QDragEnterEvent * _dee )
{
stringPairDrag::processDragEnterEvent( _dee,

View File

@@ -69,6 +69,7 @@ journallingObject::~journallingObject()
void journallingObject::undo( void )
{
printf("undo: %d\n", id() );
if( m_journalEntries.empty() == TRUE )
{
return;
@@ -85,6 +86,7 @@ void journallingObject::undo( void )
void journallingObject::redo( void )
{
printf("undo: %d\n", id() );
if( m_journalEntries.empty() == TRUE )
{
return;
@@ -103,9 +105,9 @@ QDomElement journallingObject::saveState( QDomDocument & _doc,
QDomElement & _parent )
{
QDomElement _this = _doc.createElement( nodeName() );
_parent.appendChild( _this );
saveSettings( _doc, _this );
saveJournal( _doc, _this );
_parent.appendChild( _this );
return( _this );
}
@@ -115,7 +117,11 @@ QDomElement journallingObject::saveState( QDomDocument & _doc,
void journallingObject::restoreState( const QDomElement & _this )
{
saveJournallingState( FALSE );
// load actual settings
loadSettings( _this );
// search for journal-node
QDomNode node = _this.firstChild();
while( !node.isNull() )
{
@@ -125,13 +131,14 @@ void journallingObject::restoreState( const QDomElement & _this )
}
node = node.nextSibling();
}
restoreJournallingState();
}
void journallingObject::addJournalEntry( const journalEntry & _edit_step )
void journallingObject::addJournalEntry( const journalEntry & _je )
{
if( !( eng() == NULL ||
eng()->getProjectJournal()->isJournalling() == FALSE ||
@@ -139,7 +146,7 @@ void journallingObject::addJournalEntry( const journalEntry & _edit_step )
{
m_journalEntries.erase( m_currentJournalEntry,
m_journalEntries.end() );
m_journalEntries.push_back( _edit_step );
m_journalEntries.push_back( _je );
m_currentJournalEntry = m_journalEntries.end();
eng()->getProjectJournal()->journalEntryAdded( id() );
}

View File

@@ -152,10 +152,8 @@ multimediaProject::multimediaProject( const QString & _in_file_name,
}
}
QDomElement root = documentElement();
m_type = type( root.attribute( "type" ) );
QDomNode node = root.firstChild();
while( !node.isNull() )
{
@@ -308,7 +306,10 @@ QString multimediaProject::typeName( projectTypes _project_type )
{
if( _project_type >= UNKNOWN && _project_type < PROJ_TYPE_COUNT )
{
return( s_types[_project_type].m_name );
return( s_types[_project_type].m_name
#warning compat-code, remove in 0.3.0
.section( ',', 0, 0 )
);
}
return( s_types[UNKNOWN].m_name );
}

View File

@@ -80,6 +80,7 @@ void projectJournal::redo( void )
journallingObject * jo;
printf("%d\n", m_joIDs[*(m_currentJournalEntry+1)] );
if( m_currentJournalEntry < m_journalEntries.end() &&
( jo = m_joIDs[*m_currentJournalEntry++] ) != NULL )
{
@@ -97,7 +98,7 @@ void projectJournal::journalEntryAdded( const jo_id_t _id )
m_journalEntries.push_back( _id );
m_currentJournalEntry = m_journalEntries.end();
eng()->getSongEditor()->setModified();
printf("history size:%d\n", m_journalEntries.size());
printf("history size: %d\n", m_journalEntries.size() );
}
@@ -122,7 +123,7 @@ jo_id_t projectJournal::allocID( journallingObject * _obj )
void projectJournal::reallocID( const jo_id_t _id, journallingObject * _obj )
{
//printf("realloc %d %d\n", _id, _obj);
//printf("realloc %d %d\n", _id, _obj );
if( m_joIDs.contains( _id ) )
{
m_joIDs[_id] = _obj;
@@ -134,6 +135,7 @@ void projectJournal::reallocID( const jo_id_t _id, journallingObject * _obj )
void projectJournal::forgetAboutID( const jo_id_t _id )
{
printf("forget about %d\n", _id );
journalEntryVector::iterator it;
while( ( it = qFind( m_journalEntries.begin(), m_journalEntries.end(),
_id ) ) != m_journalEntries.end() )
@@ -150,12 +152,22 @@ void projectJournal::forgetAboutID( const jo_id_t _id )
void projectJournal::clear( void )
void projectJournal::clearInvalidJournallingObjects( void )
{
while( m_joIDs.size() )
vlist<journallingObject *>::const_iterator it;
for( joIDMap::iterator it = m_joIDs.begin(); it != m_joIDs.end(); )
{
forgetAboutID( m_joIDs.keys().front() );
if( it.data() == NULL )
{
forgetAboutID( it.key() );
it = m_joIDs.begin();
}
else
{
++it;
}
}
//clearJournal();
}

View File

@@ -357,7 +357,8 @@ bool FASTCALL bbTrack::play( const midiTime & _start,
{
if( _tco_num >= 0 )
{
return( eng()->getBBEditor()->play( _start, _start_frame, _frames,
return( eng()->getBBEditor()->play( _start, _start_frame,
_frames,
_frame_base,
s_infoMap[this] ) );
}
@@ -424,7 +425,8 @@ void bbTrack::saveTrackSpecificSettings( QDomDocument & _doc,
/* _this.setAttribute( "current", s_infoMap[this] ==
eng()->getBBEditor()->currentBB() );*/
if( s_infoMap[this] == 0 &&
_this.parentNode().nodeName() != "clone" )
_this.parentNode().nodeName() != "clone" &&
_this.parentNode().nodeName() != "journaldata" )
{
eng()->getBBEditor()->saveState( _doc, _this );
}

View File

@@ -415,7 +415,9 @@ void instrumentTrack::saveSettingsBtnClicked( void )
{
multimediaProject mmp(
multimediaProject::INSTRUMENT_TRACK_SETTINGS );
saveTrackSpecificSettings( mmp, mmp.content() );
QDomElement _this = mmp.createElement( nodeName() );
saveTrackSpecificSettings( mmp, _this );
mmp.content().appendChild( _this );
#ifdef QT4
mmp.writeFile( sfd.selectedFiles()[0] );
#else

View File

@@ -419,7 +419,7 @@ void pattern::saveSettings( QDomDocument & _doc, QDomElement & _this )
// pattern, we must not store actual position, instead we store -1
// which tells loadSettings() not to mess around with position
if( _this.parentNode().nodeName() == "clipboard" ||
_this.parentNode().nodeName() == "dnddata" )
_this.parentNode().nodeName() == "dnddata" )
{
_this.setAttribute( "pos", -1 );
}