mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-25 19:33:54 -06:00
audio: Reset rate control when adding bytes
Commit 90320051ea
("spiceaudio: add a pcm_ops buffer_get_free
function") caused to emit messages saying "Resetting rate control"
frequently when the guest generates no frames.
audio_rate_peek_bytes() resets the rate control when frames < 0 ||
frames > 65536 where frames is the rate-limited number of frames.
Resetting when frames < 0 is sensible as the number simply doesn't make
sense.
There is a problem when frames > 65536. It implies the guest stopped
generating frames for a while so it makes sense to reset the rate
control when the guest resumed generating frames. However, the
commit mentioned earlier broke this assumption by letting spiceaudio
call audio_rate_peek_bytes() whether the guest is generating frames or
not.
Reset the rate control in audio_rate_add_bytes(), which is called only
when actually adding frames, according to the previous call to
audio_rate_peek_bytes() to avoid frequent rate control resets even when
the guest generates no frame.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20250317-rate-v1-1-da9df062747c@daynix.com>
This commit is contained in:
parent
f6ccfd5d16
commit
2bccabe6df
2 changed files with 9 additions and 6 deletions
|
@ -2283,17 +2283,19 @@ size_t audio_rate_peek_bytes(RateCtl *rate, struct audio_pcm_info *info)
|
|||
ticks = now - rate->start_ticks;
|
||||
bytes = muldiv64(ticks, info->bytes_per_second, NANOSECONDS_PER_SECOND);
|
||||
frames = (bytes - rate->bytes_sent) / info->bytes_per_frame;
|
||||
if (frames < 0 || frames > 65536) {
|
||||
AUD_log(NULL, "Resetting rate control (%" PRId64 " frames)\n", frames);
|
||||
audio_rate_start(rate);
|
||||
frames = 0;
|
||||
}
|
||||
rate->peeked_frames = frames;
|
||||
|
||||
return frames * info->bytes_per_frame;
|
||||
return frames < 0 ? 0 : frames * info->bytes_per_frame;
|
||||
}
|
||||
|
||||
void audio_rate_add_bytes(RateCtl *rate, size_t bytes_used)
|
||||
{
|
||||
if (rate->peeked_frames < 0 || rate->peeked_frames > 65536) {
|
||||
AUD_log(NULL, "Resetting rate control (%" PRId64 " frames)\n",
|
||||
rate->peeked_frames);
|
||||
audio_rate_start(rate);
|
||||
}
|
||||
|
||||
rate->bytes_sent += bytes_used;
|
||||
}
|
||||
|
||||
|
|
|
@ -255,6 +255,7 @@ const char *audio_application_name(void);
|
|||
typedef struct RateCtl {
|
||||
int64_t start_ticks;
|
||||
int64_t bytes_sent;
|
||||
int64_t peeked_frames;
|
||||
} RateCtl;
|
||||
|
||||
void audio_rate_start(RateCtl *rate);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue