ngs: Transition state after voice finished

This commit is contained in:
sunho 2021-05-25 05:08:14 +09:00 committed by Nicolas Jallamion
parent 6ed1818ce8
commit e1b50df475
14 changed files with 37 additions and 21 deletions

View File

@ -64,7 +64,7 @@ private:
public:
explicit Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::uint32_t module_id() const override { return 0x5CAA; }
std::size_t get_buffer_parameter_size() const override;
void on_state_change(ModuleData &v, const VoiceState previous) override;

View File

@ -7,7 +7,7 @@ struct Module : public ngs::Module {
public:
explicit Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::uint32_t module_id() const override { return 0x5CEC; }
std::size_t get_buffer_parameter_size() const override;
};

View File

@ -6,7 +6,7 @@ namespace ngs::master {
struct Module : public ngs::Module {
public:
explicit Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::size_t get_buffer_parameter_size() const override {
return 0;
}

View File

@ -6,7 +6,7 @@ namespace ngs::null {
struct Module : public ngs::Module {
Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::size_t get_buffer_parameter_size() const override;
};
} // namespace ngs::null

View File

@ -6,7 +6,7 @@ namespace ngs::passthrough {
struct Module : public ngs::Module {
Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::size_t get_buffer_parameter_size() const override;
};
} // namespace ngs::passthrough

View File

@ -61,7 +61,7 @@ private:
public:
explicit Module();
void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) override;
std::uint32_t module_id() const { return 0x5CE6; }
std::size_t get_buffer_parameter_size() const override;
void on_state_change(ModuleData &v, const VoiceState previous) override;

View File

@ -112,7 +112,7 @@ struct Module {
: buss_type(buss_type) {}
virtual ~Module() = default;
virtual void process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) = 0;
virtual bool process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) = 0;
virtual std::uint32_t module_id() const { return 0; }
virtual std::size_t get_buffer_parameter_size() const = 0;
virtual void on_state_change(ModuleData &v, const VoiceState previous) {}

View File

@ -48,16 +48,17 @@ void Module::on_state_change(ModuleData &data, const VoiceState previous) {
}
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
Parameters *params = data.get_parameters<Parameters>(mem);
State *state = data.get_state<State>();
assert(state);
if ((state->current_buffer == -1) || (params->buffer_params[state->current_buffer].buffer.address() == 0)) {
return;
return true;
}
bool finished = false;
// making this maybe to early...
if (!decoder || (params->config_data != last_config)) {
decoder = std::make_unique<Atrac9DecoderState>(params->config_data);
@ -80,6 +81,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
if (state->current_buffer == -1) {
data.invoke_callback(kern, mem, thread_id, SCE_NGS_AT9_CALLBACK_REASON_DONE_ALL, 0, 0);
finished = true;
// TODO: Free all occupied input routes
//unroute_occupied(mem, voice);
} else {
@ -113,6 +115,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
if ((state->current_buffer == -1) || (bufparam.bytes_count == 0)) {
// Fill it then break
data.fill_to_fit_granularity();
finished = true;
break;
}
@ -189,5 +192,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
state->decoded_samples_pending = (state->decoded_samples_pending < samples_to_be_passed) ? 0 : (state->decoded_samples_pending - samples_to_be_passed);
state->decoded_passed += samples_to_be_passed;
return finished;
}
}; // namespace ngs::atrac9

View File

@ -9,7 +9,7 @@ std::size_t Module::get_buffer_parameter_size() const {
return default_normal_parameter_size;
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
// TODO: Proper implement it, for now just lower volume lol
float *product_before = reinterpret_cast<float *>(data.parent->products[0].data);
@ -23,5 +23,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
data.parent->products[1] = data.parent->products[0];
data.parent->products[2] = data.parent->products[0];
data.parent->products[3] = data.parent->products[0];
return false;
}
} // namespace ngs::equalizer

View File

@ -8,7 +8,7 @@ Module::Module()
: ngs::Module(ngs::BussType::BUSS_MASTER) {
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
// Merge all voices. This buss manually outputs 2 channels
if (data.voice_state_data.empty()) {
data.voice_state_data.resize(data.parent->rack->system->granularity * sizeof(std::uint16_t) * 2);
@ -17,7 +17,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
std::fill(data.voice_state_data.begin(), data.voice_state_data.end(), 0);
if (data.parent->inputs.inputs.empty()) {
return;
return false;
}
std::int16_t *dest_data = reinterpret_cast<std::int16_t *>(data.voice_state_data.data());
@ -27,5 +27,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
for (std::uint32_t i = 0; i < data.parent->rack->system->granularity * 2; i++) {
dest_data[i] = static_cast<std::int16_t>(std::clamp(source_data[i] * 32768.0f, -32768.0f, 32767.0f));
}
return false;
}
}; // namespace ngs::master

View File

@ -8,6 +8,7 @@ std::size_t Module::get_buffer_parameter_size() const {
return 0;
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
return false;
}
} // namespace ngs::null

View File

@ -9,12 +9,13 @@ std::size_t Module::get_buffer_parameter_size() const {
return default_passthrough_parameter_size;
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
if (data.parent->inputs.inputs.size() < 1) {
return;
return false;
}
assert(data.parent->inputs.inputs.size() == 1);
data.parent->products[0].data = data.parent->inputs.inputs[0].data();
return false;
}
} // namespace ngs::passthrough

View File

@ -20,9 +20,10 @@ void Module::on_state_change(ModuleData &data, const VoiceState previous) {
}
}
void Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
bool Module::process(KernelState &kern, const MemState &mem, const SceUID thread_id, ModuleData &data) {
Parameters *params = data.get_parameters<Parameters>(mem);
State *state = data.get_state<State>();
bool finished = false;
std::uint8_t *data_ptr = data.extra_storage.data();
@ -36,7 +37,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
data.extra_storage.erase(data.extra_storage.begin(), data.extra_storage.begin() + state->decoded_gran_passed * 8);
} else {
if ((state->current_buffer == -1) || (params->buffer_params[state->current_buffer].bytes_count == 0)) {
return;
return true;
}
}
@ -75,6 +76,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
state->decoded_gran_pending = samples_to_take_per_channel;
if ((state->current_buffer == -1) || (params->buffer_params[state->current_buffer].bytes_count == 0)) {
finished = true;
break;
} else {
if (state->current_byte_position_in_buffer >= params->buffer_params[state->current_buffer].bytes_count) {
@ -92,6 +94,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
if (state->current_buffer == -1) {
data.invoke_callback(kern, mem, thread_id, SCE_NGS_PLAYER_CALLBACK_REASON_DONE_ALL, 0, 0);
finished = true;
// TODO: Free all occupied input routes
//unroute_occupied(mem, voice);
} else {
@ -123,5 +126,7 @@ void Module::process(KernelState &kern, const MemState &mem, const SceUID thread
state->decoded_gran_passed += gran_to_be_passed;
state->samples_generated_since_key_on += gran_to_be_passed * 2;
return finished;
}
} // namespace ngs::player

View File

@ -124,15 +124,15 @@ void VoiceScheduler::update(KernelState &kern, const MemState &mem, const SceUID
// Modify the state, in peace....
const std::lock_guard<std::mutex> guard(*voice->voice_lock);
std::memset(voice->products, 0, sizeof(voice->products));
const auto is_key_off = voice->state == ngs::VOICE_STATE_KEY_OFF;
const bool is_key_off = voice->state == ngs::VOICE_STATE_KEY_OFF;
bool finished = false;
for (std::size_t i = 0; i < voice->rack->modules.size(); i++) {
if (voice->rack->modules[i]) {
voice->rack->modules[i]->process(kern, mem, thread_id, voice->datas[i]);
finished |= voice->rack->modules[i]->process(kern, mem, thread_id, voice->datas[i]);
}
}
if (is_key_off)
if (is_key_off || finished)
stop(voice);
for (std::size_t i = 0; i < voice->rack->vdef->output_count(); i++) {