early-access version 1837
This commit is contained in:
parent
9d473deb01
commit
7482a950d9
3 changed files with 45 additions and 9 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1836.
|
This is the source code for early-access 1837.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -1231,14 +1231,15 @@ void CommandGenerator::DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, s32* o
|
||||||
|
|
||||||
if (in_params.sample_format == SampleFormat::Adpcm && dsp_state.offset == 0 &&
|
if (in_params.sample_format == SampleFormat::Adpcm && dsp_state.offset == 0 &&
|
||||||
wave_buffer.context_address != 0 && wave_buffer.context_size != 0) {
|
wave_buffer.context_address != 0 && wave_buffer.context_size != 0) {
|
||||||
// TODO(ogniK): ADPCM loop context
|
memory.ReadBlock(wave_buffer.context_address, &dsp_state.context,
|
||||||
|
sizeof(ADPCMContext));
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 samples_offset_start;
|
s32 samples_offset_start;
|
||||||
s32 samples_offset_end;
|
s32 samples_offset_end;
|
||||||
if (dsp_state.loop_count > 0 ||
|
if (dsp_state.loop_count > 0 && wave_buffer.loop_start_sample != 0 &&
|
||||||
(wave_buffer.loop_start_sample != 0 && wave_buffer.loop_end_sample != 0 &&
|
wave_buffer.loop_end_sample != 0 &&
|
||||||
wave_buffer.loop_start_sample <= wave_buffer.loop_end_sample)) {
|
wave_buffer.loop_start_sample <= wave_buffer.loop_end_sample) {
|
||||||
samples_offset_start = wave_buffer.loop_start_sample;
|
samples_offset_start = wave_buffer.loop_start_sample;
|
||||||
samples_offset_end = wave_buffer.loop_end_sample;
|
samples_offset_end = wave_buffer.loop_end_sample;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -221,11 +221,40 @@ void ServerVoiceInfo::UpdateWaveBuffer(ServerWaveBuffer& out_wavebuffer,
|
||||||
if (!in_wave_buffer.sent_to_server || !in_params.buffer_mapped) {
|
if (!in_wave_buffer.sent_to_server || !in_params.buffer_mapped) {
|
||||||
// Validate sample offset sizings
|
// Validate sample offset sizings
|
||||||
if (sample_format == SampleFormat::Pcm16) {
|
if (sample_format == SampleFormat::Pcm16) {
|
||||||
const auto buffer_size = in_wave_buffer.buffer_size;
|
const s64 buffer_size = static_cast<s64>(in_wave_buffer.buffer_size);
|
||||||
if (in_wave_buffer.start_sample_offset < 0 || in_wave_buffer.end_sample_offset < 0 ||
|
const s64 start = sizeof(s16) * in_wave_buffer.start_sample_offset;
|
||||||
(buffer_size < (sizeof(s16) * in_wave_buffer.start_sample_offset)) ||
|
const s64 end = sizeof(s16) * in_wave_buffer.end_sample_offset;
|
||||||
(buffer_size < (sizeof(s16) * in_wave_buffer.end_sample_offset))) {
|
if (0 > start || start > buffer_size || 0 > end || end > buffer_size) {
|
||||||
// TODO(ogniK): Write error info
|
// TODO(ogniK): Write error info
|
||||||
|
LOG_ERROR(Audio,
|
||||||
|
"PCM16 wavebuffer has an invalid size. Buffer has size 0x{:08X}, but "
|
||||||
|
"offsets were "
|
||||||
|
"{:08X} - 0x{:08X}",
|
||||||
|
buffer_size, sizeof(s16) * in_wave_buffer.start_sample_offset,
|
||||||
|
sizeof(s16) * in_wave_buffer.end_sample_offset);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (sample_format == SampleFormat::Adpcm) {
|
||||||
|
const s64 buffer_size = static_cast<s64>(in_wave_buffer.buffer_size);
|
||||||
|
const s64 start_frames = in_wave_buffer.start_sample_offset / 14;
|
||||||
|
const s64 start_extra = in_wave_buffer.start_sample_offset % 14 == 0
|
||||||
|
? 0
|
||||||
|
: (in_wave_buffer.start_sample_offset % 14) / 2 + 1 +
|
||||||
|
(in_wave_buffer.start_sample_offset % 2);
|
||||||
|
const s64 start = start_frames * 8 + start_extra;
|
||||||
|
const s64 end_frames = in_wave_buffer.end_sample_offset / 14;
|
||||||
|
const s64 end_extra = in_wave_buffer.end_sample_offset % 14 == 0
|
||||||
|
? 0
|
||||||
|
: (in_wave_buffer.end_sample_offset % 14) / 2 + 1 +
|
||||||
|
(in_wave_buffer.end_sample_offset % 2);
|
||||||
|
const s64 end = end_frames * 8 + end_extra;
|
||||||
|
if (in_wave_buffer.start_sample_offset < 0 || start > buffer_size ||
|
||||||
|
in_wave_buffer.end_sample_offset < 0 || end > buffer_size) {
|
||||||
|
LOG_ERROR(Audio,
|
||||||
|
"ADPMC wavebuffer has an invalid size. Buffer has size 0x{:08X}, but "
|
||||||
|
"offsets were "
|
||||||
|
"{:08X} - 0x{:08X}",
|
||||||
|
in_wave_buffer.buffer_size, start, end);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,6 +276,12 @@ void ServerVoiceInfo::UpdateWaveBuffer(ServerWaveBuffer& out_wavebuffer,
|
||||||
in_wave_buffer.buffer_address != 0 && in_wave_buffer.buffer_size != 0;
|
in_wave_buffer.buffer_address != 0 && in_wave_buffer.buffer_size != 0;
|
||||||
// TODO(ogniK): Pool mapper attachment
|
// TODO(ogniK): Pool mapper attachment
|
||||||
// TODO(ogniK): IsAdpcmLoopContextBugFixed
|
// TODO(ogniK): IsAdpcmLoopContextBugFixed
|
||||||
|
if (sample_format == SampleFormat::Adpcm && in_wave_buffer.context_address != 0 &&
|
||||||
|
in_wave_buffer.context_size != 0 && behavior_info.IsAdpcmLoopContextBugFixed()) {
|
||||||
|
} else {
|
||||||
|
out_wavebuffer.context_address = 0;
|
||||||
|
out_wavebuffer.context_size = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue