Changeset 1088
- Timestamp:
- 04/27/09 03:42:06 (4 years ago)
- Location:
- branches/transport_redesign_2
- Files:
-
- 2 added
- 6 modified
-
gui/src/PlayerControl.cpp (modified) (3 diffs)
-
libs/hydrogen/include/hydrogen/hydrogen.h (modified) (1 diff)
-
libs/hydrogen/src/hydrogen.cpp (modified) (1 diff)
-
libs/hydrogen/src/song.cpp (modified) (1 diff)
-
libs/hydrogen/src/transport/H2Transport.cpp (modified) (8 diffs)
-
libs/hydrogen/src/transport/H2Transport.h (modified) (1 diff)
-
libs/hydrogen/src/transport/JackTimeMaster.cpp (added)
-
libs/hydrogen/src/transport/JackTimeMaster.h (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/transport_redesign_2/gui/src/PlayerControl.cpp
r1080 r1088 540 540 { 541 541 m_pJackMasterBtn->setPressed(false); 542 Hydrogen::get_instance()-> offJackMaster();542 Hydrogen::get_instance()->clearJackTimeMaster(); 543 543 pPref->m_bJackMasterMode = Preferences::NO_JACK_TIME_MASTER; 544 544 } … … 845 845 AudioEngine::get_instance()->unlock(); 846 846 (HydrogenApp::getInstance())->setStatusBarMessage(trUtf8(" Jack-Time-Master mode = On"), 5000); 847 Hydrogen::get_instance()-> onJackMaster();847 Hydrogen::get_instance()->setJackTimeMaster(false); 848 848 849 849 } … … 854 854 (HydrogenApp::getInstance())->setStatusBarMessage(trUtf8(" Jack-Time-Master mode = Off"), 5000); 855 855 //m_pControlsBBTPanel->hide(); 856 Hydrogen::get_instance()-> offJackMaster();856 Hydrogen::get_instance()->clearJackTimeMaster(); 857 857 } 858 858 -
branches/transport_redesign_2/libs/hydrogen/include/hydrogen/hydrogen.h
r1087 r1088 193 193 194 194 /// jack time master 195 unsigned long getHumantimeFrames(); 196 void setHumantimeFrames(unsigned long hframes); 197 void offJackMaster(); 198 void onJackMaster(); 199 unsigned long getTimeMasterFrames(); 200 long getTickForHumanPosition( int humanpos ); 201 float getNewBpmJTM(); 202 void setNewBpmJTM( float bpmJTM); 195 bool setJackTimeMaster(bool if_none_already = false); // Returns true if we became master 196 void clearJackTimeMaster(); 197 bool getJackTimeMaster(); /* Note: There's no way to know for sure 198 if we are _actually_ the JACK time master. */ 199 ///~jack time master 203 200 204 201 void __panic(); -
branches/transport_redesign_2/libs/hydrogen/src/hydrogen.cpp
r1087 r1088 2369 2369 2370 2370 // jack transport master 2371 unsigned long Hydrogen::getHumantimeFrames() 2372 { 2373 return m_nHumantimeFrames; 2374 } 2375 2376 void Hydrogen::setHumantimeFrames(unsigned long hframes) 2377 { 2378 m_nHumantimeFrames = hframes; 2379 } 2380 2381 2382 2383 #ifdef JACK_SUPPORT 2384 void Hydrogen::offJackMaster() 2385 { 2386 static_cast< JackOutput* >( m_pAudioDriver )->com_release(); 2387 } 2388 2389 void Hydrogen::onJackMaster() 2390 { 2391 static_cast< JackOutput* >( m_pAudioDriver )->initTimeMaster(); 2392 } 2393 2394 unsigned long Hydrogen::getTimeMasterFrames() 2395 { 2396 float allframes = 0 ; 2397 2398 if ( m_pAudioDriver->m_transport.m_status == TransportInfo::STOPPED ){ 2399 2400 int oldtick = getTickPosition(); 2401 for (int i = 0; i <= getPatternPos(); i++){ 2402 float framesforposition = 2403 (long)getTickForHumanPosition(i) 2404 * (float)m_pAudioDriver->m_transport.m_nTickSize; 2405 allframes = framesforposition + allframes; 2406 } 2407 unsigned long framesfortimemaster = (unsigned int)( 2408 allframes 2409 + oldtick * (float)m_pAudioDriver->m_transport.m_nTickSize 2410 ); 2411 m_nHumantimeFrames = framesfortimemaster; 2412 return framesfortimemaster; 2413 }else 2414 { 2415 return m_nHumantimeFrames; 2416 } 2417 } 2418 #endif 2419 2420 long Hydrogen::getTickForHumanPosition( int humanpos ) 2421 { 2422 std::vector< PatternList* > * columns = m_pSong->get_pattern_group_vector(); 2423 2424 int nPatternGroups = columns->size(); 2425 if ( humanpos >= nPatternGroups ) { 2426 if ( m_pSong->is_loop_enabled() ) { 2427 humanpos = humanpos % nPatternGroups; 2428 } else { 2429 return -1; 2430 } 2431 } 2432 2433 // std::vector<PatternList*> *pColumns = 2434 // m_pSong->get_pattern_group_vector()[ humanpos - 1 ] 2435 // .get( 0 )->get_length(); 2436 2437 // ERRORLOG( "Kick me!" ); 2438 if ( humanpos == 0 ) return 0; 2439 Pattern *pPattern = columns->at( humanpos - 1 )->get( 0 ); 2440 if ( pPattern ) { 2441 return pPattern->get_length(); 2442 } else { 2443 return MAX_NOTES; 2444 } 2445 // int nPatternSize; 2446 2447 // pColumns 2448 2449 /* Pattern *pPattern = NULL; 2450 for ( int i = 0; i < humanpos; ++i ) { 2451 PatternList *pColumn = ( *pColumns )[ i ]; 2452 pPattern = pColumn->get( 0 ); 2453 if ( pPattern ) { 2454 nPatternSize = pPattern->get_length(); 2455 } else { 2456 nPatternSize = MAX_NOTES; 2457 } 2458 2459 humanTick = nPatternSize; 2460 }*/ 2461 // return humanTick; 2462 } 2463 2464 2465 2466 float Hydrogen::getNewBpmJTM() 2467 { 2468 return m_nNewBpmJTM; 2469 } 2470 2471 void Hydrogen::setNewBpmJTM( float bpmJTM ) 2472 { 2473 m_nNewBpmJTM = bpmJTM; 2474 } 2475 2371 2372 bool Hydrogen::setJackTimeMaster(bool if_none_already) 2373 { 2374 return m_pTransport->setJackTimeMaster(if_none_already); 2375 } 2376 2377 void Hydrogen::clearJackTimeMaster() 2378 { 2379 m_pTransport->clearJackTimeMaster(); 2380 } 2381 2382 bool Hydrogen::getJackTimeMaster() 2383 { 2384 return m_pTransport->getJackTimeMaster(); 2385 } 2476 2386 2477 2387 //~ jack transport master -
branches/transport_redesign_2/libs/hydrogen/src/song.cpp
r1074 r1088 271 271 272 272 float fBpm = LocalFileMng::readXmlFloat( songNode, "bpm", 120 ); 273 Hydrogen::get_instance()->setNewBpmJTM( fBpm );274 273 float fVolume = LocalFileMng::readXmlFloat( songNode, "volume", 0.5 ); 275 274 float fMetronomeVolume = LocalFileMng::readXmlFloat( songNode, "metronomeVolume", 0.5 ); -
branches/transport_redesign_2/libs/hydrogen/src/transport/H2Transport.cpp
r1082 r1088 21 21 */ 22 22 23 #include <memory> 23 24 #include <hydrogen/event_queue.h> 24 25 #include "H2Transport.h" 25 26 #include "SimpleTransportMaster.h" 27 #include "JackTimeMaster.h" 26 28 27 29 using namespace H2Core; … … 30 32 { 31 33 public: 32 Transport* xport; 34 std::auto_ptr<Transport> xport; 35 36 /* This is used as a heartbeat signal with the JACK transport. 37 * It always sets it true. We always set it false. If it's 38 * ever false, then we're no longer being called... and probably 39 * no longer the transport master. 40 */ 41 bool presumed_jtm; // We *think* we're the Jack time master. 42 bool heartbeat_jtm; 43 std::auto_ptr<JackTimeMaster> jtm; 44 Song* pSong; // Cached pointer for JTM 33 45 }; 34 46 … … 37 49 { 38 50 d = new H2TransportPrivate; 39 d->xport = new SimpleTransportMaster; 51 d->xport.reset( new SimpleTransportMaster ); 52 d->presumed_jtm = false; 53 d->heartbeat_jtm = false; 54 d->pSong = 0; 40 55 } 41 56 42 57 H2Transport::~H2Transport() 43 58 { 44 delete d->xport;45 59 delete d; 46 60 } … … 48 62 int H2Transport::locate(uint32_t frame) 49 63 { 50 if(d->xport ) return d->xport->locate(frame);64 if(d->xport.get()) return d->xport->locate(frame); 51 65 return -1; 52 66 } … … 54 68 int H2Transport::locate(uint32_t bar, uint32_t beat, uint32_t tick) 55 69 { 56 if(d->xport ) return d->xport->locate(bar, beat, tick);70 if(d->xport.get()) return d->xport->locate(bar, beat, tick); 57 71 return -1; 58 72 } … … 61 75 { 62 76 EventQueue::get_instance()->push_event( EVENT_TRANSPORT, (int)TransportPosition::ROLLING ); 63 if(d->xport ) d->xport->start();77 if(d->xport.get()) d->xport->start(); 64 78 } 65 79 … … 67 81 { 68 82 EventQueue::get_instance()->push_event( EVENT_TRANSPORT, (int)TransportPosition::STOPPED ); 69 if(d->xport ) d->xport->stop();83 if(d->xport.get()) d->xport->stop(); 70 84 } 71 85 72 86 void H2Transport::get_position(TransportPosition* pos) 73 87 { 74 if(d->xport ) d->xport->get_position(pos);88 if(d->xport.get()) d->xport->get_position(pos); 75 89 } 76 90 77 91 void H2Transport::processed_frames(uint32_t nFrames) 78 92 { 79 if(d->xport) d->xport->processed_frames(nFrames); 93 if( d->heartbeat_jtm == false && d->presumed_jtm == true ) { 94 EventQueue::get_instance()->push_event( EVENT_JACK_MASTER, JACK_MASTER_NO_MORE ); 95 d->presumed_jtm = false; 96 } 97 d->heartbeat_jtm = false; 98 99 if(d->xport.get()) d->xport->processed_frames(nFrames); 80 100 } 81 101 82 102 void H2Transport::set_current_song(Song* s) 83 103 { 84 if(d->xport) d->xport->set_current_song(s); 104 d->pSong = s; 105 if( d->jtm.get() ) { 106 d->jtm->set_current_song(s); 107 } 108 if(d->xport.get()) d->xport->set_current_song(s); 85 109 } 86 110 87 111 uint32_t H2Transport::get_current_frame() 88 112 { 89 if(d->xport ) {113 if(d->xport.get()) { 90 114 return d->xport->get_current_frame(); 91 115 } … … 95 119 TransportPosition::State H2Transport::get_state() 96 120 { 97 if(d->xport ) {121 if(d->xport.get()) { 98 122 return d->xport->get_state(); 99 123 } 100 124 return TransportPosition::STOPPED; 101 125 } 126 127 bool H2Transport::setJackTimeMaster(bool if_none_already) 128 { 129 if( ! d->jtm.get() ) { 130 d->jtm.reset( new JackTimeMaster ); 131 d->jtm->set_current_song( d->pSong ); 132 } 133 return d->jtm->setMaster(if_none_already); 134 } 135 136 void H2Transport::clearJackTimeMaster() 137 { 138 if( d->jtm.get() ) { 139 d->jtm->clearMaster(); 140 } 141 } 142 143 bool H2Transport::getJackTimeMaster() 144 { 145 return d->presumed_jtm; 146 } -
branches/transport_redesign_2/libs/hydrogen/src/transport/H2Transport.h
r1081 r1088 68 68 virtual TransportPosition::State get_state(void); 69 69 70 // Special Methods for Jack Transport. 71 bool setJackTimeMaster(bool if_none_already = false); 72 void clearJackTimeMaster(); 73 bool getJackTimeMaster(); 74 70 75 // Interface for application (i.e. GUI) 71 76 // * get list of transport models