mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
add API to allow runtime reconfiguration of memblockqs
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2063 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
07832d080a
commit
d1d07783e0
2 changed files with 78 additions and 23 deletions
|
|
@ -72,7 +72,6 @@ pa_memblockq* pa_memblockq_new(
|
|||
pa_memblockq* bq;
|
||||
|
||||
pa_assert(base > 0);
|
||||
pa_assert(maxlength >= base);
|
||||
|
||||
bq = pa_xnew(pa_memblockq, 1);
|
||||
bq->blocks = bq->blocks_tail = NULL;
|
||||
|
|
@ -84,36 +83,20 @@ pa_memblockq* pa_memblockq_new(
|
|||
pa_log_debug("memblockq requested: maxlength=%lu, tlength=%lu, base=%lu, prebuf=%lu, minreq=%lu",
|
||||
(unsigned long) maxlength, (unsigned long) tlength, (unsigned long) base, (unsigned long) prebuf, (unsigned long) minreq);
|
||||
|
||||
bq->maxlength = ((maxlength+base-1)/base)*base;
|
||||
pa_assert(bq->maxlength >= base);
|
||||
bq->missing = bq->requested = bq->maxlength = bq->tlength = bq->prebuf = bq->minreq = 0;
|
||||
bq->in_prebuf = TRUE;
|
||||
|
||||
bq->tlength = ((tlength+base-1)/base)*base;
|
||||
if (bq->tlength <= 0 || bq->tlength > bq->maxlength)
|
||||
bq->tlength = bq->maxlength;
|
||||
|
||||
bq->prebuf = (prebuf == (size_t) -1) ? bq->tlength/2 : prebuf;
|
||||
bq->prebuf = ((bq->prebuf+base-1)/base)*base;
|
||||
if (bq->prebuf > bq->maxlength)
|
||||
bq->prebuf = bq->maxlength;
|
||||
|
||||
bq->minreq = (minreq/base)*base;
|
||||
|
||||
if (bq->minreq > bq->tlength - bq->prebuf)
|
||||
bq->minreq = bq->tlength - bq->prebuf;
|
||||
|
||||
if (!bq->minreq)
|
||||
bq->minreq = 1;
|
||||
pa_memblockq_set_maxlength(bq, maxlength);
|
||||
pa_memblockq_set_tlength(bq, tlength);
|
||||
pa_memblockq_set_prebuf(bq, prebuf);
|
||||
pa_memblockq_set_minreq(bq, minreq);
|
||||
|
||||
pa_log_debug("memblockq sanitized: maxlength=%lu, tlength=%lu, base=%lu, prebuf=%lu, minreq=%lu",
|
||||
(unsigned long)bq->maxlength, (unsigned long)bq->tlength, (unsigned long)bq->base, (unsigned long)bq->prebuf, (unsigned long)bq->minreq);
|
||||
|
||||
bq->in_prebuf = bq->prebuf > 0;
|
||||
bq->silence = silence ? pa_memblock_ref(silence) : NULL;
|
||||
bq->mcalign = NULL;
|
||||
|
||||
bq->missing = bq->tlength;
|
||||
bq->requested = 0;
|
||||
|
||||
return bq;
|
||||
}
|
||||
|
||||
|
|
@ -688,3 +671,69 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq) {
|
|||
|
||||
return l;
|
||||
}
|
||||
|
||||
void pa_memblockq_set_maxlength(pa_memblockq *bq, size_t maxlength) {
|
||||
pa_assert(bq);
|
||||
|
||||
bq->maxlength = ((maxlength+bq->base-1)/bq->base)*bq->base;
|
||||
|
||||
if (bq->maxlength < bq->base)
|
||||
bq->maxlength = bq->base;
|
||||
|
||||
if (bq->tlength > bq->maxlength)
|
||||
pa_memblockq_set_tlength(bq, bq->maxlength);
|
||||
|
||||
if (bq->prebuf > bq->maxlength)
|
||||
pa_memblockq_set_prebuf(bq, bq->maxlength);
|
||||
}
|
||||
|
||||
void pa_memblockq_set_tlength(pa_memblockq *bq, size_t tlength) {
|
||||
size_t old_tlength;
|
||||
pa_assert(bq);
|
||||
|
||||
old_tlength = bq->tlength;
|
||||
|
||||
if (tlength <= 0)
|
||||
tlength = bq->maxlength;
|
||||
|
||||
bq->tlength = ((tlength+bq->base-1)/bq->base)*bq->base;
|
||||
|
||||
if (bq->tlength > bq->maxlength)
|
||||
bq->tlength = bq->maxlength;
|
||||
|
||||
if (bq->minreq > bq->tlength - bq->prebuf)
|
||||
pa_memblockq_set_minreq(bq, bq->tlength - bq->prebuf);
|
||||
|
||||
bq->missing += (int64_t) bq->tlength - (int64_t) old_tlength;
|
||||
}
|
||||
|
||||
void pa_memblockq_set_prebuf(pa_memblockq *bq, size_t prebuf) {
|
||||
pa_assert(bq);
|
||||
|
||||
bq->prebuf = (prebuf == (size_t) -1) ? bq->tlength/2 : prebuf;
|
||||
bq->prebuf = ((bq->prebuf+bq->base-1)/bq->base)*bq->base;
|
||||
|
||||
if (prebuf > 0 && bq->prebuf < bq->base)
|
||||
bq->prebuf = bq->base;
|
||||
|
||||
if (bq->prebuf > bq->maxlength)
|
||||
bq->prebuf = bq->maxlength;
|
||||
|
||||
if (bq->prebuf <= 0 || pa_memblockq_get_length(bq) >= bq->prebuf)
|
||||
bq->in_prebuf = FALSE;
|
||||
|
||||
if (bq->minreq > bq->tlength - bq->prebuf)
|
||||
pa_memblockq_set_minreq(bq, bq->tlength - bq->prebuf);
|
||||
}
|
||||
|
||||
void pa_memblockq_set_minreq(pa_memblockq *bq, size_t minreq) {
|
||||
pa_assert(bq);
|
||||
|
||||
bq->minreq = (minreq/bq->base)*bq->base;
|
||||
|
||||
if (bq->minreq > bq->tlength - bq->prebuf)
|
||||
bq->minreq = bq->tlength - bq->prebuf;
|
||||
|
||||
if (bq->minreq < bq->base)
|
||||
bq->minreq = bq->base;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -142,4 +142,10 @@ size_t pa_memblockq_get_maxlength(pa_memblockq *bq);
|
|||
/* Return the prebuffer length in bytes */
|
||||
size_t pa_memblockq_get_prebuf(pa_memblockq *bq);
|
||||
|
||||
/* Change metrics. */
|
||||
void pa_memblockq_set_maxlength(pa_memblockq *memblockq, size_t maxlength);
|
||||
void pa_memblockq_set_tlength(pa_memblockq *memblockq, size_t tlength);
|
||||
void pa_memblockq_set_prebuf(pa_memblockq *memblockq, size_t prebuf);
|
||||
void pa_memblockq_set_minreq(pa_memblockq *memblockq, size_t minreq);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue