peers builtin; fixed stop request issuing in starter
This commit is contained in:
parent
8d86dde405
commit
23fe33abce
@ -1591,10 +1591,16 @@ static Result<Value> builtin_start(Interpreter &interpreter, std::span<Ast> args
|
|||||||
{
|
{
|
||||||
return Try(interpreter.eval((Ast)ast));
|
return Try(interpreter.eval((Ast)ast));
|
||||||
});
|
});
|
||||||
|
// FIXME this should be in "finally" block
|
||||||
interpreter.starter.stop();
|
interpreter.starter.stop();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Result<Value> builtin_peers(Interpreter &interpreter, std::vector<Value>)
|
||||||
|
{
|
||||||
|
return Number(interpreter.starter.peers());
|
||||||
|
}
|
||||||
|
|
||||||
void Interpreter::register_builtin_functions()
|
void Interpreter::register_builtin_functions()
|
||||||
{
|
{
|
||||||
auto &global = *Env::global;
|
auto &global = *Env::global;
|
||||||
@ -1624,6 +1630,7 @@ void Interpreter::register_builtin_functions()
|
|||||||
global.force_define("oct", builtin_oct);
|
global.force_define("oct", builtin_oct);
|
||||||
global.force_define("par", builtin_par);
|
global.force_define("par", builtin_par);
|
||||||
global.force_define("partition", builtin_partition);
|
global.force_define("partition", builtin_partition);
|
||||||
|
global.force_define("peers", builtin_peers);
|
||||||
global.force_define("permute", builtin_permute);
|
global.force_define("permute", builtin_permute);
|
||||||
global.force_define("pgmchange", builtin_program_change);
|
global.force_define("pgmchange", builtin_program_change);
|
||||||
global.force_define("pick", builtin_pick);
|
global.force_define("pick", builtin_pick);
|
||||||
|
@ -23,6 +23,7 @@ struct State
|
|||||||
ableton::Link *link;
|
ableton::Link *link;
|
||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
std::condition_variable condition;
|
std::condition_variable condition;
|
||||||
|
std::stop_source source;
|
||||||
};
|
};
|
||||||
|
|
||||||
void Starter::start()
|
void Starter::start()
|
||||||
@ -46,24 +47,28 @@ void Starter::start()
|
|||||||
{
|
{
|
||||||
if (is_playing) {
|
if (is_playing) {
|
||||||
state->condition.notify_all();
|
state->condition.notify_all();
|
||||||
|
state->source.request_stop();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
std::jthread starter([quantum = quantum, state = state](std::stop_token token)
|
std::thread starter([quantum = quantum, state = state, token = state->source.get_token()]()
|
||||||
{
|
{
|
||||||
auto counter = 0;
|
auto counter = 0;
|
||||||
while (!token.stop_requested()) {
|
while (!token.stop_requested()) {
|
||||||
auto const time = state->link->clock().micros();
|
auto const time = state->link->clock().micros();
|
||||||
auto sessionState = state->link->captureAppSessionState();
|
auto sessionState = state->link->captureAppSessionState();
|
||||||
if (counter == 2) {
|
if (counter == 10) {
|
||||||
sessionState.setIsPlaying(true, time);
|
sessionState.setIsPlaying(true, time);
|
||||||
state->link->commitAppSessionState(sessionState);
|
state->link->commitAppSessionState(sessionState);
|
||||||
|
state->condition.notify_all();
|
||||||
|
state->source.request_stop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto const phase = sessionState.phaseAtTime(time, quantum);
|
auto const phase = sessionState.phaseAtTime(time, quantum);
|
||||||
counter += phase == 0;
|
counter += phase == 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
starter.detach();
|
||||||
|
|
||||||
std::unique_lock lock(state->mutex);
|
std::unique_lock lock(state->mutex);
|
||||||
state->condition.wait(lock);
|
state->condition.wait(lock);
|
||||||
@ -79,3 +84,11 @@ void Starter::stop()
|
|||||||
sessionState.setIsPlaying(false, time);
|
sessionState.setIsPlaying(false, time);
|
||||||
link.commitAppSessionState(sessionState);
|
link.commitAppSessionState(sessionState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t Starter::peers() const
|
||||||
|
{
|
||||||
|
ensure(impl != nullptr, "Starter wasn't initialized properly");
|
||||||
|
auto &link = impl->link;
|
||||||
|
|
||||||
|
return link.numPeers();
|
||||||
|
}
|
||||||
|
@ -9,6 +9,8 @@ struct Starter
|
|||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
size_t peers() const;
|
||||||
|
|
||||||
struct Implementation;
|
struct Implementation;
|
||||||
std::shared_ptr<Implementation> impl;
|
std::shared_ptr<Implementation> impl;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user