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

Revision 630, 18.6 KB (checked in by wolke, 5 years ago)

sampleeditor restore settings

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        unsigned slframes = m_pSamplefromFile->get_n_frames();
78
79        LoopCountSpinBox->setRange(0, 20000 );
80        StartFrameSpinBox->setRange(0, slframes );
81        LoopFrameSpinBox->setRange(0, slframes );
82        EndFrameSpinBox->setRange(0, slframes );
83        EndFrameSpinBox->setValue( slframes );
84
85        intDisplays();
86        getAllFrameInfos();
87
88// mainSampleview = 624(575) x 265 :-)
89// mainSampleAdjustView = 180 x 265 :-(
90// targetSampleView = 451 x 91 :-( will removed
91// StartFrameSpinBox :-)
92// LoopFrameSpinBox :-)
93// ProcessingTypeComboBox :forward, reverse, pingpong :-)
94// LoopCountSpinBox :-(
95// EndFrameSpinBox :-)
96// FadeOutFrameSpinBox :-(
97// FadeOutTypeComboBox: lin, log :-(
98// ApplyChangesPushButton :-()
99// PlayPushButton :-)
100// RestoreSamplePushButton :-(
101// ClosePushButton :-()
102// verticalzoomSlider
103
104        connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) );
105        connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) );
106        connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) );
107
108        m_pTimer = new QTimer(this);
109        connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateMainsamplePostionRuler()));
110}
111
112
113
114SampleEditor::~SampleEditor()
115{
116        delete m_pMainSampleWaveDisplay;
117        delete m_pSampleAdjustView;
118        delete m_pTargetSampleView;
119        delete m_pSamplefromFile;
120        INFOLOG ( "DESTROY" );
121}
122
123
124
125
126void SampleEditor::getAllFrameInfos()
127{
128        H2Core::Instrument *m_pInstrument = NULL;
129        Sample* pSample = NULL;
130        Song *pSong = Hydrogen::get_instance()->getSong();
131        if (pSong != NULL) {
132                InstrumentList *pInstrList = pSong->get_instrument_list();
133                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
134                if ( nInstr >= (int)pInstrList->get_size() ) {
135                        nInstr = -1;
136                }
137
138                if (nInstr == -1) {
139                        m_pInstrument = NULL;
140                }
141                else {
142                        m_pInstrument = pInstrList->get( nInstr );
143                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
144                }
145        }
146        H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
147        if ( pLayer ) {
148                pSample = pLayer->get_sample();
149        }
150
151//this values are needed if we restore a sample from from disk if a new song with sample changes will load
152        m_sample_is_modified = pSample->get_sample_is_modified();
153        m_sample_mode = pSample->get_sample_mode();
154        m_start_frame = pSample->get_start_frame();
155        m_loop_frame = pSample->get_loop_frame();
156        m_repeats = pSample->get_repeats();
157        m_end_frame = m_pSamplefromFile->get_end_frame();
158
159        m_fade_out_startframe = pSample->get_fade_out_startframe();
160        m_fade_out_type = pSample->get_fade_out_type();
161
162        if (m_sample_is_modified) {
163                m_end_frame = pSample->get_end_frame();
164
165                if ( m_sample_mode == "forward" )
166                        ProcessingTypeComboBox->setCurrentIndex ( 0 );
167                if ( m_sample_mode == "reverse" )
168                        ProcessingTypeComboBox->setCurrentIndex ( 1 );
169                if ( m_sample_mode == "pingpong" )
170                        ProcessingTypeComboBox->setCurrentIndex ( 2 );
171
172                StartFrameSpinBox->setValue( m_start_frame );
173                LoopFrameSpinBox->setValue( m_loop_frame );
174                EndFrameSpinBox->setValue( m_end_frame );
175                LoopCountSpinBox->setValue( m_repeats );
176                FadeOutFrameSpinBox->setValue( m_fade_out_startframe );
177                FadeOutTypeComboBox->setCurrentIndex( m_fade_out_type );
178
179                m_pMainSampleWaveDisplay->m_pStartFramePosition = m_start_frame / m_divider + 25 ;
180                m_pMainSampleWaveDisplay->updateDisplayPointer();
181                m_pMainSampleWaveDisplay->m_pLoopFramePosition =  m_loop_frame / m_divider + 25 ;
182                m_pMainSampleWaveDisplay->updateDisplayPointer();
183                m_pMainSampleWaveDisplay->m_pEndFramePosition =  m_end_frame / m_divider + 25 ;
184                m_pMainSampleWaveDisplay->updateDisplayPointer();
185
186        }
187}
188
189
190void SampleEditor::getAllLocalFrameInfos()
191{
192        m_start_frame = StartFrameSpinBox->value();
193        m_loop_frame = LoopFrameSpinBox->value();
194        m_repeats = LoopCountSpinBox->value();
195        m_end_frame = EndFrameSpinBox->value();
196
197}
198
199
200
201void SampleEditor::intDisplays()
202{
203        H2Core::Instrument *m_pInstrument = NULL;
204        Song *pSong = Hydrogen::get_instance()->getSong();
205        if (pSong != NULL) {
206                InstrumentList *pInstrList = pSong->get_instrument_list();
207                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
208                if ( nInstr >= (int)pInstrList->get_size() ) {
209                        nInstr = -1;
210                }
211
212                if (nInstr == -1) {
213                        m_pInstrument = NULL;
214                }
215                else {
216                        m_pInstrument = pInstrList->get( nInstr );
217                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
218                }
219        }
220
221        H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
222
223        QApplication::setOverrideCursor(Qt::WaitCursor);
224
225// wavedisplays
226        m_divider = m_pSamplefromFile->get_n_frames() / 574.0F;
227        m_pMainSampleWaveDisplay = new MainSampleWaveDisplay( mainSampleview );
228        m_pMainSampleWaveDisplay->updateDisplay( m_pSamplefromFile->get_filename() );
229        m_pMainSampleWaveDisplay->move( 1, 1 );
230
231        m_pSampleAdjustView = new DetailWaveDisplay( mainSampleAdjustView );
232        m_pSampleAdjustView->updateDisplay( m_pSamplefromFile->get_filename() );
233        m_pSampleAdjustView->move( 1, 1 );
234
235        m_pTargetSampleView = new TargetWaveDisplay( targetSampleView );
236        m_pTargetSampleView->updateDisplay( pLayer );
237        m_pTargetSampleView->move( 1, 1 );
238
239        QApplication::restoreOverrideCursor();
240
241}
242
243
244
245void SampleEditor::on_ClosePushButton_clicked()
246{
247        if ( !m_pSampleEditorStatus ){
248                int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. This changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
249                if ( err == 0 ){
250                        m_pSampleEditorStatus = true;
251                        accept();       
252                }else
253                {
254                        return;
255                }
256        }
257        accept();
258}
259
260
261
262void SampleEditor::on_PrevChangesPushButton_clicked()
263{
264        getAllLocalFrameInfos();       
265        createNewLayer();
266        m_pSampleEditorStatus = true;
267       
268}
269
270
271
272bool SampleEditor::getCloseQuestion()
273{
274        bool close = false;
275        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 );
276        if ( err == 0 ) close = true;
277        return close;
278}
279
280
281
282/*
283void SampleEditor::getAllSampleProps()
284{
285
286        m_pSample->set_sample_is_modified( m_sample_is_modified );
287        m_pSample->set_sample_mode( m_sample_mode );
288        m_pSample->set_start_frame( m_start_frame );
289        m_pSample->set_loop_frame( m_loop_frame );
290        m_pSample->set_repeats( m_repeats );
291        m_pSample->set_end_frame( m_end_frame );
292        ERRORLOG( QString("setAllSampleProps: %1").arg(m_end_frame) );
293        m_pSample->set_fade_out_startframe( m_fade_out_startframe );
294        m_pSample->set_fade_out_type( m_fade_out_type );
295
296}
297*/
298
299
300
301void SampleEditor::createNewLayer()
302{
303        if ( !m_pSampleEditorStatus ){
304//              getAllFrameInfos();
305               
306                Sample *editSample = Sample::load_edit_wave( m_samplename,
307                                                            m_start_frame,
308                                                            m_loop_frame,
309                                                            m_end_frame,
310                                                            m_repeats,
311                                                            m_sample_mode,
312                                                            m_fade_out_startframe,
313                                                            m_fade_out_type);
314
315                AudioEngine::get_instance()->lock( "SampeEditor::insert new sample" );
316
317                H2Core::Instrument *m_pInstrument = NULL;
318                Song *pSong = Hydrogen::get_instance()->getSong();
319                if (pSong != NULL) {
320                        InstrumentList *pInstrList = pSong->get_instrument_list();
321                        int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
322                        if ( nInstr >= (int)pInstrList->get_size() ) {
323                                nInstr = -1;
324                        }
325       
326                        if (nInstr == -1) {
327                                m_pInstrument = NULL;
328                        }
329                        else {
330                                m_pInstrument = pInstrList->get( nInstr );
331                                //INFOLOG( "new instr: " + m_pInstrument->m_sName );
332                        }
333                }
334       
335                H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
336
337                Sample *oldSample = pLayer->get_sample();
338                delete oldSample;
339       
340                // insert new sample from newInstrument
341                pLayer->set_sample( editSample );
342
343                AudioEngine::get_instance()->unlock();
344                m_pTargetSampleView->updateDisplay( pLayer );
345                }
346               
347}
348
349
350
351void SampleEditor::mouseReleaseEvent(QMouseEvent *ev)
352{
353
354}
355
356
357
358void SampleEditor::returnAllMainWaveDisplayValues()
359{
360//      QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(m_pSample->get_n_frames()));
361        m_sample_is_modified = true;
362        m_start_frame = m_pMainSampleWaveDisplay->m_pStartFramePosition * m_divider - 25 * m_divider;
363        m_loop_frame = m_pMainSampleWaveDisplay->m_pLoopFramePosition  * m_divider - 25 * m_divider;
364        m_end_frame = m_pMainSampleWaveDisplay->m_pEndFramePosition  * m_divider - 25 * m_divider ;
365
366        StartFrameSpinBox->setValue( m_start_frame );
367        LoopFrameSpinBox->setValue( m_loop_frame );
368        EndFrameSpinBox->setValue( m_end_frame );
369        m_ponewayStart = true; 
370        m_ponewayLoop = true;
371        m_ponewayEnd = true;
372}
373
374
375
376void SampleEditor::valueChangedStartFrameSpinBox( int )
377{
378        m_pdetailframe = StartFrameSpinBox->value();
379        m_plineColor = "Start";
380        if ( !m_ponewayStart ){
381                m_pMainSampleWaveDisplay->m_pStartFramePosition = StartFrameSpinBox->value() / m_divider + 25 ;
382                m_pMainSampleWaveDisplay->updateDisplayPointer();
383                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
384                m_start_frame = StartFrameSpinBox->value();
385//              m_pMainSampleWaveDisplay->testPositionFromSampleeditor();
386                               
387        }else
388        {
389                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
390                m_ponewayStart = false;
391        }
392        testPositionsSpinBoxes();
393        m_pSampleEditorStatus = false;
394        //QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(StartFrameSpinBox->value() / m_divider + 25 ));
395}
396
397
398
399void SampleEditor::valueChangedLoopFrameSpinBox( int )
400{       
401        m_pdetailframe = LoopFrameSpinBox->value();
402        m_plineColor = "Loop";
403        if ( !m_ponewayLoop ){
404                m_pMainSampleWaveDisplay->m_pLoopFramePosition = LoopFrameSpinBox->value() / m_divider + 25 ;
405                m_pMainSampleWaveDisplay->updateDisplayPointer();
406                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
407                m_loop_frame = LoopFrameSpinBox->value();
408        }else
409        {
410                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
411                m_ponewayLoop = false;
412        }
413        testPositionsSpinBoxes();
414        m_pSampleEditorStatus = false;
415}
416
417
418
419void SampleEditor::valueChangedEndFrameSpinBox( int )
420{
421        m_pdetailframe = EndFrameSpinBox->value();
422        m_plineColor = "End";
423        if ( !m_ponewayEnd ){
424                m_pMainSampleWaveDisplay->m_pEndFramePosition = EndFrameSpinBox->value() / m_divider + 25 ;
425                m_pMainSampleWaveDisplay->updateDisplayPointer();
426                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
427                m_end_frame = EndFrameSpinBox->value();
428        }else
429        {
430                m_ponewayEnd = false;
431                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
432        }
433        testPositionsSpinBoxes();
434        m_pSampleEditorStatus = false;
435}
436
437
438
439void SampleEditor::on_PlayPushButton_clicked()
440{
441
442        const int selectedlayer = InstrumentEditorPanel::getInstance()->getselectedLayer();
443        const float pan_L = 0.5f;
444        const float pan_R = 0.5f;
445        const int nLength = -1;
446        const float fPitch = 0.0f;
447        Song *pSong = Hydrogen::get_instance()->getSong();
448       
449        Instrument *pInstr = pSong->get_instrument_list()->get( Hydrogen::get_instance()->getSelectedInstrumentNumber() );
450       
451        Note *pNote = new Note( pInstr, 0, pInstr->get_layer( selectedlayer )->get_end_velocity() - 0.01, pan_L, pan_R, nLength, fPitch);
452        AudioEngine::get_instance()->get_sampler()->note_on(pNote);
453
454
455        setSamplelengthFrames();
456        createPositionsRulerPath();
457        m_pPlayButton = true;
458        m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true);
459        m_pSampleAdjustView->setDetailSamplePosition( m_start_frame, m_pzoomfactor , 0);
460        m_pTimer->start(40);    // update ruler at 25 fps       
461        m_prealtimeframeend = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes;
462       
463}
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
483
484void SampleEditor::updateMainsamplePostionRuler()
485{
486        unsigned long realpos = Hydrogen::get_instance()->getRealtimeFrames();
487        if ( realpos < m_prealtimeframeend ){
488                unsigned frame = m_pslframes - ( m_prealtimeframeend  - realpos );
489                if ( m_pPlayButton == true){
490                        m_pMainSampleWaveDisplay->paintLocatorEvent( m_pPositionsRulerPath[frame] / m_divider + 25 , true);
491                        m_pSampleAdjustView->setDetailSamplePosition( m_pPositionsRulerPath[frame], m_pzoomfactor , 0);
492                }else{
493                        m_pMainSampleWaveDisplay->paintLocatorEvent( frame / m_divider + 25 , true);
494                        m_pSampleAdjustView->setDetailSamplePosition( frame, m_pzoomfactor , 0);
495                }
496//              ERRORLOG( QString("sampleval: %1").arg(frame) );
497        }else
498        {
499                m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false);
500//              m_pSampleAdjustView->setDetailSamplePosition( 0, m_pzoomfactor , 0);
501                m_pTimer->stop();
502                m_pPlayButton = false;
503        }
504}
505
506
507
508void SampleEditor::createPositionsRulerPath()
509{
510        setSamplelengthFrames();
511
512        unsigned onesamplelength =  m_end_frame - m_start_frame;
513        unsigned looplength =  m_end_frame - m_loop_frame;
514        unsigned repeatslength = looplength * m_repeats;
515        unsigned newlength = 0;
516        if (onesamplelength == looplength){     
517                newlength = onesamplelength + onesamplelength * m_repeats ;
518        }else
519        {
520                newlength =onesamplelength + repeatslength;
521        }
522
523        unsigned  normallength = m_pSamplefromFile->get_n_frames();
524
525        unsigned *normalframes = new unsigned[ normallength ];
526
527
528        for ( unsigned i = 0; i < normallength; i++ ) {
529                normalframes[i] = i;
530        }
531
532
533        unsigned *tempframes = new unsigned[ newlength ];
534        unsigned *loopframes = new unsigned[ looplength ];
535
536        QString loopmode = m_sample_mode;
537        long int z = m_loop_frame;
538        long int y = m_start_frame;
539
540        for ( unsigned i = 0; i < newlength; i++){ //first vector
541                tempframes[i] = 0;
542        }
543
544        for ( unsigned i = 0; i < onesamplelength; i++, y++){ //first vector
545
546                tempframes[i] = normalframes[y];
547        }
548
549        for ( unsigned i = 0; i < looplength; i++, z++){ //loop vector
550
551                loopframes[i] = normalframes[z];
552        }
553
554               
555        if ( loopmode == "reverse" ){
556                reverse(loopframes, loopframes + looplength);
557        }
558
559        if ( loopmode == "reverse" && m_repeats > 0 && m_start_frame == m_loop_frame ){
560                reverse( tempframes, tempframes + onesamplelength );           
561                }
562
563        if ( loopmode == "pingpong" &&  m_start_frame == m_loop_frame){
564                reverse(loopframes, loopframes + looplength);
565        }
566       
567        for ( int i = 0; i< m_repeats ;i++){                   
568                unsigned tempdataend = onesamplelength + ( looplength * i );
569                copy( loopframes, loopframes+looplength ,tempframes+ tempdataend );
570                if ( loopmode == "pingpong" && m_repeats > 1){
571                        reverse(loopframes, loopframes + looplength);
572                }
573
574        }
575
576       
577        if ( m_repeats == 0 && loopmode == "reverse" ){
578                reverse( tempframes + m_loop_frame, tempframes + newlength);           
579                }
580
581        m_pPositionsRulerPath = tempframes;
582}
583
584
585
586void SampleEditor::setSamplelengthFrames()
587{
588        getAllLocalFrameInfos();
589//      getAllFrameInfos();
590
591        //create new  sample length
592        unsigned onesamplelength =  m_end_frame - m_start_frame;
593        unsigned looplength =  m_end_frame - m_loop_frame ;
594        unsigned repeatslength = looplength * m_repeats;
595        unsigned newlength = 0;
596        if (onesamplelength == looplength){     
597                newlength = onesamplelength + onesamplelength * m_repeats ;
598        }else
599        {
600                newlength =onesamplelength + repeatslength;
601        }
602        m_pslframes = newlength;
603}
604
605
606
607void SampleEditor::on_LoopCountSpinBox_valueChanged( int )
608{
609        m_repeats = LoopCountSpinBox->value() ;
610        m_pSampleEditorStatus = false;
611}
612
613
614
615void SampleEditor::on_ProcessingTypeComboBox_currentIndexChanged( int )
616{
617        switch ( ProcessingTypeComboBox->currentIndex() ){
618                case 0 ://
619                        m_sample_mode = "forward";
620                        break;
621                case 1 ://
622                        m_sample_mode = "reverse";
623                        break;
624                case 2 ://
625                        m_sample_mode = "pingpong";
626                        break;
627                default:
628                        m_sample_mode = "forward";
629        }
630        m_pSampleEditorStatus = false;
631}
632
633
634
635void SampleEditor::on_verticalzoomSlider_valueChanged( int value )
636{
637        m_pzoomfactor = value / 10 +1;
638        m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor, m_plineColor );
639}
640
641
642
643void SampleEditor::testPositionsSpinBoxes()
644{
645
646        if (  m_start_frame > m_loop_frame ) m_loop_frame = m_start_frame;
647        if (  m_start_frame > m_end_frame ) m_end_frame = m_start_frame;
648        if (  m_loop_frame > m_end_frame ) m_end_frame = m_loop_frame;
649        if (  m_end_frame < m_loop_frame ) m_loop_frame = m_end_frame;
650        if (  m_end_frame < m_start_frame ) m_start_frame = m_end_frame;
651        StartFrameSpinBox->setValue( m_start_frame );
652        LoopFrameSpinBox->setValue( m_loop_frame );
653        EndFrameSpinBox->setValue( m_end_frame );
654}
Note: See TracBrowser for help on using the browser.