mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-22 12:00:06 +00:00
mic_u: Fix up logic for populating shared memory sample buffer. (#6669)
This commit is contained in:
parent
e5310b25d4
commit
cd3244f139
@ -80,23 +80,29 @@ struct State {
|
|||||||
|
|
||||||
void WriteSamples(std::span<const u8> samples) {
|
void WriteSamples(std::span<const u8> samples) {
|
||||||
u32 bytes_total_written = 0;
|
u32 bytes_total_written = 0;
|
||||||
const std::size_t remaining_space = size - offset;
|
auto sample_buffer = sharedmem_buffer + initial_offset;
|
||||||
std::size_t bytes_to_write = std::min(samples.size(), remaining_space);
|
// Do not let sampling buffer overrun shared memory space.
|
||||||
|
const auto sample_buffer_size =
|
||||||
|
std::min(size, sharedmem_size - initial_offset - sizeof(u32));
|
||||||
|
|
||||||
// Write as many samples as we can to the buffer.
|
// Write samples in a loop until the input runs out
|
||||||
// TODO if the sample size is 16bit, this could theoretically cut a sample in the case where
|
while (samples.size() > bytes_total_written) {
|
||||||
// the application configures an odd size
|
// TODO: If the sample size is 16-bit, this could theoretically cut a sample in the case
|
||||||
std::memcpy(sharedmem_buffer + offset, samples.data(), bytes_to_write);
|
// where the application configures an odd size.
|
||||||
offset += static_cast<u32>(bytes_to_write);
|
std::size_t bytes_to_write =
|
||||||
bytes_total_written += static_cast<u32>(bytes_to_write);
|
std::min(samples.size() - bytes_total_written, sample_buffer_size - offset);
|
||||||
|
std::memcpy(sample_buffer + offset, samples.data() + bytes_total_written,
|
||||||
// If theres any samples left to write after we looped, go ahead and write them now
|
|
||||||
if (looped_buffer && samples.size() > bytes_total_written) {
|
|
||||||
offset = initial_offset;
|
|
||||||
bytes_to_write = std::min(samples.size() - bytes_total_written, size);
|
|
||||||
std::memcpy(sharedmem_buffer + offset, samples.data() + bytes_total_written,
|
|
||||||
bytes_to_write);
|
bytes_to_write);
|
||||||
offset += static_cast<u32>(bytes_to_write);
|
offset += static_cast<u32>(bytes_to_write);
|
||||||
|
bytes_total_written += static_cast<u32>(bytes_to_write);
|
||||||
|
|
||||||
|
if (offset >= sample_buffer_size && looped_buffer) {
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!looped_buffer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The last 4 bytes of the shared memory contains the latest offset
|
// The last 4 bytes of the shared memory contains the latest offset
|
||||||
@ -205,7 +211,8 @@ struct MIC_U::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u8 sample_size = encoding == Encoding::PCM8Signed || encoding == Encoding::PCM8 ? 8 : 16;
|
u8 sample_size = encoding == Encoding::PCM8Signed || encoding == Encoding::PCM8 ? 8 : 16;
|
||||||
state.offset = state.initial_offset = audio_buffer_offset;
|
state.offset = 0;
|
||||||
|
state.initial_offset = audio_buffer_offset;
|
||||||
state.sample_rate = sample_rate;
|
state.sample_rate = sample_rate;
|
||||||
state.sample_size = sample_size;
|
state.sample_size = sample_size;
|
||||||
state.looped_buffer = audio_buffer_loop;
|
state.looped_buffer = audio_buffer_loop;
|
||||||
|
Loading…
Reference in New Issue
Block a user