mirror of
https://github.com/Vita3K/Vita3K-Android.git
synced 2025-03-02 02:15:31 +00:00
ngs: Transition state after voice finished
This commit is contained in:
parent
6ed1818ce8
commit
e1b50df475
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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++) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user