mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-06 13:29:56 -05:00
make eolspace
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1470 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
00da37f2c4
commit
a4fed0fbb5
22 changed files with 215 additions and 215 deletions
|
|
@ -94,7 +94,7 @@ static void thread_func(void *userdata) {
|
||||||
pollfd.events = POLLIN;
|
pollfd.events = POLLIN;
|
||||||
|
|
||||||
pa_gettimeofday(u->timestamp);
|
pa_gettimeofday(u->timestamp);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int code;
|
int code;
|
||||||
void *data, *object;
|
void *data, *object;
|
||||||
|
|
@ -116,7 +116,7 @@ static void thread_func(void *userdata) {
|
||||||
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (object == u->sink) {
|
} else if (object == u->sink) {
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
@ -124,29 +124,29 @@ static void thread_func(void *userdata) {
|
||||||
pa_assert(running);
|
pa_assert(running);
|
||||||
running = 0;
|
running = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_START:
|
case PA_SINK_MESSAGE_START:
|
||||||
pa_assert(!running);
|
pa_assert(!running);
|
||||||
running = 1;
|
running = 1;
|
||||||
|
|
||||||
pa_gettimeofday(u->timestamp);
|
pa_gettimeofday(u->timestamp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_GET_LATENCY:
|
case PA_SINK_MESSAGE_GET_LATENCY:
|
||||||
|
|
||||||
if (pa_timeval_cmp(&u->timestamp, &now) > 0)
|
if (pa_timeval_cmp(&u->timestamp, &now) > 0)
|
||||||
*((pa_usec_t*) data) = 0;
|
*((pa_usec_t*) data) = 0;
|
||||||
else
|
else
|
||||||
*((pa_usec_t*) data) = pa_timeval_diff(&u->timestamp, &now);
|
*((pa_usec_t*) data) = pa_timeval_diff(&u->timestamp, &now);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* ... */
|
/* ... */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_asyncmsgq_done(u->sink->asyncmsgq);
|
pa_asyncmsgq_done(u->sink->asyncmsgq);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -155,30 +155,30 @@ static void thread_func(void *userdata) {
|
||||||
|
|
||||||
if (running) {
|
if (running) {
|
||||||
pa_gettimeofday(&now);
|
pa_gettimeofday(&now);
|
||||||
|
|
||||||
if (pa_timeval_cmp(u->timestamp, &now) <= 0) {
|
if (pa_timeval_cmp(u->timestamp, &now) <= 0) {
|
||||||
pa_memchunk chunk;
|
pa_memchunk chunk;
|
||||||
size_t l;
|
size_t l;
|
||||||
|
|
||||||
if (pa_sink_render(u->sink, u->block_size, &chunk) >= 0) {
|
if (pa_sink_render(u->sink, u->block_size, &chunk) >= 0) {
|
||||||
l = chunk.length;
|
l = chunk.length;
|
||||||
pa_memblock_unref(chunk.memblock);
|
pa_memblock_unref(chunk.memblock);
|
||||||
} else
|
} else
|
||||||
l = u->block_size;
|
l = u->block_size;
|
||||||
|
|
||||||
pa_timeval_add(&u->timestamp, pa_bytes_to_usec(l, &u->sink->sample_spec));
|
pa_timeval_add(&u->timestamp, pa_bytes_to_usec(l, &u->sink->sample_spec));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
timeout = pa_timeval_diff(&u->timestamp, &now)/1000;
|
timeout = pa_timeval_diff(&u->timestamp, &now)/1000;
|
||||||
|
|
||||||
if (timeout < 1)
|
if (timeout < 1)
|
||||||
timeout = 1;
|
timeout = 1;
|
||||||
} else
|
} else
|
||||||
timeout = -1;
|
timeout = -1;
|
||||||
|
|
||||||
/* Hmm, nothing to do. Let's sleep */
|
/* Hmm, nothing to do. Let's sleep */
|
||||||
|
|
||||||
if (pa_asyncmsgq_before_poll(u->sink->asyncmsgq) < 0)
|
if (pa_asyncmsgq_before_poll(u->sink->asyncmsgq) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ static void thread_func(void *userdata) {
|
||||||
pa_log("poll() failed: %s", pa_cstrerror(errno));
|
pa_log("poll() failed: %s", pa_cstrerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_assert(r == 0 || pollfd.revents == POLLIN);
|
pa_assert(r == 0 || pollfd.revents == POLLIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -241,7 +241,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
pa_sink_set_description(u->sink, pa_modargs_get_value(ma, "description", "NULL sink"));
|
pa_sink_set_description(u->sink, pa_modargs_get_value(ma, "description", "NULL sink"));
|
||||||
|
|
||||||
u->block_size = pa_bytes_per_second(&ss) / 20; /* 50 ms */
|
u->block_size = pa_bytes_per_second(&ss) / 20; /* 50 ms */
|
||||||
|
|
||||||
if (u->block_size <= 0)
|
if (u->block_size <= 0)
|
||||||
u->block_size = pa_frame_size(&ss);
|
u->block_size = pa_frame_size(&ss);
|
||||||
|
|
||||||
|
|
@ -249,7 +249,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
pa_log("Failed to create thread.");
|
pa_log("Failed to create thread.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_modargs_free(ma);
|
pa_modargs_free(ma);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -265,7 +265,7 @@ fail:
|
||||||
|
|
||||||
void pa__done(pa_core *c, pa_module*m) {
|
void pa__done(pa_core *c, pa_module*m) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
|
|
||||||
|
|
@ -278,7 +278,7 @@ void pa__done(pa_core *c, pa_module*m) {
|
||||||
pa_asyncmsgq_send(u->sink->asyncmsgq, PA_SINK_MESSAGE_SHUTDOWN, NULL);
|
pa_asyncmsgq_send(u->sink->asyncmsgq, PA_SINK_MESSAGE_SHUTDOWN, NULL);
|
||||||
pa_thread_free(u->thread);
|
pa_thread_free(u->thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_sink_unref(u->sink);
|
pa_sink_unref(u->sink);
|
||||||
|
|
||||||
pa_xfree(u);
|
pa_xfree(u);
|
||||||
|
|
|
||||||
|
|
@ -124,9 +124,9 @@ static void thread_func(void *userdata) {
|
||||||
default:
|
default:
|
||||||
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (object == u->sink) {
|
} else if (object == u->sink) {
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_STOP:
|
case PA_SINK_MESSAGE_STOP:
|
||||||
pa_assert(running);
|
pa_assert(running);
|
||||||
running = 0;
|
running = 0;
|
||||||
|
|
@ -155,7 +155,7 @@ static void thread_func(void *userdata) {
|
||||||
default:
|
default:
|
||||||
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
pa_sink_process_msg(u->sink->asyncmsgq, object, code, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_asyncmsgq_done(u->sink->asyncmsgq);
|
pa_asyncmsgq_done(u->sink->asyncmsgq);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -171,20 +171,20 @@ static void thread_func(void *userdata) {
|
||||||
|
|
||||||
if (!underrun) {
|
if (!underrun) {
|
||||||
ssize_t l;
|
ssize_t l;
|
||||||
|
|
||||||
p = pa_memblock_acquire(u->memchunk.memblock);
|
p = pa_memblock_acquire(u->memchunk.memblock);
|
||||||
l = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u->memchunk.length);
|
l = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u->memchunk.length);
|
||||||
pa_memblock_release(p);
|
pa_memblock_release(p);
|
||||||
|
|
||||||
if (l < 0) {
|
if (l < 0) {
|
||||||
|
|
||||||
if (errno != EINTR && errno != EAGAIN) {
|
if (errno != EINTR && errno != EAGAIN) {
|
||||||
pa_log("Failed to write data to FIFO: %s", pa_cstrerror(errno));
|
pa_log("Failed to write data to FIFO: %s", pa_cstrerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
u->memchunk.index += l;
|
u->memchunk.index += l;
|
||||||
u->memchunk.length -= l;
|
u->memchunk.length -= l;
|
||||||
|
|
||||||
|
|
@ -202,7 +202,7 @@ static void thread_func(void *userdata) {
|
||||||
pollfd[POLLFD_FIFO].events = running && !underrun ? POLLOUT : 0;
|
pollfd[POLLFD_FIFO].events = running && !underrun ? POLLOUT : 0;
|
||||||
|
|
||||||
/* Hmm, nothing to do. Let's sleep */
|
/* Hmm, nothing to do. Let's sleep */
|
||||||
|
|
||||||
if (pa_asyncmsgq_before_poll(u->sink->asyncmsgq) < 0)
|
if (pa_asyncmsgq_before_poll(u->sink->asyncmsgq) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
@ -221,10 +221,10 @@ static void thread_func(void *userdata) {
|
||||||
pa_log("FIFO shutdown.");
|
pa_log("FIFO shutdown.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_assert(pollfd[POLLFD_ASYNCQ].revents & ~POLLIN == 0);
|
pa_assert(pollfd[POLLFD_ASYNCQ].revents & ~POLLIN == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
/* We have to continue processing messages until we receive the
|
/* We have to continue processing messages until we receive the
|
||||||
* SHUTDOWN message */
|
* SHUTDOWN message */
|
||||||
|
|
@ -265,9 +265,9 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
u->memchunk.memblock = NULL;
|
u->memchunk.memblock = NULL;
|
||||||
u->memchunk.length = 0;
|
u->memchunk.length = 0;
|
||||||
m->userdata = u;
|
m->userdata = u;
|
||||||
|
|
||||||
mkfifo(u->filename, 0666);
|
mkfifo(u->filename, 0666);
|
||||||
|
|
||||||
if ((u->fd = open(u->filename, O_RDWR)) < 0) {
|
if ((u->fd = open(u->filename, O_RDWR)) < 0) {
|
||||||
pa_log("open('%s'): %s", p, pa_cstrerror(errno));
|
pa_log("open('%s'): %s", p, pa_cstrerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
@ -290,7 +290,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
pa_log("Failed to create sink.");
|
pa_log("Failed to create sink.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
u->sink->userdata = u;
|
u->sink->userdata = u;
|
||||||
pa_sink_set_owner(u->sink, m);
|
pa_sink_set_owner(u->sink, m);
|
||||||
pa_sink_set_description(u->sink, t = pa_sprintf_malloc("Unix FIFO sink '%s'", p));
|
pa_sink_set_description(u->sink, t = pa_sprintf_malloc("Unix FIFO sink '%s'", p));
|
||||||
|
|
@ -300,7 +300,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
pa_log("Failed to create thread.");
|
pa_log("Failed to create thread.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_modargs_free(ma);
|
pa_modargs_free(ma);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -328,7 +328,7 @@ void pa__done(pa_core *c, pa_module*m) {
|
||||||
pa_asyncmsgq_send(u->sink->asyncmsgq, PA_SINK_MESSAGE_SHUTDOWN, NULL);
|
pa_asyncmsgq_send(u->sink->asyncmsgq, PA_SINK_MESSAGE_SHUTDOWN, NULL);
|
||||||
pa_thread_free(u->thread);
|
pa_thread_free(u->thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_sink_unref(u->sink);
|
pa_sink_unref(u->sink);
|
||||||
|
|
||||||
if (u->memchunk.memblock)
|
if (u->memchunk.memblock)
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ pa_asyncmsgq *pa_asyncmsgq_new(unsigned size) {
|
||||||
pa_assert_se(a->asyncq = pa_asyncq_new(size));
|
pa_assert_se(a->asyncq = pa_asyncq_new(size));
|
||||||
pa_assert_se(a->mutex = pa_mutex_new(0));
|
pa_assert_se(a->mutex = pa_mutex_new(0));
|
||||||
a->current = NULL;
|
a->current = NULL;
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,10 +82,10 @@ void pa_asyncmsgq_free(pa_asyncmsgq *a) {
|
||||||
|
|
||||||
if (i->memchunk.memblock)
|
if (i->memchunk.memblock)
|
||||||
pa_memblock_unref(i->object);
|
pa_memblock_unref(i->object);
|
||||||
|
|
||||||
if (i->userdata_free_cb)
|
if (i->userdata_free_cb)
|
||||||
i->userdata_free_cb(i->userdata);
|
i->userdata_free_cb(i->userdata);
|
||||||
|
|
||||||
if (pa_flist_push(PA_STATIC_FLIST_GET(asyncmsgq), i) < 0)
|
if (pa_flist_push(PA_STATIC_FLIST_GET(asyncmsgq), i) < 0)
|
||||||
pa_xfree(i);
|
pa_xfree(i);
|
||||||
}
|
}
|
||||||
|
|
@ -162,7 +162,7 @@ int pa_asyncmsgq_get(pa_asyncmsgq *a, pa_msgobject **object, int *code, void **u
|
||||||
*object = a->current->object;
|
*object = a->current->object;
|
||||||
if (chunk)
|
if (chunk)
|
||||||
*chunk = a->chunk;
|
*chunk = a->chunk;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,7 +183,7 @@ void pa_asyncmsgq_done(pa_asyncmsgq *a, int ret) {
|
||||||
|
|
||||||
if (a->current->memchunk.memblock)
|
if (a->current->memchunk.memblock)
|
||||||
pa_memblock_unref(a->current->memchunk.memblock);
|
pa_memblock_unref(a->current->memchunk.memblock);
|
||||||
|
|
||||||
if (pa_flist_push(PA_STATIC_FLIST_GET(asyncmsgq), a->current) < 0)
|
if (pa_flist_push(PA_STATIC_FLIST_GET(asyncmsgq), a->current) < 0)
|
||||||
pa_xfree(a->current);
|
pa_xfree(a->current);
|
||||||
}
|
}
|
||||||
|
|
@ -194,14 +194,14 @@ void pa_asyncmsgq_done(pa_asyncmsgq *a, int ret) {
|
||||||
int pa_asyncmsgq_wait_for(pa_asyncmsgq *a, int code) {
|
int pa_asyncmsgq_wait_for(pa_asyncmsgq *a, int code) {
|
||||||
int c;
|
int c;
|
||||||
pa_assert(a);
|
pa_assert(a);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
if (pa_asyncmsgq_get(a, NULL, &c, NULL, 1) < 0)
|
if (pa_asyncmsgq_get(a, NULL, &c, NULL, 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pa_asyncmsgq_done(a);
|
pa_asyncmsgq_done(a);
|
||||||
|
|
||||||
} while (c != code);
|
} while (c != code);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ pa_asyncq *pa_asyncq_new(unsigned size) {
|
||||||
pa_xfree(l);
|
pa_xfree(l);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pipe(l->write_fds) < 0) {
|
if (pipe(l->write_fds) < 0) {
|
||||||
pa_close(l->read_fds[0]);
|
pa_close(l->read_fds[0]);
|
||||||
pa_close(l->read_fds[1]);
|
pa_close(l->read_fds[1]);
|
||||||
|
|
@ -104,7 +104,7 @@ void pa_asyncq_free(pa_asyncq *l, pa_free_cb_t free_cb) {
|
||||||
|
|
||||||
if (free_cb) {
|
if (free_cb) {
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
while ((p = pa_asyncq_pop(l, 0)))
|
while ((p = pa_asyncq_pop(l, 0)))
|
||||||
free_cb(p);
|
free_cb(p);
|
||||||
}
|
}
|
||||||
|
|
@ -113,7 +113,7 @@ void pa_asyncq_free(pa_asyncq *l, pa_free_cb_t free_cb) {
|
||||||
pa_close(l->read_fds[1]);
|
pa_close(l->read_fds[1]);
|
||||||
pa_close(l->write_fds[0]);
|
pa_close(l->write_fds[0]);
|
||||||
pa_close(l->write_fds[1]);
|
pa_close(l->write_fds[1]);
|
||||||
|
|
||||||
pa_xfree(l);
|
pa_xfree(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,12 +125,12 @@ int pa_asyncq_push(pa_asyncq*l, void *p, int wait) {
|
||||||
pa_assert(p);
|
pa_assert(p);
|
||||||
|
|
||||||
cells = PA_ASYNCQ_CELLS(l);
|
cells = PA_ASYNCQ_CELLS(l);
|
||||||
|
|
||||||
_Y;
|
_Y;
|
||||||
idx = reduce(l, l->write_idx);
|
idx = reduce(l, l->write_idx);
|
||||||
|
|
||||||
if (!pa_atomic_ptr_cmpxchg(&cells[idx], NULL, p)) {
|
if (!pa_atomic_ptr_cmpxchg(&cells[idx], NULL, p)) {
|
||||||
|
|
||||||
/* First try failed. Let's wait for changes. */
|
/* First try failed. Let's wait for changes. */
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
|
|
@ -142,7 +142,7 @@ int pa_asyncq_push(pa_asyncq*l, void *p, int wait) {
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char x[20];
|
char x[20];
|
||||||
|
|
||||||
_Y;
|
_Y;
|
||||||
|
|
||||||
if (pa_atomic_ptr_cmpxchg(&cells[idx], NULL, p))
|
if (pa_atomic_ptr_cmpxchg(&cells[idx], NULL, p))
|
||||||
|
|
@ -155,21 +155,21 @@ int pa_asyncq_push(pa_asyncq*l, void *p, int wait) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_Y;
|
_Y;
|
||||||
|
|
||||||
pa_atomic_dec(&l->write_waiting);
|
pa_atomic_dec(&l->write_waiting);
|
||||||
}
|
}
|
||||||
|
|
||||||
_Y;
|
_Y;
|
||||||
l->write_idx++;
|
l->write_idx++;
|
||||||
|
|
||||||
if (pa_atomic_load(&l->read_waiting)) {
|
if (pa_atomic_load(&l->read_waiting)) {
|
||||||
char x = 'x';
|
char x = 'x';
|
||||||
_Y;
|
_Y;
|
||||||
write(l->read_fds[1], &x, sizeof(x));
|
write(l->read_fds[1], &x, sizeof(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,7 +188,7 @@ void* pa_asyncq_pop(pa_asyncq*l, int wait) {
|
||||||
if (!(ret = pa_atomic_ptr_load(&cells[idx]))) {
|
if (!(ret = pa_atomic_ptr_load(&cells[idx]))) {
|
||||||
|
|
||||||
/* First try failed. Let's wait for changes. */
|
/* First try failed. Let's wait for changes. */
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ void* pa_asyncq_pop(pa_asyncq*l, int wait) {
|
||||||
_Y;
|
_Y;
|
||||||
write(l->write_fds[1], &x, sizeof(x));
|
write(l->write_fds[1], &x, sizeof(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -253,7 +253,7 @@ int pa_asyncq_before_poll(pa_asyncq *l) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pa_atomic_inc(&l->read_waiting);
|
pa_atomic_inc(&l->read_waiting);
|
||||||
|
|
||||||
if (pa_atomic_ptr_load(&cells[idx])) {
|
if (pa_atomic_ptr_load(&cells[idx])) {
|
||||||
pa_atomic_dec(&l->read_waiting);
|
pa_atomic_dec(&l->read_waiting);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
|
|
@ -53,9 +53,9 @@ static int core_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchu
|
||||||
pa_core *c = PA_CORE(o);
|
pa_core *c = PA_CORE(o);
|
||||||
|
|
||||||
pa_core_assert_ref(c);
|
pa_core_assert_ref(c);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
case PA_CORE_MESSAGE_UNLOAD_MODULE:
|
case PA_CORE_MESSAGE_UNLOAD_MODULE:
|
||||||
pa_module_unload(c, userdata);
|
pa_module_unload(c, userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -67,7 +67,7 @@ static int core_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchu
|
||||||
|
|
||||||
static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) {
|
static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) {
|
||||||
pa_core *c = userdata;
|
pa_core *c = userdata;
|
||||||
|
|
||||||
pa_assert(pa_asyncmsgq_get_fd(c->asyncmsgq) == fd);
|
pa_assert(pa_asyncmsgq_get_fd(c->asyncmsgq) == fd);
|
||||||
pa_assert(events == PA_IO_EVENT_INPUT);
|
pa_assert(events == PA_IO_EVENT_INPUT);
|
||||||
|
|
||||||
|
|
@ -84,7 +84,7 @@ static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_even
|
||||||
pa_asyncmsgq_dispatch(object, code, data, &chunk);
|
pa_asyncmsgq_dispatch(object, code, data, &chunk);
|
||||||
pa_asyncmsgq_done(c->asyncmsgq, 0);
|
pa_asyncmsgq_done(c->asyncmsgq, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pa_asyncmsgq_before_poll(c->asyncmsgq) == 0)
|
if (pa_asyncmsgq_before_poll(c->asyncmsgq) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -97,7 +97,7 @@ pa_core* pa_core_new(pa_mainloop_api *m, int shared) {
|
||||||
pa_mempool *pool;
|
pa_mempool *pool;
|
||||||
|
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
|
|
||||||
if (shared) {
|
if (shared) {
|
||||||
if (!(pool = pa_mempool_new(shared))) {
|
if (!(pool = pa_mempool_new(shared))) {
|
||||||
pa_log_warn("failed to allocate shared memory pool. Falling back to a normal memory pool.");
|
pa_log_warn("failed to allocate shared memory pool. Falling back to a normal memory pool.");
|
||||||
|
|
@ -175,7 +175,7 @@ pa_core* pa_core_new(pa_mainloop_api *m, int shared) {
|
||||||
pa_assert_se(c->asyncmsgq = pa_asyncmsgq_new(0));
|
pa_assert_se(c->asyncmsgq = pa_asyncmsgq_new(0));
|
||||||
pa_assert_se(pa_asyncmsgq_before_poll(c->asyncmsgq) == 0);
|
pa_assert_se(pa_asyncmsgq_before_poll(c->asyncmsgq) == 0);
|
||||||
pa_assert_se(c->asyncmsgq_event = c->mainloop->io_new(c->mainloop, pa_asyncmsgq_get_fd(c->asyncmsgq), PA_IO_EVENT_INPUT, asyncmsgq_cb, c));
|
pa_assert_se(c->asyncmsgq_event = c->mainloop->io_new(c->mainloop, pa_asyncmsgq_get_fd(c->asyncmsgq), PA_IO_EVENT_INPUT, asyncmsgq_cb, c));
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ typedef struct pa_core pa_core;
|
||||||
|
|
||||||
struct pa_core {
|
struct pa_core {
|
||||||
pa_msgobject parent;
|
pa_msgobject parent;
|
||||||
|
|
||||||
/* A random value which may be used to identify this instance of
|
/* A random value which may be used to identify this instance of
|
||||||
* PulseAudio. Not cryptographically secure in any way. */
|
* PulseAudio. Not cryptographically secure in any way. */
|
||||||
uint32_t cookie;
|
uint32_t cookie;
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ int pa_flist_push(pa_flist*l, void *p) {
|
||||||
assert(p);
|
assert(p);
|
||||||
|
|
||||||
cells = PA_FLIST_CELLS(l);
|
cells = PA_FLIST_CELLS(l);
|
||||||
|
|
||||||
n = len = (int) l->size - pa_atomic_load(&l->length) + N_EXTRA_SCAN;
|
n = len = (int) l->size - pa_atomic_load(&l->length) + N_EXTRA_SCAN;
|
||||||
_Y;
|
_Y;
|
||||||
idx = reduce(l, pa_atomic_load(&l->write_idx));
|
idx = reduce(l, pa_atomic_load(&l->write_idx));
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
pa_msgobject *pa_msgobject_new_internal(size_t size, const char *type_name) {
|
pa_msgobject *pa_msgobject_new_internal(size_t size, const char *type_name) {
|
||||||
pa_msgobject *o;
|
pa_msgobject *o;
|
||||||
|
|
||||||
pa_assert(size > sizeof(pa_msgobject));
|
pa_assert(size > sizeof(pa_msgobject));
|
||||||
pa_assert(type_name);
|
pa_assert(type_name);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
pa_object *pa_object_new_internal(size_t size, const char *type_name) {
|
pa_object *pa_object_new_internal(size_t size, const char *type_name) {
|
||||||
pa_object *o;
|
pa_object *o;
|
||||||
|
|
||||||
pa_assert(size > sizeof(pa_object));
|
pa_assert(size > sizeof(pa_object));
|
||||||
pa_assert(type_name);
|
pa_assert(type_name);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,5 +68,5 @@ static inline int pa_object_refcnt(pa_object *o) {
|
||||||
pa_object_assert_ref(PA_OBJECT(o)); \
|
pa_object_assert_ref(PA_OBJECT(o)); \
|
||||||
} \
|
} \
|
||||||
struct __stupid_useless_struct_to_allow_trailing_semicolon
|
struct __stupid_useless_struct_to_allow_trailing_semicolon
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -35,17 +35,17 @@
|
||||||
/* Not reentrant -- how could it be? */
|
/* Not reentrant -- how could it be? */
|
||||||
void pa_once(pa_once_t *control, pa_once_func_t func) {
|
void pa_once(pa_once_t *control, pa_once_func_t func) {
|
||||||
pa_mutex *m;
|
pa_mutex *m;
|
||||||
|
|
||||||
pa_assert(control);
|
pa_assert(control);
|
||||||
pa_assert(func);
|
pa_assert(func);
|
||||||
|
|
||||||
if (pa_atomic_load(&control->done))
|
if (pa_atomic_load(&control->done))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pa_atomic_inc(&control->ref);
|
pa_atomic_inc(&control->ref);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
if ((m = pa_atomic_ptr_load(&control->mutex))) {
|
if ((m = pa_atomic_ptr_load(&control->mutex))) {
|
||||||
|
|
||||||
/* The mutex is stored in locked state, hence let's just
|
/* The mutex is stored in locked state, hence let's just
|
||||||
|
|
@ -57,7 +57,7 @@ void pa_once(pa_once_t *control, pa_once_func_t func) {
|
||||||
|
|
||||||
pa_assert_se(m = pa_mutex_new(0));
|
pa_assert_se(m = pa_mutex_new(0));
|
||||||
pa_mutex_lock(m);
|
pa_mutex_lock(m);
|
||||||
|
|
||||||
if (pa_atomic_ptr_cmpxchg(&control->mutex, NULL, m)) {
|
if (pa_atomic_ptr_cmpxchg(&control->mutex, NULL, m)) {
|
||||||
func();
|
func();
|
||||||
pa_atomic_store(&control->done, 1);
|
pa_atomic_store(&control->done, 1);
|
||||||
|
|
@ -71,7 +71,7 @@ void pa_once(pa_once_t *control, pa_once_func_t func) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_assert(pa_atomic_load(&control->done));
|
pa_assert(pa_atomic_load(&control->done));
|
||||||
|
|
||||||
if (pa_atomic_dec(&control->ref) <= 1) {
|
if (pa_atomic_dec(&control->ref) <= 1) {
|
||||||
pa_assert(pa_atomic_ptr_cmpxchg(&control->mutex, m, NULL));
|
pa_assert(pa_atomic_ptr_cmpxchg(&control->mutex, m, NULL));
|
||||||
pa_mutex_free(m);
|
pa_mutex_free(m);
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MESSAGE_REQUEST_DATA, /* data from source output to main loop */
|
MESSAGE_REQUEST_DATA, /* data from source output to main loop */
|
||||||
MESSAGE_POST_DATA /* data from source output to main loop */
|
MESSAGE_POST_DATA /* data from source output to main loop */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define PLAYBACK_BUFFER_SECONDS (.5)
|
#define PLAYBACK_BUFFER_SECONDS (.5)
|
||||||
#define PLAYBACK_BUFFER_FRAGMENTS (10)
|
#define PLAYBACK_BUFFER_FRAGMENTS (10)
|
||||||
#define RECORD_BUFFER_SECONDS (5)
|
#define RECORD_BUFFER_SECONDS (5)
|
||||||
|
|
@ -105,15 +105,15 @@ static void connection_free(struct connection *c) {
|
||||||
pa_sink_input_disconnect(c->sink_input);
|
pa_sink_input_disconnect(c->sink_input);
|
||||||
pa_sink_input_unref(c->sink_input);
|
pa_sink_input_unref(c->sink_input);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->source_output) {
|
if (c->source_output) {
|
||||||
pa_source_output_disconnect(c->source_output);
|
pa_source_output_disconnect(c->source_output);
|
||||||
pa_source_output_unref(c->source_output);
|
pa_source_output_unref(c->source_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->playback.current_memblock)
|
if (c->playback.current_memblock)
|
||||||
pa_memblock_unref(c->playback.current_memblock);
|
pa_memblock_unref(c->playback.current_memblock);
|
||||||
|
|
||||||
if (c->client)
|
if (c->client)
|
||||||
pa_client_free(c->client);
|
pa_client_free(c->client);
|
||||||
if (c->io)
|
if (c->io)
|
||||||
|
|
@ -122,7 +122,7 @@ static void connection_free(struct connection *c) {
|
||||||
pa_memblockq_free(c->input_memblockq);
|
pa_memblockq_free(c->input_memblockq);
|
||||||
if (c->output_memblockq)
|
if (c->output_memblockq)
|
||||||
pa_memblockq_free(c->output_memblockq);
|
pa_memblockq_free(c->output_memblockq);
|
||||||
|
|
||||||
pa_xfree(c);
|
pa_xfree(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,7 +133,7 @@ static int do_read(struct connection *c) {
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
||||||
if (!c->sink_input || !(l = pa_atomic_load(&c->playback.missing)))
|
if (!c->sink_input || !(l = pa_atomic_load(&c->playback.missing)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -155,12 +155,12 @@ static int do_read(struct connection *c) {
|
||||||
p = pa_memblock_acquire(c->playback.current_memblock);
|
p = pa_memblock_acquire(c->playback.current_memblock);
|
||||||
r = pa_iochannel_read(c->io, (uint8_t*) p + c->playback.memblock_index, l);
|
r = pa_iochannel_read(c->io, (uint8_t*) p + c->playback.memblock_index, l);
|
||||||
pa_memblock_release(c->playback.current_memblock);
|
pa_memblock_release(c->playback.current_memblock);
|
||||||
|
|
||||||
if (r <= 0) {
|
if (r <= 0) {
|
||||||
|
|
||||||
if (errno == EINTR || errno == EAGAIN)
|
if (errno == EINTR || errno == EAGAIN)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pa_log_debug("read(): %s", r == 0 ? "EOF" : pa_cstrerror(errno));
|
pa_log_debug("read(): %s", r == 0 ? "EOF" : pa_cstrerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -195,7 +195,7 @@ static int do_write(struct connection *c) {
|
||||||
p = pa_memblock_acquire(chunk.memblock);
|
p = pa_memblock_acquire(chunk.memblock);
|
||||||
r = pa_iochannel_write(c->io, (uint8_t*) p+chunk.index, chunk.length);
|
r = pa_iochannel_write(c->io, (uint8_t*) p+chunk.index, chunk.length);
|
||||||
pa_memblock_release(chunk.memblock);
|
pa_memblock_release(chunk.memblock);
|
||||||
|
|
||||||
pa_memblock_unref(chunk.memblock);
|
pa_memblock_unref(chunk.memblock);
|
||||||
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
|
|
@ -208,7 +208,7 @@ static int do_write(struct connection *c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_memblockq_drop(c->output_memblockq, &chunk, r);
|
pa_memblockq_drop(c->output_memblockq, &chunk, r);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -251,7 +251,7 @@ fail:
|
||||||
/* Called from thread context */
|
/* Called from thread context */
|
||||||
static int sink_input_process_msg(pa_sink_input *i, int code, void *userdata, const pa_memchunk *chunk) {
|
static int sink_input_process_msg(pa_sink_input *i, int code, void *userdata, const pa_memchunk *chunk) {
|
||||||
struct connection*c;
|
struct connection*c;
|
||||||
|
|
||||||
pa_assert(i);
|
pa_assert(i);
|
||||||
c = i->userdata;
|
c = i->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
@ -265,10 +265,10 @@ static int sink_input_process_msg(pa_sink_input *i, int code, void *userdata, co
|
||||||
pa_memblockq_push_align(c->input_memblockq, chunk);
|
pa_memblockq_push_align(c->input_memblockq, chunk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
||||||
pa_usec_t *r = userdata;
|
pa_usec_t *r = userdata;
|
||||||
|
|
||||||
*r = pa_bytes_to_usec(pa_memblockq_get_length(c->input_memblockq), &c->sink_input->sample_spec);
|
*r = pa_bytes_to_usec(pa_memblockq_get_length(c->input_memblockq), &c->sink_input->sample_spec);
|
||||||
|
|
||||||
/* Fall through, the default handler will add in the extra
|
/* Fall through, the default handler will add in the extra
|
||||||
|
|
@ -283,7 +283,7 @@ static int sink_input_process_msg(pa_sink_input *i, int code, void *userdata, co
|
||||||
/* Called from thread context */
|
/* Called from thread context */
|
||||||
static int sink_input_peek_cb(pa_sink_input *i, pa_memchunk *chunk) {
|
static int sink_input_peek_cb(pa_sink_input *i, pa_memchunk *chunk) {
|
||||||
struct connection*c;
|
struct connection*c;
|
||||||
|
|
||||||
pa_assert(i);
|
pa_assert(i);
|
||||||
c = i->userdata;
|
c = i->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
@ -301,7 +301,7 @@ static int sink_input_peek_cb(pa_sink_input *i, pa_memchunk *chunk) {
|
||||||
static void sink_input_drop_cb(pa_sink_input *i, const pa_memchunk *chunk, size_t length) {
|
static void sink_input_drop_cb(pa_sink_input *i, const pa_memchunk *chunk, size_t length) {
|
||||||
struct connection*c = i->userdata;
|
struct connection*c = i->userdata;
|
||||||
size_t old, new;
|
size_t old, new;
|
||||||
|
|
||||||
pa_assert(i);
|
pa_assert(i);
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
pa_assert(length);
|
pa_assert(length);
|
||||||
|
|
@ -320,7 +320,7 @@ static void sink_input_drop_cb(pa_sink_input *i, const pa_memchunk *chunk, size_
|
||||||
static void sink_input_kill_cb(pa_sink_input *i) {
|
static void sink_input_kill_cb(pa_sink_input *i) {
|
||||||
pa_assert(i);
|
pa_assert(i);
|
||||||
pa_assert(i->userdata);
|
pa_assert(i->userdata);
|
||||||
|
|
||||||
connection_free((struct connection *) i->userdata);
|
connection_free((struct connection *) i->userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -328,7 +328,7 @@ static void sink_input_kill_cb(pa_sink_input *i) {
|
||||||
|
|
||||||
static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) {
|
static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) {
|
||||||
struct connection *c;
|
struct connection *c;
|
||||||
|
|
||||||
pa_assert(o);
|
pa_assert(o);
|
||||||
c = o->userdata;
|
c = o->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
@ -343,17 +343,17 @@ static void source_output_kill_cb(pa_source_output *o) {
|
||||||
pa_assert(o);
|
pa_assert(o);
|
||||||
c = o->userdata;
|
c = o->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
||||||
connection_free(c);
|
connection_free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
|
static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
|
||||||
struct connection*c;
|
struct connection*c;
|
||||||
|
|
||||||
pa_assert(o);
|
pa_assert(o);
|
||||||
c = o->userdata;
|
c = o->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
||||||
return pa_bytes_to_usec(pa_memblockq_get_length(c->output_memblockq), &c->source_output->sample_spec);
|
return pa_bytes_to_usec(pa_memblockq_get_length(c->output_memblockq), &c->source_output->sample_spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -361,7 +361,7 @@ static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
|
||||||
|
|
||||||
static void client_kill_cb(pa_client *client) {
|
static void client_kill_cb(pa_client *client) {
|
||||||
struct connection*c;
|
struct connection*c;
|
||||||
|
|
||||||
pa_assert(client);
|
pa_assert(client);
|
||||||
c = client->userdata;
|
c = client->userdata;
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
@ -386,7 +386,7 @@ static void on_connection(pa_socket_server*s, pa_iochannel *io, void *userdata)
|
||||||
pa_protocol_simple *p = userdata;
|
pa_protocol_simple *p = userdata;
|
||||||
struct connection *c = NULL;
|
struct connection *c = NULL;
|
||||||
char cname[256];
|
char cname[256];
|
||||||
|
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
pa_assert(io);
|
pa_assert(io);
|
||||||
pa_assert(p);
|
pa_assert(p);
|
||||||
|
|
@ -415,7 +415,7 @@ static void on_connection(pa_socket_server*s, pa_iochannel *io, void *userdata)
|
||||||
c->client->kill = client_kill_cb;
|
c->client->kill = client_kill_cb;
|
||||||
c->client->userdata = c;
|
c->client->userdata = c;
|
||||||
|
|
||||||
|
|
||||||
if (p->mode & PLAYBACK) {
|
if (p->mode & PLAYBACK) {
|
||||||
pa_sink_input_new_data data;
|
pa_sink_input_new_data data;
|
||||||
size_t l;
|
size_t l;
|
||||||
|
|
@ -493,7 +493,7 @@ static void on_connection(pa_socket_server*s, pa_iochannel *io, void *userdata)
|
||||||
|
|
||||||
pa_iochannel_set_callback(c->io, io_callback, c);
|
pa_iochannel_set_callback(c->io, io_callback, c);
|
||||||
pa_idxset_put(p->connections, c, NULL);
|
pa_idxset_put(p->connections, c, NULL);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
@ -504,7 +504,7 @@ fail:
|
||||||
static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) {
|
static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) {
|
||||||
pa_protocol_simple *p = userdata;
|
pa_protocol_simple *p = userdata;
|
||||||
int do_some_work = 0;
|
int do_some_work = 0;
|
||||||
|
|
||||||
pa_assert(pa_asyncmsgq_get_fd(p->asyncmsgq) == fd);
|
pa_assert(pa_asyncmsgq_get_fd(p->asyncmsgq) == fd);
|
||||||
pa_assert(events == PA_IO_EVENT_INPUT);
|
pa_assert(events == PA_IO_EVENT_INPUT);
|
||||||
|
|
||||||
|
|
@ -520,7 +520,7 @@ static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_even
|
||||||
connection *c = object;
|
connection *c = object;
|
||||||
|
|
||||||
pa_assert(c);
|
pa_assert(c);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
case MESSAGE_REQUEST_DATA:
|
case MESSAGE_REQUEST_DATA:
|
||||||
|
|
@ -535,7 +535,7 @@ static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_even
|
||||||
|
|
||||||
pa_asyncmsgq_done(p->asyncmsgq);
|
pa_asyncmsgq_done(p->asyncmsgq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pa_asyncmsgq_before_poll(p->asyncmsgq) == 0)
|
if (pa_asyncmsgq_before_poll(p->asyncmsgq) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -544,7 +544,7 @@ static void asyncmsgq_cb(pa_mainloop_api*api, pa_io_event* e, int fd, pa_io_even
|
||||||
pa_protocol_simple* pa_protocol_simple_new(pa_core *core, pa_socket_server *server, pa_module *m, pa_modargs *ma) {
|
pa_protocol_simple* pa_protocol_simple_new(pa_core *core, pa_socket_server *server, pa_module *m, pa_modargs *ma) {
|
||||||
pa_protocol_simple* p = NULL;
|
pa_protocol_simple* p = NULL;
|
||||||
int enable;
|
int enable;
|
||||||
|
|
||||||
pa_assert(core);
|
pa_assert(core);
|
||||||
pa_assert(server);
|
pa_assert(server);
|
||||||
pa_assert(ma);
|
pa_assert(ma);
|
||||||
|
|
@ -588,13 +588,13 @@ pa_protocol_simple* pa_protocol_simple_new(pa_core *core, pa_socket_server *serv
|
||||||
|
|
||||||
pa_assert_se(pa_asyncmsgq_before_poll(p->asyncmsgq) == 0);
|
pa_assert_se(pa_asyncmsgq_before_poll(p->asyncmsgq) == 0);
|
||||||
pa_assert_se(p->asyncmsgq_event = core->mainloop->io_event_new(core->mainloop, pa_asyncmsgq_get_fd(p->asyncmsgq), PA_IO_EVENT_INPUT, p));
|
pa_assert_se(p->asyncmsgq_event = core->mainloop->io_event_new(core->mainloop, pa_asyncmsgq_get_fd(p->asyncmsgq), PA_IO_EVENT_INPUT, p));
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (p)
|
if (p)
|
||||||
pa_protocol_simple_free(p);
|
pa_protocol_simple_free(p);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -618,7 +618,7 @@ void pa_protocol_simple_free(pa_protocol_simple *p) {
|
||||||
pa_asyncmsgq_after_poll(c->asyncmsgq);
|
pa_asyncmsgq_after_poll(c->asyncmsgq);
|
||||||
pa_asyncmsgq_free(p->asyncmsgq);
|
pa_asyncmsgq_free(p->asyncmsgq);
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_xfree(p);
|
pa_xfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ void pa_semaphore_post(pa_semaphore *s) {
|
||||||
void pa_semaphore_wait(pa_semaphore *s) {
|
void pa_semaphore_wait(pa_semaphore *s) {
|
||||||
int ret;
|
int ret;
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = sem_wait(&s->sem);
|
ret = sem_wait(&s->sem);
|
||||||
} while (ret < 0 && errno == EINTR);
|
} while (ret < 0 && errno == EINTR);
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data
|
||||||
|
|
||||||
memset(data, 0, sizeof(*data));
|
memset(data, 0, sizeof(*data));
|
||||||
data->resample_method = PA_RESAMPLER_INVALID;
|
data->resample_method = PA_RESAMPLER_INVALID;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,7 +117,7 @@ pa_sink_input* pa_sink_input_new(
|
||||||
if (!data->channel_map_is_set) {
|
if (!data->channel_map_is_set) {
|
||||||
if (data->sink->channel_map.channels == data->sample_spec.channels)
|
if (data->sink->channel_map.channels == data->sample_spec.channels)
|
||||||
data->channel_map = data->sink->channel_map;
|
data->channel_map = data->sink->channel_map;
|
||||||
else
|
else
|
||||||
pa_channel_map_init_auto(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
|
pa_channel_map_init_auto(&data->channel_map, data->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,7 +132,7 @@ pa_sink_input* pa_sink_input_new(
|
||||||
|
|
||||||
if (!data->muted_is_set)
|
if (!data->muted_is_set)
|
||||||
data->muted = 0;
|
data->muted = 0;
|
||||||
|
|
||||||
if (data->resample_method == PA_RESAMPLER_INVALID)
|
if (data->resample_method == PA_RESAMPLER_INVALID)
|
||||||
data->resample_method = core->resample_method;
|
data->resample_method = core->resample_method;
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ pa_sink_input* pa_sink_input_new(
|
||||||
|
|
||||||
i->parent.parent.free = sink_input_free;
|
i->parent.parent.free = sink_input_free;
|
||||||
i->parent.process_msg = pa_sink_input_process_msg;
|
i->parent.process_msg = pa_sink_input_process_msg;
|
||||||
|
|
||||||
i->core = core;
|
i->core = core;
|
||||||
pa_atomic_load(&i->state, PA_SINK_INPUT_DRAINED);
|
pa_atomic_load(&i->state, PA_SINK_INPUT_DRAINED);
|
||||||
i->flags = flags;
|
i->flags = flags;
|
||||||
|
|
@ -172,14 +172,14 @@ pa_sink_input* pa_sink_input_new(
|
||||||
i->module = data->module;
|
i->module = data->module;
|
||||||
i->sink = data->sink;
|
i->sink = data->sink;
|
||||||
i->client = data->client;
|
i->client = data->client;
|
||||||
|
|
||||||
i->resample_method = data->resample_method;
|
i->resample_method = data->resample_method;
|
||||||
i->sample_spec = data->sample_spec;
|
i->sample_spec = data->sample_spec;
|
||||||
i->channel_map = data->channel_map;
|
i->channel_map = data->channel_map;
|
||||||
|
|
||||||
i->volume = data->volume;
|
i->volume = data->volume;
|
||||||
i->muted = data->muted;
|
i->muted = data->muted;
|
||||||
|
|
||||||
i->process_msg = NULL;
|
i->process_msg = NULL;
|
||||||
i->peek = NULL;
|
i->peek = NULL;
|
||||||
i->drop = NULL;
|
i->drop = NULL;
|
||||||
|
|
@ -214,7 +214,7 @@ void pa_sink_input_disconnect(pa_sink_input *i) {
|
||||||
pa_return_if_fail(pa_sink_input_get_state(i) != PA_SINK_INPUT_DISCONNECTED);
|
pa_return_if_fail(pa_sink_input_get_state(i) != PA_SINK_INPUT_DISCONNECTED);
|
||||||
|
|
||||||
pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SINK_MESSAGE_REMOVE_INPUT, i, NULL);
|
pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SINK_MESSAGE_REMOVE_INPUT, i, NULL);
|
||||||
|
|
||||||
pa_idxset_remove_by_data(i->sink->core->sink_inputs, i, NULL);
|
pa_idxset_remove_by_data(i->sink->core->sink_inputs, i, NULL);
|
||||||
pa_idxset_remove_by_data(i->sink->inputs, i, NULL);
|
pa_idxset_remove_by_data(i->sink->inputs, i, NULL);
|
||||||
|
|
||||||
|
|
@ -236,7 +236,7 @@ static void sink_input_free(pa_msgobject *o) {
|
||||||
|
|
||||||
pa_assert(i);
|
pa_assert(i);
|
||||||
pa_assert(pa_sink_input_refcnt(i) == 0);
|
pa_assert(pa_sink_input_refcnt(i) == 0);
|
||||||
|
|
||||||
pa_sink_input_disconnect(i);
|
pa_sink_input_disconnect(i);
|
||||||
|
|
||||||
pa_log_info("Freeing output %u \"%s\"", i->index, i->name);
|
pa_log_info("Freeing output %u \"%s\"", i->index, i->name);
|
||||||
|
|
@ -281,7 +281,7 @@ pa_usec_t pa_sink_input_get_latency(pa_sink_input *i) {
|
||||||
|
|
||||||
if (pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SINK_INPUT_MESSAGE_GET_LATENCY, &r, NULL) < 0)
|
if (pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SINK_INPUT_MESSAGE_GET_LATENCY, &r, NULL) < 0)
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
if (i->get_latency)
|
if (i->get_latency)
|
||||||
r += i->get_latency(i);
|
r += i->get_latency(i);
|
||||||
|
|
||||||
|
|
@ -293,7 +293,7 @@ int pa_sink_input_peek(pa_sink_input *i, pa_memchunk *chunk, pa_cvolume *volume)
|
||||||
int do_volume_adj_here;
|
int do_volume_adj_here;
|
||||||
int volume_is_norm;
|
int volume_is_norm;
|
||||||
pa_sink_input_state_t state;
|
pa_sink_input_state_t state;
|
||||||
|
|
||||||
pa_sink_input_assert_ref(i);
|
pa_sink_input_assert_ref(i);
|
||||||
pa_assert(chunk);
|
pa_assert(chunk);
|
||||||
pa_assert(volume);
|
pa_assert(volume);
|
||||||
|
|
@ -508,7 +508,7 @@ int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) {
|
||||||
i->sample_spec.rate = rate;
|
i->sample_spec.rate = rate;
|
||||||
|
|
||||||
pa_asyncmsgq_post(s->asyncmsgq, pa_sink_input_ref(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), NULL, pa_sink_input_unref, NULL);
|
pa_asyncmsgq_post(s->asyncmsgq, pa_sink_input_ref(i), PA_SINK_INPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), NULL, pa_sink_input_unref, NULL);
|
||||||
|
|
||||||
pa_subscription_post(i->sink->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
|
pa_subscription_post(i->sink->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
@ -543,7 +543,7 @@ int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, int immediately) {
|
||||||
pa_sink_assert_ref(dest);
|
pa_sink_assert_ref(dest);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* origin = i->sink; */
|
/* origin = i->sink; */
|
||||||
|
|
||||||
/* if (dest == origin) */
|
/* if (dest == origin) */
|
||||||
|
|
@ -697,32 +697,32 @@ int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, int immediately) {
|
||||||
|
|
||||||
int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchunk *chunk) {
|
int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchunk *chunk) {
|
||||||
pa_sink_input *i = PA_SINK_INPUT(o);
|
pa_sink_input *i = PA_SINK_INPUT(o);
|
||||||
|
|
||||||
pa_sink_input_assert_ref(i);
|
pa_sink_input_assert_ref(i);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case PA_SINK_INPUT_MESSAGE_SET_VOLUME:
|
case PA_SINK_INPUT_MESSAGE_SET_VOLUME:
|
||||||
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SINK_INPUT_MESSAGE_SET_MUTE:
|
case PA_SINK_INPUT_MESSAGE_SET_MUTE:
|
||||||
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
|
||||||
pa_usec_t *r = userdata;
|
pa_usec_t *r = userdata;
|
||||||
|
|
||||||
if (i->thread_info.resampled_chunk.memblock)
|
if (i->thread_info.resampled_chunk.memblock)
|
||||||
*r += pa_bytes_to_usec(i->resampled_chunk.length, &i->sink->sample_spec);
|
*r += pa_bytes_to_usec(i->resampled_chunk.length, &i->sink->sample_spec);
|
||||||
|
|
||||||
/* if (i->move_silence) */
|
/* if (i->move_silence) */
|
||||||
/* r += pa_bytes_to_usec(i->move_silence, &i->sink->sample_spec); */
|
/* r += pa_bytes_to_usec(i->move_silence, &i->sink->sample_spec); */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SINK_INPUT_MESSAGE_SET_RATE: {
|
case PA_SINK_INPUT_MESSAGE_SET_RATE: {
|
||||||
|
|
||||||
i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
|
i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
|
||||||
pa_resampler_set_input_rate(i->resampler, PA_PTR_TO_UINT(userdata));
|
pa_resampler_set_input_rate(i->resampler, PA_PTR_TO_UINT(userdata));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ typedef enum pa_sink_input_flags {
|
||||||
|
|
||||||
struct pa_sink_input {
|
struct pa_sink_input {
|
||||||
pa_msgobject parent;
|
pa_msgobject parent;
|
||||||
|
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
pa_core *core;
|
pa_core *core;
|
||||||
pa_atomic_t state;
|
pa_atomic_t state;
|
||||||
|
|
@ -66,11 +66,11 @@ struct pa_sink_input {
|
||||||
|
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
pa_channel_map channel_map;
|
pa_channel_map channel_map;
|
||||||
|
|
||||||
pa_cvolume volume;
|
pa_cvolume volume;
|
||||||
int muted;
|
int muted;
|
||||||
|
|
||||||
int (*process_msg)(pa_sink_input *i, int code, void *userdata);
|
int (*process_msg)(pa_sink_input *i, int code, void *userdata);
|
||||||
int (*peek) (pa_sink_input *i, pa_memchunk *chunk);
|
int (*peek) (pa_sink_input *i, pa_memchunk *chunk);
|
||||||
void (*drop) (pa_sink_input *i, const pa_memchunk *chunk, size_t length);
|
void (*drop) (pa_sink_input *i, const pa_memchunk *chunk, size_t length);
|
||||||
void (*kill) (pa_sink_input *i); /* may be NULL */
|
void (*kill) (pa_sink_input *i); /* may be NULL */
|
||||||
|
|
@ -81,10 +81,10 @@ struct pa_sink_input {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
|
|
||||||
pa_memchunk resampled_chunk;
|
pa_memchunk resampled_chunk;
|
||||||
pa_resampler *resampler; /* may be NULL */
|
pa_resampler *resampler; /* may be NULL */
|
||||||
|
|
||||||
/* Some silence to play before the actual data. This is used to
|
/* Some silence to play before the actual data. This is used to
|
||||||
* compensate for latency differences when moving a sink input
|
* compensate for latency differences when moving a sink input
|
||||||
* "hot" between sinks. */
|
* "hot" between sinks. */
|
||||||
|
|
@ -94,7 +94,7 @@ struct pa_sink_input {
|
||||||
pa_cvolume volume;
|
pa_cvolume volume;
|
||||||
int muted;
|
int muted;
|
||||||
} thread_info;
|
} thread_info;
|
||||||
|
|
||||||
void *userdata;
|
void *userdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ pa_sink* pa_sink_new(
|
||||||
|
|
||||||
s->parent.parent.free = sink_free;
|
s->parent.parent.free = sink_free;
|
||||||
s->parent.process_msg = pa_sink_process_msg;
|
s->parent.process_msg = pa_sink_process_msg;
|
||||||
|
|
||||||
s->core = core;
|
s->core = core;
|
||||||
pa_atomic_store(&s->state, PA_SINK_IDLE);
|
pa_atomic_store(&s->state, PA_SINK_IDLE);
|
||||||
s->name = pa_xstrdup(name);
|
s->name = pa_xstrdup(name);
|
||||||
|
|
@ -115,7 +115,7 @@ pa_sink* pa_sink_new(
|
||||||
s->userdata = NULL;
|
s->userdata = NULL;
|
||||||
|
|
||||||
pa_assert_se(s->asyncmsgq = pa_asyncmsgq_new(0));
|
pa_assert_se(s->asyncmsgq = pa_asyncmsgq_new(0));
|
||||||
|
|
||||||
r = pa_idxset_put(core->sinks, s, &s->index);
|
r = pa_idxset_put(core->sinks, s, &s->index);
|
||||||
pa_assert(s->index != PA_IDXSET_INVALID && r >= 0);
|
pa_assert(s->index != PA_IDXSET_INVALID && r >= 0);
|
||||||
|
|
||||||
|
|
@ -139,7 +139,7 @@ pa_sink* pa_sink_new(
|
||||||
s->thread_info.inputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
s->thread_info.inputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
||||||
s->thread_info.soft_volume = s->volume;
|
s->thread_info.soft_volume = s->volume;
|
||||||
s->thread_info.soft_muted = s->muted;
|
s->thread_info.soft_muted = s->muted;
|
||||||
|
|
||||||
pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_NEW, s->index);
|
pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_NEW, s->index);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
|
|
@ -163,7 +163,7 @@ static void sink_start(pa_sink *s) {
|
||||||
static void sink_stop(pa_sink *s) {
|
static void sink_stop(pa_sink *s) {
|
||||||
pa_sink_state_t state;
|
pa_sink_state_t state;
|
||||||
int stop;
|
int stop;
|
||||||
|
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
state = pa_sink_get_state(s);
|
state = pa_sink_get_state(s);
|
||||||
pa_return_if_fail(state == PA_SINK_RUNNING || state == PA_SINK_SUSPENDED);
|
pa_return_if_fail(state == PA_SINK_RUNNING || state == PA_SINK_SUSPENDED);
|
||||||
|
|
@ -216,7 +216,7 @@ void pa_sink_disconnect(pa_sink* s) {
|
||||||
|
|
||||||
static void sink_free(pa_object *o) {
|
static void sink_free(pa_object *o) {
|
||||||
pa_sink *s = PA_SINK(o);
|
pa_sink *s = PA_SINK(o);
|
||||||
|
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
pa_assert(pa_sink_refcnt(s) == 0);
|
pa_assert(pa_sink_refcnt(s) == 0);
|
||||||
|
|
||||||
|
|
@ -230,11 +230,11 @@ static void sink_free(pa_object *o) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_idxset_free(s->inputs, NULL, NULL);
|
pa_idxset_free(s->inputs, NULL, NULL);
|
||||||
|
|
||||||
pa_hashmap_free(s->thread_info.inputs, (pa_free2_cb_t) pa_sink_input_unref, NULL);
|
pa_hashmap_free(s->thread_info.inputs, (pa_free2_cb_t) pa_sink_input_unref, NULL);
|
||||||
|
|
||||||
pa_asyncmsgq_free(s->asyncmsgq);
|
pa_asyncmsgq_free(s->asyncmsgq);
|
||||||
|
|
||||||
pa_xfree(s->name);
|
pa_xfree(s->name);
|
||||||
pa_xfree(s->description);
|
pa_xfree(s->description);
|
||||||
pa_xfree(s->driver);
|
pa_xfree(s->driver);
|
||||||
|
|
@ -246,7 +246,7 @@ void pa_sink_update_status(pa_sink*s) {
|
||||||
|
|
||||||
if (pa_sink_get_state(s) == PA_SINK_SUSPENDED)
|
if (pa_sink_get_state(s) == PA_SINK_SUSPENDED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pa_sink_used_by(s) > 0)
|
if (pa_sink_used_by(s) > 0)
|
||||||
sink_start(s);
|
sink_start(s);
|
||||||
else
|
else
|
||||||
|
|
@ -270,7 +270,7 @@ void pa_sink_suspend(pa_sink *s, int suspend) {
|
||||||
s->stop(s);
|
s->stop(s);
|
||||||
else
|
else
|
||||||
pa_asyncmsgq_post(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_STOP, NULL, NULL, NULL);
|
pa_asyncmsgq_post(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_STOP, NULL, NULL, NULL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pa_atomic_store(&s->state, PA_SINK_RUNNING);
|
pa_atomic_store(&s->state, PA_SINK_RUNNING);
|
||||||
|
|
||||||
|
|
@ -417,38 +417,38 @@ int pa_sink_render_into(pa_sink*s, pa_memchunk *target) {
|
||||||
else {
|
else {
|
||||||
void *src, *ptr;
|
void *src, *ptr;
|
||||||
pa_cvolume volume;
|
pa_cvolume volume;
|
||||||
|
|
||||||
ptr = pa_memblock_acquire(target->memblock);
|
ptr = pa_memblock_acquire(target->memblock);
|
||||||
src = pa_memblock_acquire(info[0].chunk.memblock);
|
src = pa_memblock_acquire(info[0].chunk.memblock);
|
||||||
|
|
||||||
memcpy((uint8_t*) ptr + target->index,
|
memcpy((uint8_t*) ptr + target->index,
|
||||||
(uint8_t*) src + info[0].chunk.index,
|
(uint8_t*) src + info[0].chunk.index,
|
||||||
target->length);
|
target->length);
|
||||||
|
|
||||||
pa_memblock_release(target->memblock);
|
pa_memblock_release(target->memblock);
|
||||||
pa_memblock_release(info[0].chunk.memblock);
|
pa_memblock_release(info[0].chunk.memblock);
|
||||||
|
|
||||||
pa_sw_cvolume_multiply(&volume, &s->thread_info.soft_volume, &info[0].volume);
|
pa_sw_cvolume_multiply(&volume, &s->thread_info.soft_volume, &info[0].volume);
|
||||||
|
|
||||||
if (!pa_cvolume_is_norm(&volume))
|
if (!pa_cvolume_is_norm(&volume))
|
||||||
pa_volume_memchunk(target, &s->sample_spec, &volume);
|
pa_volume_memchunk(target, &s->sample_spec, &volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
ptr = pa_memblock_acquire(target->memblock);
|
ptr = pa_memblock_acquire(target->memblock);
|
||||||
|
|
||||||
target->length = pa_mix(info, n,
|
target->length = pa_mix(info, n,
|
||||||
(uint8_t*) ptr + target->index,
|
(uint8_t*) ptr + target->index,
|
||||||
target->length,
|
target->length,
|
||||||
&s->sample_spec,
|
&s->sample_spec,
|
||||||
&s->thread_info.soft_volume,
|
&s->thread_info.soft_volume,
|
||||||
s->thread_info.soft_muted);
|
s->thread_info.soft_muted);
|
||||||
|
|
||||||
pa_memblock_release(target->memblock);
|
pa_memblock_release(target->memblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
inputs_drop(s, info, n, target->length);
|
inputs_drop(s, info, n, target->length);
|
||||||
|
|
||||||
if (s->monitor_source)
|
if (s->monitor_source)
|
||||||
|
|
@ -512,12 +512,12 @@ void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result) {
|
||||||
|
|
||||||
pa_usec_t pa_sink_get_latency(pa_sink *s) {
|
pa_usec_t pa_sink_get_latency(pa_sink *s) {
|
||||||
pa_usec_t usec = 0;
|
pa_usec_t usec = 0;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
||||||
if (s->get_latency)
|
if (s->get_latency)
|
||||||
return s->get_latency(s);
|
return s->get_latency(s);
|
||||||
|
|
||||||
if (pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, NULL) < 0)
|
if (pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_LATENCY, &usec, NULL) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -532,7 +532,7 @@ void pa_sink_set_volume(pa_sink *s, const pa_cvolume *volume) {
|
||||||
|
|
||||||
changed = !pa_cvolume_equal(volume, &s->volume);
|
changed = !pa_cvolume_equal(volume, &s->volume);
|
||||||
s->volume = *volume;
|
s->volume = *volume;
|
||||||
|
|
||||||
if (s->set_volume && s->set_volume(s) < 0)
|
if (s->set_volume && s->set_volume(s) < 0)
|
||||||
s->set_volume = NULL;
|
s->set_volume = NULL;
|
||||||
|
|
||||||
|
|
@ -549,7 +549,7 @@ const pa_cvolume *pa_sink_get_volume(pa_sink *s) {
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
||||||
old_volume = s->volume;
|
old_volume = s->volume;
|
||||||
|
|
||||||
if (s->get_volume && s->get_volume(s) < 0)
|
if (s->get_volume && s->get_volume(s) < 0)
|
||||||
s->get_volume = NULL;
|
s->get_volume = NULL;
|
||||||
|
|
||||||
|
|
@ -558,13 +558,13 @@ const pa_cvolume *pa_sink_get_volume(pa_sink *s) {
|
||||||
|
|
||||||
if (!pa_cvolume_equal(&old_volume, &s->volume))
|
if (!pa_cvolume_equal(&old_volume, &s->volume))
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
|
|
||||||
return &s->volume;
|
return &s->volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pa_sink_set_mute(pa_sink *s, int mute) {
|
void pa_sink_set_mute(pa_sink *s, int mute) {
|
||||||
int changed;
|
int changed;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
||||||
changed = s->muted != mute;
|
changed = s->muted != mute;
|
||||||
|
|
@ -581,11 +581,11 @@ void pa_sink_set_mute(pa_sink *s, int mute) {
|
||||||
|
|
||||||
int pa_sink_get_mute(pa_sink *s) {
|
int pa_sink_get_mute(pa_sink *s) {
|
||||||
int old_muted;
|
int old_muted;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
||||||
old_muted = s->muted;
|
old_muted = s->muted;
|
||||||
|
|
||||||
if (s->get_mute && s->get_mute(s) < 0)
|
if (s->get_mute && s->get_mute(s) < 0)
|
||||||
s->get_mute = NULL;
|
s->get_mute = NULL;
|
||||||
|
|
||||||
|
|
@ -594,7 +594,7 @@ int pa_sink_get_mute(pa_sink *s) {
|
||||||
|
|
||||||
if (old_muted != s->muted)
|
if (old_muted != s->muted)
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
|
|
||||||
return s->muted;
|
return s->muted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -658,29 +658,29 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchunk *
|
||||||
pa_hashmap_put(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index), pa_sink_input_ref(i));
|
pa_hashmap_put(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index), pa_sink_input_ref(i));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_REMOVE_INPUT: {
|
case PA_SINK_MESSAGE_REMOVE_INPUT: {
|
||||||
pa_sink_input *i = userdata;
|
pa_sink_input *i = userdata;
|
||||||
pa_hashmap_remove(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index));
|
pa_hashmap_remove(s->thread_info.inputs, PA_UINT32_TO_PTR(i->index));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_SET_VOLUME:
|
case PA_SINK_MESSAGE_SET_VOLUME:
|
||||||
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_SET_MUTE:
|
case PA_SINK_MESSAGE_SET_MUTE:
|
||||||
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_GET_VOLUME:
|
case PA_SINK_MESSAGE_GET_VOLUME:
|
||||||
*((pa_cvolume*) userdata) = s->thread_info.soft_volume;
|
*((pa_cvolume*) userdata) = s->thread_info.soft_volume;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SINK_MESSAGE_GET_MUTE:
|
case PA_SINK_MESSAGE_GET_MUTE:
|
||||||
*((int*) userdata) = s->thread_info.soft_muted;
|
*((int*) userdata) = s->thread_info.soft_muted;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ pa_source_output* pa_source_output_new(
|
||||||
if ((flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ||
|
if ((flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ||
|
||||||
!pa_sample_spec_equal(&data->sample_spec, &data->source->sample_spec) ||
|
!pa_sample_spec_equal(&data->sample_spec, &data->source->sample_spec) ||
|
||||||
!pa_channel_map_equal(&data->channel_map, &data->source->channel_map)) {
|
!pa_channel_map_equal(&data->channel_map, &data->source->channel_map)) {
|
||||||
|
|
||||||
if (!(resampler = pa_resampler_new(
|
if (!(resampler = pa_resampler_new(
|
||||||
core->mempool,
|
core->mempool,
|
||||||
&data->source->sample_spec, &data->source->channel_map,
|
&data->source->sample_spec, &data->source->channel_map,
|
||||||
|
|
@ -127,10 +127,10 @@ pa_source_output* pa_source_output_new(
|
||||||
}
|
}
|
||||||
|
|
||||||
o = pa_source_output_new(pa_source_output);
|
o = pa_source_output_new(pa_source_output);
|
||||||
|
|
||||||
o->parent.parent.free = source_output_free;
|
o->parent.parent.free = source_output_free;
|
||||||
o->parent.process_msg = pa_source_output_process_msg;
|
o->parent.process_msg = pa_source_output_process_msg;
|
||||||
|
|
||||||
o->core = core;
|
o->core = core;
|
||||||
pa_atomic_load(&o->state, PA_SOURCE_OUTPUT_RUNNING);
|
pa_atomic_load(&o->state, PA_SOURCE_OUTPUT_RUNNING);
|
||||||
o->flags = flags;
|
o->flags = flags;
|
||||||
|
|
@ -173,7 +173,7 @@ void pa_source_output_disconnect(pa_source_output*o) {
|
||||||
pa_assert(o->source->core);
|
pa_assert(o->source->core);
|
||||||
|
|
||||||
pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, NULL);
|
pa_asyncmsgq_send(i->sink->asyncmsgq, i->sink, PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, NULL);
|
||||||
|
|
||||||
pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL);
|
pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL);
|
||||||
pa_idxset_remove_by_data(o->source->outputs, o, NULL);
|
pa_idxset_remove_by_data(o->source->outputs, o, NULL);
|
||||||
|
|
||||||
|
|
@ -190,7 +190,7 @@ void pa_source_output_disconnect(pa_source_output*o) {
|
||||||
|
|
||||||
static void source_output_free(pa_msgobject* mo) {
|
static void source_output_free(pa_msgobject* mo) {
|
||||||
pa_source_output *o = PA_SOURCE_OUTPUT(mo);
|
pa_source_output *o = PA_SOURCE_OUTPUT(mo);
|
||||||
|
|
||||||
pa_assert(pa_source_output_refcnt(o) == 0);
|
pa_assert(pa_source_output_refcnt(o) == 0);
|
||||||
|
|
||||||
pa_source_output_disconnect(o);
|
pa_source_output_disconnect(o);
|
||||||
|
|
@ -207,7 +207,7 @@ static void source_output_free(pa_msgobject* mo) {
|
||||||
|
|
||||||
void pa_source_output_put(pa_source_output *o) {
|
void pa_source_output_put(pa_source_output *o) {
|
||||||
pa_source_output_assert_ref(o);
|
pa_source_output_assert_ref(o);
|
||||||
|
|
||||||
pa_asyncmsgq_post(o->source->asyncmsgq, o->source, PA_SOURCE_MESSAGE_ADD_OUTPUT, o, NULL, pa_source_unref, pa_source_output_unref);
|
pa_asyncmsgq_post(o->source->asyncmsgq, o->source, PA_SOURCE_MESSAGE_ADD_OUTPUT, o, NULL, pa_source_unref, pa_source_output_unref);
|
||||||
pa_source_update_status(o->source);
|
pa_source_update_status(o->source);
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ pa_usec_t pa_source_output_get_latency(pa_source_output *o) {
|
||||||
|
|
||||||
if (pa_asyncmsgq_send(o->source->asyncmsgq, i->source, PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY, &r, NULL) < 0)
|
if (pa_asyncmsgq_send(o->source->asyncmsgq, i->source, PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY, &r, NULL) < 0)
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
if (o->get_latency)
|
if (o->get_latency)
|
||||||
r += o->get_latency(o);
|
r += o->get_latency(o);
|
||||||
|
|
||||||
|
|
@ -244,12 +244,12 @@ void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) {
|
||||||
pa_assert(chunk->length);
|
pa_assert(chunk->length);
|
||||||
|
|
||||||
state = pa_source_output_get_state(o);
|
state = pa_source_output_get_state(o);
|
||||||
|
|
||||||
if (!o->push || state == PA_SOURCE_OUTPUT_DISCONNECTED || state == PA_SOURCE_OUTPUT_CORKED)
|
if (!o->push || state == PA_SOURCE_OUTPUT_DISCONNECTED || state == PA_SOURCE_OUTPUT_CORKED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pa_assert(state = PA_SOURCE_OUTPUT_RUNNING);
|
pa_assert(state = PA_SOURCE_OUTPUT_RUNNING);
|
||||||
|
|
||||||
if (!o->resampler) {
|
if (!o->resampler) {
|
||||||
o->push(o, chunk);
|
o->push(o, chunk);
|
||||||
return;
|
return;
|
||||||
|
|
@ -289,7 +289,7 @@ int pa_source_output_set_rate(pa_source_output *o, uint32_t rate) {
|
||||||
i->sample_spec.rate = rate;
|
i->sample_spec.rate = rate;
|
||||||
|
|
||||||
pa_asyncmsgq_post(s->asyncmsgq, pa_source_output_ref(i), PA_SOURCE_OUTPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), NULL, pa_source_output_unref, NULL);
|
pa_asyncmsgq_post(s->asyncmsgq, pa_source_output_ref(i), PA_SOURCE_OUTPUT_MESSAGE_SET_RATE, PA_UINT_TO_PTR(rate), NULL, pa_source_output_unref, NULL);
|
||||||
|
|
||||||
pa_subscription_post(o->source->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT!|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
|
pa_subscription_post(o->source->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT!|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -312,7 +312,7 @@ void pa_source_output_set_name(pa_source_output *o, const char *name) {
|
||||||
pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o) {
|
pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o) {
|
||||||
pa_source_output_assert_ref(o);
|
pa_source_output_assert_ref(o);
|
||||||
|
|
||||||
return o->resample_method;
|
return o->resample_method;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {
|
int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {
|
||||||
|
|
@ -323,7 +323,7 @@ int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {
|
||||||
pa_source_assert_ref(dest);
|
pa_source_assert_ref(dest);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* origin = o->source; */
|
/* origin = o->source; */
|
||||||
|
|
||||||
/* if (dest == origin) */
|
/* if (dest == origin) */
|
||||||
|
|
@ -377,13 +377,13 @@ int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {
|
||||||
|
|
||||||
int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, pa_memchunk* chunk) {
|
int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, pa_memchunk* chunk) {
|
||||||
pa_source_output *o = PA_SOURCE_OUTPUT(o);
|
pa_source_output *o = PA_SOURCE_OUTPUT(o);
|
||||||
|
|
||||||
pa_source_output_assert_ref(i);
|
pa_source_output_assert_ref(i);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
case PA_SOURCE_OUTPUT_MESSAGE_SET_RATE: {
|
case PA_SOURCE_OUTPUT_MESSAGE_SET_RATE: {
|
||||||
|
|
||||||
i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
|
i->thread_info.sample_spec.rate = PA_PTR_TO_UINT(userdata);
|
||||||
pa_resampler_set_output_rate(i->resampler, PA_PTR_TO_UINT(userdata));
|
pa_resampler_set_output_rate(i->resampler, PA_PTR_TO_UINT(userdata));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ typedef enum pa_source_output_flags {
|
||||||
|
|
||||||
struct pa_source_output {
|
struct pa_source_output {
|
||||||
pa_msgobject parent;
|
pa_msgobject parent;
|
||||||
|
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
pa_core *core;
|
pa_core *core;
|
||||||
pa_atomic_t state;
|
pa_atomic_t state;
|
||||||
|
|
@ -72,10 +72,10 @@ struct pa_source_output {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
|
|
||||||
pa_resampler* resampler; /* may be NULL */
|
pa_resampler* resampler; /* may be NULL */
|
||||||
} thread_info;
|
} thread_info;
|
||||||
|
|
||||||
void *userdata;
|
void *userdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ pa_source* pa_source_new(
|
||||||
|
|
||||||
s->parent.parent.free = source_free;
|
s->parent.parent.free = source_free;
|
||||||
s->parent.process_msg = pa_source_process_msg;
|
s->parent.process_msg = pa_source_process_msg;
|
||||||
|
|
||||||
s->core = core;
|
s->core = core;
|
||||||
pa_atomic_store(&s->state, PA_SOURCE_IDLE);
|
pa_atomic_store(&s->state, PA_SOURCE_IDLE);
|
||||||
s->name = pa_xstrdup(name);
|
s->name = pa_xstrdup(name);
|
||||||
|
|
@ -108,7 +108,7 @@ pa_source* pa_source_new(
|
||||||
s->userdata = NULL;
|
s->userdata = NULL;
|
||||||
|
|
||||||
pa_assert_se(s->asyncmsgq = pa_asyncmsgq_new(0));
|
pa_assert_se(s->asyncmsgq = pa_asyncmsgq_new(0));
|
||||||
|
|
||||||
r = pa_idxset_put(core->sources, s, &s->index);
|
r = pa_idxset_put(core->sources, s, &s->index);
|
||||||
assert(s->index != PA_IDXSET_INVALID && r >= 0);
|
assert(s->index != PA_IDXSET_INVALID && r >= 0);
|
||||||
|
|
||||||
|
|
@ -118,7 +118,7 @@ pa_source* pa_source_new(
|
||||||
s->thread_info.outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
s->thread_info.outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
||||||
s->thread_info.soft_volume = s->volume;
|
s->thread_info.soft_volume = s->volume;
|
||||||
s->thread_info.soft_muted = s->muted;
|
s->thread_info.soft_muted = s->muted;
|
||||||
|
|
||||||
pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_NEW, s->index);
|
pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_NEW, s->index);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
|
|
@ -142,7 +142,7 @@ static void source_start(pa_source *s) {
|
||||||
static void source_stop(pa_source *s) {
|
static void source_stop(pa_source *s) {
|
||||||
pa_source_state_t state;
|
pa_source_state_t state;
|
||||||
int stop;
|
int stop;
|
||||||
|
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
state = pa_source_get_state(s);
|
state = pa_source_get_state(s);
|
||||||
pa_return_if_fail(state == PA_SOURCE_RUNNING || state == PA_SOURCE_SUSPENDED);
|
pa_return_if_fail(state == PA_SOURCE_RUNNING || state == PA_SOURCE_SUSPENDED);
|
||||||
|
|
@ -165,7 +165,7 @@ void pa_source_disconnect(pa_source *s) {
|
||||||
pa_return_if_fail(pa_sink_get_state(s) != PA_SINK_DISCONNECT);
|
pa_return_if_fail(pa_sink_get_state(s) != PA_SINK_DISCONNECT);
|
||||||
|
|
||||||
source_stop(s);
|
source_stop(s);
|
||||||
|
|
||||||
pa_atomic_store(&s->state, PA_SOURCE_DISCONNECTED);
|
pa_atomic_store(&s->state, PA_SOURCE_DISCONNECTED);
|
||||||
pa_namereg_unregister(s->core, s->name);
|
pa_namereg_unregister(s->core, s->name);
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ void pa_source_disconnect(pa_source *s) {
|
||||||
|
|
||||||
static void source_free(pa_msgobject *o) {
|
static void source_free(pa_msgobject *o) {
|
||||||
pa_source *s = PA_SOURCE(o);
|
pa_source *s = PA_SOURCE(o);
|
||||||
|
|
||||||
pa_assert(s);
|
pa_assert(s);
|
||||||
pa_assert(pa_source_refcnt(s) == 0);
|
pa_assert(pa_source_refcnt(s) == 0);
|
||||||
|
|
||||||
|
|
@ -204,7 +204,7 @@ static void source_free(pa_msgobject *o) {
|
||||||
pa_hashmap_free(s->thread_info.outputs, pa_sink_output_unref, NULL);
|
pa_hashmap_free(s->thread_info.outputs, pa_sink_output_unref, NULL);
|
||||||
|
|
||||||
pa_asyncmsgq_free(s->asyncmsgq);
|
pa_asyncmsgq_free(s->asyncmsgq);
|
||||||
|
|
||||||
pa_xfree(s->name);
|
pa_xfree(s->name);
|
||||||
pa_xfree(s->description);
|
pa_xfree(s->description);
|
||||||
pa_xfree(s->driver);
|
pa_xfree(s->driver);
|
||||||
|
|
@ -216,7 +216,7 @@ void pa_source_update_status(pa_source*s) {
|
||||||
|
|
||||||
if (pa_source_get_state(s) == PA_SOURCE_STATE_SUSPENDED)
|
if (pa_source_get_state(s) == PA_SOURCE_STATE_SUSPENDED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pa_source_used_by(s) > 0)
|
if (pa_source_used_by(s) > 0)
|
||||||
source_start(s);
|
source_start(s);
|
||||||
else
|
else
|
||||||
|
|
@ -240,7 +240,7 @@ void pa_source_suspend(pa_source *s, int suspend) {
|
||||||
s->stop(s);
|
s->stop(s);
|
||||||
else
|
else
|
||||||
pa_asyncmsgq_post(s->asyncmsgq, s, PA_SOURCE_MESSAGE_STOP, NULL, NULL, pa_source_unref, NULL);
|
pa_asyncmsgq_post(s->asyncmsgq, s, PA_SOURCE_MESSAGE_STOP, NULL, NULL, pa_source_unref, NULL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pa_atomic_store(&s->state, PA_SOURCE_RUNNING);
|
pa_atomic_store(&s->state, PA_SOURCE_RUNNING);
|
||||||
|
|
||||||
|
|
@ -254,7 +254,7 @@ void pa_source_suspend(pa_source *s, int suspend) {
|
||||||
void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
|
void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
|
||||||
pa_source_output *o;
|
pa_source_output *o;
|
||||||
void *state = NULL;
|
void *state = NULL;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
pa_assert(chunk);
|
pa_assert(chunk);
|
||||||
|
|
||||||
|
|
@ -263,7 +263,7 @@ void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
|
||||||
|
|
||||||
pa_memblock_ref(vchunk.memblock);
|
pa_memblock_ref(vchunk.memblock);
|
||||||
pa_memchunk_make_writable(&vchunk, 0);
|
pa_memchunk_make_writable(&vchunk, 0);
|
||||||
|
|
||||||
if (s->thread_info.muted || pa_cvolume_is_muted(s->thread_info.volume))
|
if (s->thread_info.muted || pa_cvolume_is_muted(s->thread_info.volume))
|
||||||
pa_silence_memchunk(&vchunk, &s->sample_spec);
|
pa_silence_memchunk(&vchunk, &s->sample_spec);
|
||||||
else
|
else
|
||||||
|
|
@ -271,10 +271,10 @@ void pa_source_post(pa_source*s, const pa_memchunk *chunk) {
|
||||||
|
|
||||||
while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
|
while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
|
||||||
pa_source_output_push(o, &vchunk);
|
pa_source_output_push(o, &vchunk);
|
||||||
|
|
||||||
pa_memblock_unref(vchunk.memblock);
|
pa_memblock_unref(vchunk.memblock);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
|
while ((o = pa_hashmap_iterate(s->thread_info.outputs, &state, NULL)))
|
||||||
pa_source_output_push(o, chunk);
|
pa_source_output_push(o, chunk);
|
||||||
|
|
||||||
|
|
@ -303,7 +303,7 @@ void pa_source_set_volume(pa_source *s, const pa_cvolume *volume) {
|
||||||
|
|
||||||
changed = !pa_cvolume_equal(volume, s->volume);
|
changed = !pa_cvolume_equal(volume, s->volume);
|
||||||
s->volume = *volume;
|
s->volume = *volume;
|
||||||
|
|
||||||
if (s->set_volume && s->set_volume(s) < 0)
|
if (s->set_volume && s->set_volume(s) < 0)
|
||||||
s->set_volume = NULL;
|
s->set_volume = NULL;
|
||||||
|
|
||||||
|
|
@ -318,7 +318,7 @@ const pa_cvolume *pa_source_get_volume(pa_source *s) {
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
||||||
old_volume = s->volume;
|
old_volume = s->volume;
|
||||||
|
|
||||||
if (s->get_volume && s->get_volume(s) < 0)
|
if (s->get_volume && s->get_volume(s) < 0)
|
||||||
s->get_volume = NULL;
|
s->get_volume = NULL;
|
||||||
|
|
||||||
|
|
@ -327,13 +327,13 @@ const pa_cvolume *pa_source_get_volume(pa_source *s) {
|
||||||
|
|
||||||
if (!pa_cvolume_equal(&old_volume, &s->volume))
|
if (!pa_cvolume_equal(&old_volume, &s->volume))
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
|
|
||||||
return &s->volume;
|
return &s->volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pa_source_set_mute(pa_source *s, pa_mixer_t m, int mute) {
|
void pa_source_set_mute(pa_source *s, pa_mixer_t m, int mute) {
|
||||||
int changed;
|
int changed;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
||||||
changed = s->muted != mute;
|
changed = s->muted != mute;
|
||||||
|
|
@ -350,11 +350,11 @@ void pa_source_set_mute(pa_source *s, pa_mixer_t m, int mute) {
|
||||||
|
|
||||||
int pa_source_get_mute(pa_source *s, pa_mixer_t m) {
|
int pa_source_get_mute(pa_source *s, pa_mixer_t m) {
|
||||||
int old_muted;
|
int old_muted;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
||||||
old_muted = s->muted;
|
old_muted = s->muted;
|
||||||
|
|
||||||
if (s->get_mute && s->get_mute(s) < 0)
|
if (s->get_mute && s->get_mute(s) < 0)
|
||||||
s->get_mute = NULL;
|
s->get_mute = NULL;
|
||||||
|
|
||||||
|
|
@ -363,7 +363,7 @@ int pa_source_get_mute(pa_source *s, pa_mixer_t m) {
|
||||||
|
|
||||||
if (old_muted != s->muted)
|
if (old_muted != s->muted)
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
|
|
||||||
return s->muted;
|
return s->muted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -374,7 +374,7 @@ void pa_source_set_module(pa_source *s, pa_module *m) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
s->module = m;
|
s->module = m;
|
||||||
|
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -409,29 +409,29 @@ int pa_source_process_msg(pa_msgobject *o, void *object, int code, pa_memchunk *
|
||||||
pa_hashmap_put(s->thread_info.outputs, PA_UINT32_TO_PTR(i->index), pa_source_output_ref(i));
|
pa_hashmap_put(s->thread_info.outputs, PA_UINT32_TO_PTR(i->index), pa_source_output_ref(i));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SOURCE_MESSAGE_REMOVE_INPUT: {
|
case PA_SOURCE_MESSAGE_REMOVE_INPUT: {
|
||||||
pa_source_input *i = userdata;
|
pa_source_input *i = userdata;
|
||||||
pa_hashmap_remove(s->thread_info.outputs, PA_UINT32_TO_PTR(i->index), pa_source_output_ref(i));
|
pa_hashmap_remove(s->thread_info.outputs, PA_UINT32_TO_PTR(i->index), pa_source_output_ref(i));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PA_SOURCE_MESSAGE_SET_VOLUME:
|
case PA_SOURCE_MESSAGE_SET_VOLUME:
|
||||||
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
s->thread_info.soft_volume = *((pa_cvolume*) userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SOURCE_MESSAGE_SET_MUTE:
|
case PA_SOURCE_MESSAGE_SET_MUTE:
|
||||||
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
s->thread_info.soft_muted = PA_PTR_TO_UINT(userdata);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SOURCE_MESSAGE_GET_VOLUME:
|
case PA_SOURCE_MESSAGE_GET_VOLUME:
|
||||||
*((pa_cvolume*) userdata) = s->thread_info.soft_volume;
|
*((pa_cvolume*) userdata) = s->thread_info.soft_volume;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PA_SOURCE_MESSAGE_GET_MUTE:
|
case PA_SOURCE_MESSAGE_GET_MUTE:
|
||||||
*((int*) userdata) = s->thread_info.soft_muted;
|
*((int*) userdata) = s->thread_info.soft_muted;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ typedef enum pa_source_state {
|
||||||
|
|
||||||
struct pa_source {
|
struct pa_source {
|
||||||
pa_msgobject parent;
|
pa_msgobject parent;
|
||||||
|
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
pa_core *core;
|
pa_core *core;
|
||||||
pa_atomic_t state;
|
pa_atomic_t state;
|
||||||
|
|
@ -91,7 +91,7 @@ struct pa_source {
|
||||||
pa_cvolume soft_volume;
|
pa_cvolume soft_volume;
|
||||||
int soft_muted;
|
int soft_muted;
|
||||||
} thread_info;
|
} thread_info;
|
||||||
|
|
||||||
void *userdata;
|
void *userdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,11 +48,11 @@ static void the_thread(void *_q) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
pa_assert_se(pa_asyncmsgq_get(q, NULL, &code, NULL, 1) == 0);
|
pa_assert_se(pa_asyncmsgq_get(q, NULL, &code, NULL, 1) == 0);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
case OPERATION_A:
|
case OPERATION_A:
|
||||||
printf("Operation A\n");
|
printf("Operation A\n");
|
||||||
break;
|
break;
|
||||||
|
|
@ -64,7 +64,7 @@ static void the_thread(void *_q) {
|
||||||
case OPERATION_C:
|
case OPERATION_C:
|
||||||
printf("Operation C\n");
|
printf("Operation C\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QUIT:
|
case QUIT:
|
||||||
printf("quit\n");
|
printf("quit\n");
|
||||||
quit = 1;
|
quit = 1;
|
||||||
|
|
@ -79,7 +79,7 @@ static void the_thread(void *_q) {
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
pa_asyncmsgq *q;
|
pa_asyncmsgq *q;
|
||||||
pa_thread *t;
|
pa_thread *t;
|
||||||
|
|
||||||
pa_assert_se(q = pa_asyncmsgq_new(0));
|
pa_assert_se(q = pa_asyncmsgq_new(0));
|
||||||
|
|
||||||
pa_assert_se(t = pa_thread_new(the_thread, q));
|
pa_assert_se(t = pa_thread_new(the_thread, q));
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
static void producer(void *_q) {
|
static void producer(void *_q) {
|
||||||
pa_asyncq *q = _q;
|
pa_asyncq *q = _q;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++) {
|
for (i = 0; i < 1000; i++) {
|
||||||
pa_asyncq_push(q, (void*) (i+1), 1);
|
pa_asyncq_push(q, (void*) (i+1), 1);
|
||||||
printf("pushed %i\n", i);
|
printf("pushed %i\n", i);
|
||||||
|
|
@ -54,7 +54,7 @@ static void consumer(void *_q) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
for (i = 0;; i++) {
|
for (i = 0;; i++) {
|
||||||
p = pa_asyncq_pop(q, 1);
|
p = pa_asyncq_pop(q, 1);
|
||||||
|
|
||||||
|
|
@ -62,7 +62,7 @@ static void consumer(void *_q) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
pa_assert(p == (void *) (i+1));
|
pa_assert(p == (void *) (i+1));
|
||||||
|
|
||||||
printf("popped %i\n", i);
|
printf("popped %i\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,7 +72,7 @@ static void consumer(void *_q) {
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
pa_asyncq *q;
|
pa_asyncq *q;
|
||||||
pa_thread *t1, *t2;
|
pa_thread *t1, *t2;
|
||||||
|
|
||||||
pa_assert_se(q = pa_asyncq_new(0));
|
pa_assert_se(q = pa_asyncq_new(0));
|
||||||
|
|
||||||
pa_assert_se(t1 = pa_thread_new(producer, q));
|
pa_assert_se(t1 = pa_thread_new(producer, q));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue