Only fill FIFO up to the amount of samples needed.
This commit is contained in:
parent
a4b0fbdcf4
commit
9268b4ef42
3 changed files with 19 additions and 9 deletions
|
@ -180,3 +180,12 @@ pcm_render(int16_t *buf, unsigned num_samples)
|
|||
*(buf++) = (int16_t)((int32_t)cur_r * volume_lut[ctrl & 0xF] / 64);
|
||||
}
|
||||
}
|
||||
uint32_t pcm_fifo_avail(void) {
|
||||
switch ((ctrl >> 4) & 3) {
|
||||
case 0: return fifo_cnt;
|
||||
case 1: return fifo_cnt / 2;
|
||||
case 2: return fifo_cnt / 2;
|
||||
case 3: return fifo_cnt / 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,11 +7,12 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
void pcm_reset(void);
|
||||
void pcm_write_ctrl(uint8_t val);
|
||||
uint8_t pcm_read_ctrl(void);
|
||||
void pcm_write_rate(uint8_t val);
|
||||
uint8_t pcm_read_rate(void);
|
||||
void pcm_write_fifo(uint8_t val);
|
||||
void pcm_render(int16_t *buf, unsigned num_samples);
|
||||
bool pcm_is_fifo_almost_empty(void);
|
||||
void pcm_reset(void);
|
||||
void pcm_write_ctrl(uint8_t val);
|
||||
uint8_t pcm_read_ctrl(void);
|
||||
void pcm_write_rate(uint8_t val);
|
||||
uint8_t pcm_read_rate(void);
|
||||
void pcm_write_fifo(uint8_t val);
|
||||
void pcm_render(int16_t *buf, unsigned num_samples);
|
||||
uint32_t pcm_fifo_avail(void);
|
||||
bool pcm_is_fifo_almost_empty(void);
|
||||
|
|
|
@ -84,7 +84,7 @@ class ZsmBackend : public PlaybackBackend {
|
|||
return (int16_t)((((int32_t)a) + ((int32_t)b)) >> 1);
|
||||
}
|
||||
void audio_step(size_t samples) {
|
||||
while (((pcm_read_ctrl() & 0x80) == 0) && remain > 0) {
|
||||
while (((pcm_read_ctrl() & 0x80) == 0 || pcm_fifo_avail() < samples) && remain > 0) {
|
||||
remain--;
|
||||
size_t oldpos = file->get_pos();
|
||||
file->seek((cur++) + pcm_data_offs, SeekType::SET);
|
||||
|
|
Loading…
Reference in a new issue