2024-10-22 01:55:31 +02:00
# pragma once
# include "connection-manager.h"
# include "datatypes.h"
2024-10-26 02:14:41 +02:00
# include "node-manager.h"
2024-10-22 01:55:31 +02:00
# include "signal.h"
# include "node.h"
# include "midi.h"
# include <chrono>
# include <thread>
class SignalManager {
public :
2024-10-25 16:41:37 +02:00
SignalManager ( ) { }
2024-10-26 02:14:41 +02:00
SignalManager ( NodeManager * nm , ConnectionManager * cm , std : : mutex * mutex ) : mutex ( mutex ) , cm ( cm ) , nm ( nm ) { }
2024-10-22 01:55:31 +02:00
2024-10-25 16:41:37 +02:00
Midi midi ;
std : : mutex * mutex ;
2024-10-22 01:55:31 +02:00
ConnectionManager * cm ;
2024-10-26 02:14:41 +02:00
NodeManager * nm ;
2024-10-22 01:55:31 +02:00
std : : vector < Signal > signals ;
bool loop = true ;
2024-10-25 02:43:41 +02:00
bool play = false ;
void pause ( ) {
play = false ;
}
void stop ( ) {
play = false ;
reset ( ) ;
}
void start ( ) {
play = true ;
}
void reset ( ) {
for ( auto & s : signals ) {
2024-10-26 02:14:41 +02:00
s . position = nm - > nodes [ s . start ] . position + Vec2D < float > { 0.1 , 0.1 } ;
2024-10-25 02:43:41 +02:00
s . next = s . start ;
s . last = s . start ;
}
cm - > reset ( ) ;
}
2024-10-22 01:55:31 +02:00
void startSignalThread ( ) {
std : : thread t1 ( & SignalManager : : updateSignals , this ) ;
t1 . detach ( ) ;
}
void stopSignalThread ( ) {
loop = false ;
}
2024-10-25 16:41:37 +02:00
2024-10-26 02:14:41 +02:00
void addSignalAtNode ( int node_id ) {
Color c = { ( unsigned char ) ( 232 - ( rand ( ) % 120 ) ) , 50 , ( unsigned char ) ( 20 + ( int ) ( rand ( ) % 120 ) ) , 255 } ;
signals . emplace ( signals . end ( ) , Signal ( nm - > nodes [ node_id ] . position . x + 1 , nm - > nodes [ node_id ] . position . y + 1 , 5.0f , 0 , c ) ) ; // position + 1 or else it does not render. why? no idea!
signals . back ( ) . next = node_id ;
signals . back ( ) . last = node_id ;
signals . back ( ) . start = node_id ;
2024-10-22 01:55:31 +02:00
}
2024-10-22 03:07:11 +02:00
void removeSignal ( int n ) {
signals . erase ( signals . begin ( ) + n ) ;
2024-10-22 01:55:31 +02:00
}
void updateSignals ( ) {
auto last = std : : chrono : : steady_clock : : now ( ) ;
while ( loop ) {
2024-10-25 02:43:41 +02:00
std : : chrono : : duration < double , std : : micro > diff = std : : chrono : : steady_clock : : now ( ) - last ;
if ( diff . count ( ) > 500 ) {
2024-10-25 16:46:28 +02:00
mutex - > lock ( ) ;
2024-10-25 02:43:41 +02:00
if ( play ) {
for ( auto & s : signals ) {
2024-10-26 02:14:41 +02:00
s . direction = ( nm - > nodes [ s . next ] . position - s . position ) . norm ( ) ;
2024-10-25 02:43:41 +02:00
s . update ( diff . count ( ) ) ;
2024-10-26 02:14:41 +02:00
if ( s . position . dist ( & nm - > nodes [ s . next ] . position ) < 1.0f ) {
int n = cm - > next ( s . next , s . last ) ;
2024-10-25 02:43:41 +02:00
2024-10-26 02:14:41 +02:00
if ( n ! = s . next & & n ! = - 1 ) {
for ( auto & m : nm - > nodes [ s . next ] . midi_outs ) {
if ( m . second . enabled ) midi . note ( m . second . i , nm - > nodes [ s . next ] . midi_channel , nm - > nodes [ s . next ] . midi_note , nm - > nodes [ s . next ] . midi_velocity , nm - > nodes [ s . next ] . midi_gate ) ;
2024-10-25 02:43:41 +02:00
}
s . last = s . next ;
s . next = n ;
2024-10-22 01:55:31 +02:00
}
}
}
}
2024-10-25 16:46:28 +02:00
midi . update ( ) ;
mutex - > unlock ( ) ;
2024-10-22 01:55:31 +02:00
last = std : : chrono : : steady_clock : : now ( ) ;
}
}
}
void drawSignals ( Vec2D < float > * mouse_pos , Camera2D * camera ) {
for ( auto & s : signals ) {
s . draw ( mouse_pos , camera ) ;
}
}
} ;