root/branches/new_fx_rack_and_sample_fun/gui/src/SampleEditor/SampleEditor.cpp @ 629

Revision 629, 18.7 KB (checked in by wolke, 5 years ago)

sample editor restore changes into local session

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include "SampleEditor.h"
24#include "../HydrogenApp.h"
25#include "InstrumentEditor/InstrumentEditor.h"
26#include "InstrumentEditor/InstrumentEditorPanel.h"
27#include "../widgets/Button.h"
28
29#include "MainSampleWaveDisplay.h"
30#include "DetailWaveDisplay.h"
31#include "TargetWaveDisplay.h"
32
33#include <hydrogen/data_path.h>
34#include <hydrogen/h2_exception.h>
35#include <hydrogen/Preferences.h>
36#include <hydrogen/sample.h>
37#include <hydrogen/audio_engine.h>
38#include <hydrogen/hydrogen.h>
39
40#include <QModelIndex>
41#include <QTreeWidget>
42#include <QMessageBox>
43#include <algorithm>
44
45using namespace H2Core;
46using namespace std;
47
48SampleEditor::SampleEditor ( QWidget* pParent, int nSelectedLayer, QString mSamplefilename )
49                : QDialog ( pParent )
50                , Object ( "SampleEditor" )
51                , m_pSampleEditorStatus( true )
52                , m_pSamplefromFile ( NULL )
53                , m_pSelectedLayer ( nSelectedLayer )
54                , m_samplename ( mSamplefilename )
55                , m_pzoomfactor ( 1 )
56                , m_pdetailframe ( 0 )
57                , m_plineColor ( "default" )
58                , m_ponewayStart ( false )
59                , m_ponewayLoop ( false )
60                , m_ponewayEnd ( false )
61                , m_pslframes ( 0 )
62                , m_pPositionsRulerPath ( NULL )
63                , m_pPlayButton ( false )
64{
65        setupUi ( this );
66        INFOLOG ( "INIT" );
67
68        QString newfilename = mSamplefilename.section( '/', -1 );
69
70        setWindowTitle ( QString( "SampleEditor" + newfilename) );
71        setFixedSize ( width(), height() );
72        installEventFilter( this );
73
74//this new sample give us the not changed real samplelength
75        m_pSamplefromFile = Sample::load( mSamplefilename );
76
77//this
78        unsigned slframes = m_pSamplefromFile->get_n_frames();
79
80        LoopCountSpinBox->setRange(0, 20000 );
81        StartFrameSpinBox->setRange(0, slframes );
82        LoopFrameSpinBox->setRange(0, slframes );
83        EndFrameSpinBox->setRange(0, slframes );
84        EndFrameSpinBox->setValue( slframes );
85
86        intDisplays();
87        getAllFrameInfos();
88       
89
90
91//      m_pSample->set_end_frame( m_end_frame );
92
93// mainSampleview = 624(575) x 265 :-)
94// mainSampleAdjustView = 180 x 265 :-(
95// targetSampleView = 451 x 91 :-( will removed
96// StartFrameSpinBox :-)
97// LoopFrameSpinBox :-)
98// ProcessingTypeComboBox :forward, reverse, pingpong :-)
99// LoopCountSpinBox :-(
100// EndFrameSpinBox :-)
101// FadeOutFrameSpinBox :-(
102// FadeOutTypeComboBox: lin, log :-(
103// ApplyChangesPushButton :-()
104// PlayPushButton :-)
105// RestoreSamplePushButton :-(
106// ClosePushButton :-()
107// verticalzoomSlider
108
109        connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) );
110        connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) );
111        connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) );
112
113        m_pTimer = new QTimer(this);
114        connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateMainsamplePostionRuler()));
115}
116
117
118
119
120
121SampleEditor::~SampleEditor()
122{
123        delete m_pMainSampleWaveDisplay;
124        delete m_pSampleAdjustView;
125        delete m_pTargetSampleView;
126        delete m_pSamplefromFile;
127        INFOLOG ( "DESTROY" );
128}
129
130
131//this
132void SampleEditor::getAllFrameInfos()
133{
134        H2Core::Instrument *m_pInstrument = NULL;
135        Sample* pSample = NULL;
136        Song *pSong = Hydrogen::get_instance()->getSong();
137        if (pSong != NULL) {
138                InstrumentList *pInstrList = pSong->get_instrument_list();
139                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
140                if ( nInstr >= (int)pInstrList->get_size() ) {
141                        nInstr = -1;
142                }
143
144                if (nInstr == -1) {
145                        m_pInstrument = NULL;
146                }
147                else {
148                        m_pInstrument = pInstrList->get( nInstr );
149                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
150                }
151        }
152        H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
153        if ( pLayer ) {
154                pSample = pLayer->get_sample();
155        }
156
157//this values are needed if we restore a sample from from disk if a new song with sample changes will load
158        m_sample_is_modified = pSample->get_sample_is_modified();
159        m_sample_mode = pSample->get_sample_mode();
160        m_start_frame = pSample->get_start_frame();
161        m_loop_frame = pSample->get_loop_frame();
162        m_repeats = pSample->get_repeats();
163        m_end_frame = m_pSamplefromFile->get_end_frame();
164
165        m_fade_out_startframe = pSample->get_fade_out_startframe();
166        m_fade_out_type = pSample->get_fade_out_type();
167
168        if (m_sample_is_modified) {
169                m_end_frame = pSample->get_end_frame();
170
171                if ( m_sample_mode == "forward" )
172                        ProcessingTypeComboBox->setCurrentIndex ( 0 );
173                if ( m_sample_mode == "reverse" )
174                        ProcessingTypeComboBox->setCurrentIndex ( 1 );
175                if ( m_sample_mode == "pingpong" )
176                        ProcessingTypeComboBox->setCurrentIndex ( 2 );
177
178                StartFrameSpinBox->setValue( m_start_frame );
179                LoopFrameSpinBox->setValue( m_loop_frame );
180                EndFrameSpinBox->setValue( m_end_frame );
181                LoopCountSpinBox->setValue( m_repeats );
182                FadeOutFrameSpinBox->setValue( m_fade_out_startframe );
183                FadeOutTypeComboBox->setCurrentIndex( m_fade_out_type );
184
185                m_pMainSampleWaveDisplay->m_pStartFramePosition = m_start_frame / m_divider + 25 ;
186                m_pMainSampleWaveDisplay->updateDisplayPointer();
187                m_pMainSampleWaveDisplay->m_pLoopFramePosition =  m_loop_frame / m_divider + 25 ;
188                m_pMainSampleWaveDisplay->updateDisplayPointer();
189                m_pMainSampleWaveDisplay->m_pEndFramePosition =  m_end_frame / m_divider + 25 ;
190                m_pMainSampleWaveDisplay->updateDisplayPointer();
191
192        }
193}
194
195
196void SampleEditor::getAllLocalFrameInfos()
197{
198        m_start_frame = StartFrameSpinBox->value();
199        m_loop_frame = LoopFrameSpinBox->value();
200        m_repeats = LoopCountSpinBox->value();
201        m_end_frame = EndFrameSpinBox->value();
202
203}
204
205void SampleEditor::intDisplays()
206{
207        H2Core::Instrument *m_pInstrument = NULL;
208        Song *pSong = Hydrogen::get_instance()->getSong();
209        if (pSong != NULL) {
210                InstrumentList *pInstrList = pSong->get_instrument_list();
211                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
212                if ( nInstr >= (int)pInstrList->get_size() ) {
213                        nInstr = -1;
214                }
215
216                if (nInstr == -1) {
217                        m_pInstrument = NULL;
218                }
219                else {
220                        m_pInstrument = pInstrList->get( nInstr );
221                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
222                }
223        }
224
225        H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
226
227        QApplication::setOverrideCursor(Qt::WaitCursor);
228
229// wavedisplays
230        m_divider = m_pSamplefromFile->get_n_frames() / 574.0F;
231        m_pMainSampleWaveDisplay = new MainSampleWaveDisplay( mainSampleview );
232        m_pMainSampleWaveDisplay->updateDisplay( m_pSamplefromFile->get_filename() );
233        m_pMainSampleWaveDisplay->move( 1, 1 );
234
235        m_pSampleAdjustView = new DetailWaveDisplay( mainSampleAdjustView );
236        m_pSampleAdjustView->updateDisplay( m_pSamplefromFile->get_filename() );
237        m_pSampleAdjustView->move( 1, 1 );
238
239        m_pTargetSampleView = new TargetWaveDisplay( targetSampleView );
240        m_pTargetSampleView->updateDisplay( pLayer );
241        m_pTargetSampleView->move( 1, 1 );
242
243
244        QApplication::restoreOverrideCursor();
245
246}
247
248
249
250
251void SampleEditor::on_ClosePushButton_clicked()
252{
253        if ( !m_pSampleEditorStatus ){
254                int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. This changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
255                if ( err == 0 ){
256                        m_pSampleEditorStatus = true;
257                        accept();       
258                }else
259                {
260                        return;
261                }
262        }
263        accept();
264}
265
266
267
268void SampleEditor::on_PrevChangesPushButton_clicked()
269{
270        getAllLocalFrameInfos();       
271        createNewLayer();
272        m_pSampleEditorStatus = true;
273       
274}
275
276
277
278bool SampleEditor::getCloseQuestion()
279{
280        bool close = false;
281        int err = QMessageBox::information( this, "Hydrogen", tr( "Close dialog! maybe there is some unsaved work on sample.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
282        if ( err == 0 ) close = true;
283        return close;
284}
285
286
287
288/*
289void SampleEditor::getAllSampleProps()
290{
291
292        m_pSample->set_sample_is_modified( m_sample_is_modified );
293        m_pSample->set_sample_mode( m_sample_mode );
294        m_pSample->set_start_frame( m_start_frame );
295        m_pSample->set_loop_frame( m_loop_frame );
296        m_pSample->set_repeats( m_repeats );
297        m_pSample->set_end_frame( m_end_frame );
298        ERRORLOG( QString("setAllSampleProps: %1").arg(m_end_frame) );
299        m_pSample->set_fade_out_startframe( m_fade_out_startframe );
300        m_pSample->set_fade_out_type( m_fade_out_type );
301
302}
303*/
304
305
306void SampleEditor::createNewLayer()
307{
308        if ( !m_pSampleEditorStatus ){
309//              getAllFrameInfos();
310               
311                Sample *editSample = Sample::load_edit_wave( m_samplename,
312                                                            m_start_frame,
313                                                            m_loop_frame,
314                                                            m_end_frame,
315                                                            m_repeats,
316                                                            m_sample_mode,
317                                                            m_fade_out_startframe,
318                                                            m_fade_out_type);
319
320                AudioEngine::get_instance()->lock( "SampeEditor::insert new sample" );
321
322                H2Core::Instrument *m_pInstrument = NULL;
323                Song *pSong = Hydrogen::get_instance()->getSong();
324                if (pSong != NULL) {
325                        InstrumentList *pInstrList = pSong->get_instrument_list();
326                        int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
327                        if ( nInstr >= (int)pInstrList->get_size() ) {
328                                nInstr = -1;
329                        }
330       
331                        if (nInstr == -1) {
332                                m_pInstrument = NULL;
333                        }
334                        else {
335                                m_pInstrument = pInstrList->get( nInstr );
336                                //INFOLOG( "new instr: " + m_pInstrument->m_sName );
337                        }
338                }
339       
340                H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
341
342                Sample *oldSample = pLayer->get_sample();
343                delete oldSample;
344       
345                // insert new sample from newInstrument
346                pLayer->set_sample( editSample );
347
348                AudioEngine::get_instance()->unlock();
349                m_pTargetSampleView->updateDisplay( pLayer );
350                }
351               
352}
353
354void SampleEditor::mouseReleaseEvent(QMouseEvent *ev)
355{
356
357}
358
359
360
361void SampleEditor::returnAllMainWaveDisplayValues()
362{
363//      QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(m_pSample->get_n_frames()));
364        m_sample_is_modified = true;
365        m_start_frame = m_pMainSampleWaveDisplay->m_pStartFramePosition * m_divider - 25 * m_divider;
366        m_loop_frame = m_pMainSampleWaveDisplay->m_pLoopFramePosition  * m_divider - 25 * m_divider;
367        m_end_frame = m_pMainSampleWaveDisplay->m_pEndFramePosition  * m_divider - 25 * m_divider ;
368
369        StartFrameSpinBox->setValue( m_start_frame );
370        LoopFrameSpinBox->setValue( m_loop_frame );
371        EndFrameSpinBox->setValue( m_end_frame );
372        m_ponewayStart = true; 
373        m_ponewayLoop = true;
374        m_ponewayEnd = true;
375}
376
377
378
379void SampleEditor::valueChangedStartFrameSpinBox( int )
380{
381        m_pdetailframe = StartFrameSpinBox->value();
382        m_plineColor = "Start";
383        if ( !m_ponewayStart ){
384                m_pMainSampleWaveDisplay->m_pStartFramePosition = StartFrameSpinBox->value() / m_divider + 25 ;
385                m_pMainSampleWaveDisplay->updateDisplayPointer();
386                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
387                m_start_frame = StartFrameSpinBox->value();
388//              m_pMainSampleWaveDisplay->testPositionFromSampleeditor();
389                               
390        }else
391        {
392                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
393                m_ponewayStart = false;
394        }
395        testPositionsSpinBoxes();
396        m_pSampleEditorStatus = false;
397        //QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(StartFrameSpinBox->value() / m_divider + 25 ));
398}
399
400
401
402void SampleEditor::valueChangedLoopFrameSpinBox( int )
403{       
404        m_pdetailframe = LoopFrameSpinBox->value();
405        m_plineColor = "Loop";
406        if ( !m_ponewayLoop ){
407                m_pMainSampleWaveDisplay->m_pLoopFramePosition = LoopFrameSpinBox->value() / m_divider + 25 ;
408                m_pMainSampleWaveDisplay->updateDisplayPointer();
409                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
410                m_loop_frame = LoopFrameSpinBox->value();
411        }else
412        {
413                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
414                m_ponewayLoop = false;
415        }
416        testPositionsSpinBoxes();
417        m_pSampleEditorStatus = false;
418}
419
420
421
422void SampleEditor::valueChangedEndFrameSpinBox( int )
423{
424        m_pdetailframe = EndFrameSpinBox->value();
425        m_plineColor = "End";
426        if ( !m_ponewayEnd ){
427                m_pMainSampleWaveDisplay->m_pEndFramePosition = EndFrameSpinBox->value() / m_divider + 25 ;
428                m_pMainSampleWaveDisplay->updateDisplayPointer();
429                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
430                m_end_frame = EndFrameSpinBox->value();
431        }else
432        {
433                m_ponewayEnd = false;
434                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
435        }
436        testPositionsSpinBoxes();
437        m_pSampleEditorStatus = false;
438}
439
440
441void SampleEditor::on_PlayPushButton_clicked()
442{
443
444        const int selectedlayer = InstrumentEditorPanel::getInstance()->getselectedLayer();
445        const float pan_L = 0.5f;
446        const float pan_R = 0.5f;
447        const int nLength = -1;
448        const float fPitch = 0.0f;
449        Song *pSong = Hydrogen::get_instance()->getSong();
450       
451        Instrument *pInstr = pSong->get_instrument_list()->get( Hydrogen::get_instance()->getSelectedInstrumentNumber() );
452       
453        Note *pNote = new Note( pInstr, 0, pInstr->get_layer( selectedlayer )->get_end_velocity() - 0.01, pan_L, pan_R, nLength, fPitch);
454        AudioEngine::get_instance()->get_sampler()->note_on(pNote);
455
456
457        setSamplelengthFrames();
458        createPositionsRulerPath();
459        m_pPlayButton = true;
460        m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true);
461        m_pSampleAdjustView->setDetailSamplePosition( m_start_frame, m_pzoomfactor , 0);
462        m_pTimer->start(40);    // update ruler at 25 fps       
463        m_prealtimeframeend = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes;
464       
465}
466
467void SampleEditor::on_PlayOrigPushButton_clicked()
468{
469        Sample *pNewSample = Sample::load( m_samplename );
470        if ( pNewSample ){
471                int length = ( ( pNewSample->get_n_frames() / pNewSample->get_sample_rate() + 1) * 100 );
472                AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, length );
473        }
474
475        m_pslframes = pNewSample->get_n_frames();
476        m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true);
477        m_pSampleAdjustView->setDetailSamplePosition( m_start_frame, m_pzoomfactor , 0);
478        m_pTimer->start(40);    // update ruler at 25 fps       
479        m_prealtimeframeend = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes;
480}
481
482
483void SampleEditor::updateMainsamplePostionRuler()
484{
485        unsigned long realpos = Hydrogen::get_instance()->getRealtimeFrames();
486        if ( realpos < m_prealtimeframeend ){
487                unsigned frame = m_pslframes - ( m_prealtimeframeend  - realpos );
488                if ( m_pPlayButton == true){
489                        m_pMainSampleWaveDisplay->paintLocatorEvent( m_pPositionsRulerPath[frame] / m_divider + 25 , true);
490                        m_pSampleAdjustView->setDetailSamplePosition( m_pPositionsRulerPath[frame], m_pzoomfactor , 0);
491                }else{
492                        m_pMainSampleWaveDisplay->paintLocatorEvent( frame / m_divider + 25 , true);
493                        m_pSampleAdjustView->setDetailSamplePosition( frame, m_pzoomfactor , 0);
494                }
495//              ERRORLOG( QString("sampleval: %1").arg(frame) );
496        }else
497        {
498                m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false);
499//              m_pSampleAdjustView->setDetailSamplePosition( 0, m_pzoomfactor , 0);
500                m_pTimer->stop();
501                m_pPlayButton = false;
502        }
503}
504
505void SampleEditor::createPositionsRulerPath()
506{
507        setSamplelengthFrames();
508
509        unsigned onesamplelength =  m_end_frame - m_start_frame;
510        unsigned looplength =  m_end_frame - m_loop_frame;
511        unsigned repeatslength = looplength * m_repeats;
512        unsigned newlength = 0;
513        if (onesamplelength == looplength){     
514                newlength = onesamplelength + onesamplelength * m_repeats ;
515        }else
516        {
517                newlength =onesamplelength + repeatslength;
518        }
519
520        unsigned  normallength = m_pSamplefromFile->get_n_frames();
521
522        unsigned *normalframes = new unsigned[ normallength ];
523
524
525        for ( unsigned i = 0; i < normallength; i++ ) {
526                normalframes[i] = i;
527        }
528
529
530        unsigned *tempframes = new unsigned[ newlength ];
531        unsigned *loopframes = new unsigned[ looplength ];
532
533        QString loopmode = m_sample_mode;
534        long int z = m_loop_frame;
535        long int y = m_start_frame;
536
537        for ( unsigned i = 0; i < newlength; i++){ //first vector
538                tempframes[i] = 0;
539        }
540
541        for ( unsigned i = 0; i < onesamplelength; i++, y++){ //first vector
542
543                tempframes[i] = normalframes[y];
544        }
545
546        for ( unsigned i = 0; i < looplength; i++, z++){ //loop vector
547
548                loopframes[i] = normalframes[z];
549        }
550
551               
552        if ( loopmode == "reverse" ){
553                reverse(loopframes, loopframes + looplength);
554        }
555
556        if ( loopmode == "reverse" && m_repeats > 0 && m_start_frame == m_loop_frame ){
557                reverse( tempframes, tempframes + onesamplelength );           
558                }
559
560        if ( loopmode == "pingpong" &&  m_start_frame == m_loop_frame){
561                reverse(loopframes, loopframes + looplength);
562        }
563       
564        for ( int i = 0; i< m_repeats ;i++){                   
565                unsigned tempdataend = onesamplelength + ( looplength * i );
566                copy( loopframes, loopframes+looplength ,tempframes+ tempdataend );
567                if ( loopmode == "pingpong" && m_repeats > 1){
568                        reverse(loopframes, loopframes + looplength);
569                }
570
571        }
572
573       
574        if ( m_repeats == 0 && loopmode == "reverse" ){
575                reverse( tempframes + m_loop_frame, tempframes + newlength);           
576                }
577
578        m_pPositionsRulerPath = tempframes;
579}
580
581void SampleEditor::setSamplelengthFrames()
582{
583        getAllLocalFrameInfos();
584//      getAllFrameInfos();
585
586        //create new  sample length
587        unsigned onesamplelength =  m_end_frame - m_start_frame;
588        unsigned looplength =  m_end_frame - m_loop_frame ;
589        unsigned repeatslength = looplength * m_repeats;
590        unsigned newlength = 0;
591        if (onesamplelength == looplength){     
592                newlength = onesamplelength + onesamplelength * m_repeats ;
593        }else
594        {
595                newlength =onesamplelength + repeatslength;
596        }
597        m_pslframes = newlength;
598}
599
600
601
602void SampleEditor::on_LoopCountSpinBox_valueChanged( int )
603{
604        m_repeats = LoopCountSpinBox->value() ;
605        m_pSampleEditorStatus = false;
606}
607
608
609void SampleEditor::on_ProcessingTypeComboBox_currentIndexChanged( int )
610{
611        switch ( ProcessingTypeComboBox->currentIndex() ){
612                case 0 ://
613                        m_sample_mode = "forward";
614                        break;
615                case 1 ://
616                        m_sample_mode = "reverse";
617                        break;
618                case 2 ://
619                        m_sample_mode = "pingpong";
620                        break;
621                default:
622                        m_sample_mode = "forward";
623        }
624        m_pSampleEditorStatus = false;
625}
626
627
628
629
630void SampleEditor::on_verticalzoomSlider_valueChanged( int value )
631{
632        m_pzoomfactor = value / 10 +1;
633        m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor, m_plineColor );
634}
635
636
637void SampleEditor::testPositionsSpinBoxes()
638{
639//m_start_frame;
640//m_loop_frame;
641//m_end_frame;
642        if (  m_start_frame > m_loop_frame ) m_loop_frame = m_start_frame;
643        if (  m_start_frame > m_end_frame ) m_end_frame = m_start_frame;
644        if (  m_loop_frame > m_end_frame ) m_end_frame = m_loop_frame;
645        if (  m_end_frame < m_loop_frame ) m_loop_frame = m_end_frame;
646        if (  m_end_frame < m_start_frame ) m_start_frame = m_end_frame;
647        StartFrameSpinBox->setValue( m_start_frame );
648        LoopFrameSpinBox->setValue( m_loop_frame );
649        EndFrameSpinBox->setValue( m_end_frame );
650}
Note: See TracBrowser for help on using the browser.