mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-26 20:03: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;
|
ticks = now - rate->start_ticks;
|
||||||
bytes = muldiv64(ticks, info->bytes_per_second, NANOSECONDS_PER_SECOND);
|
bytes = muldiv64(ticks, info->bytes_per_second, NANOSECONDS_PER_SECOND);
|
||||||
frames = (bytes - rate->bytes_sent) / info->bytes_per_frame;
|
frames = (bytes - rate->bytes_sent) / info->bytes_per_frame;
|
||||||
if (frames < 0 || frames > 65536) {
|
rate->peeked_frames = frames;
|
||||||
AUD_log(NULL, "Resetting rate control (%" PRId64 " frames)\n", frames);
|
|
||||||
audio_rate_start(rate);
|
|
||||||
frames = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
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;
|
rate->bytes_sent += bytes_used;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,7 @@ const char *audio_application_name(void);
|
||||||
typedef struct RateCtl {
|
typedef struct RateCtl {
|
||||||
int64_t start_ticks;
|
int64_t start_ticks;
|
||||||
int64_t bytes_sent;
|
int64_t bytes_sent;
|
||||||
|
int64_t peeked_frames;
|
||||||
} RateCtl;
|
} RateCtl;
|
||||||
|
|
||||||
void audio_rate_start(RateCtl *rate);
|
void audio_rate_start(RateCtl *rate);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue