diff --git a/libaegisub/audio/provider_ram.cpp b/libaegisub/audio/provider_ram.cpp index 6502f2508..29ae004b6 100644 --- a/libaegisub/audio/provider_ram.cpp +++ b/libaegisub/audio/provider_ram.cpp @@ -77,9 +77,11 @@ void RAMAudioProvider::FillBuffer(void *buf, int64_t start, int64_t count) const break; } - const size_t i = (start * bytes_per_sample * channels) >> CacheBits; - const int start_offset = (start * bytes_per_sample * channels) & (CacheBlockSize-1); - const int read_size = std::min(bytes_remaining, CacheBlockSize - start_offset); + const int64_t samples_per_block = CacheBlockSize / bytes_per_sample / channels; + + const size_t i = start / samples_per_block; + const int start_offset = (start % samples_per_block) * bytes_per_sample * channels; + const int read_size = std::min(bytes_remaining, samples_per_block * bytes_per_sample * channels - start_offset); memcpy(charbuf, &blockcache[i][start_offset], read_size); charbuf += read_size; diff --git a/src/audio_player_xaudio2.cpp b/src/audio_player_xaudio2.cpp index 3692ba679..9503b5704 100644 --- a/src/audio_player_xaudio2.cpp +++ b/src/audio_player_xaudio2.cpp @@ -472,7 +472,7 @@ XAudio2Thread::XAudio2Thread(agi::AudioProvider* provider, int WantedLatency, in , is_playing(CreateEvent(0, TRUE, FALSE, 0)) , error_happened(CreateEvent(0, FALSE, FALSE, 0)) , wanted_latency(WantedLatency) - , buffer_length(BufferLength) + , buffer_length(BufferLength < XAUDIO2_MAX_QUEUED_BUFFERS ? BufferLength : XAUDIO2_MAX_QUEUED_BUFFERS) , provider(provider) , buffer_occupied(BufferLength) {