mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-06 13:29:56 -05:00
add callbacks for the revoke/release stuff, so that we can make this thing thread-safe
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1626 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
4e145b676a
commit
ff4814cac7
2 changed files with 61 additions and 8 deletions
|
|
@ -155,6 +155,12 @@ struct pa_pstream {
|
|||
pa_pstream_notify_cb_t die_callback;
|
||||
void *die_callback_userdata;
|
||||
|
||||
pa_pstream_block_id_cb_t revoke_callback;
|
||||
void *revoke_callback_userdata;
|
||||
|
||||
pa_pstream_block_id_cb_t release_callback;
|
||||
void *release_callback_userdata;
|
||||
|
||||
pa_mempool *mempool;
|
||||
|
||||
#ifdef HAVE_CREDS
|
||||
|
|
@ -254,7 +260,11 @@ pa_pstream *pa_pstream_new(pa_mainloop_api *m, pa_iochannel *io, pa_mempool *poo
|
|||
p->drain_callback_userdata = NULL;
|
||||
p->die_callback = NULL;
|
||||
p->die_callback_userdata = NULL;
|
||||
|
||||
p->revoke_callback = NULL;
|
||||
p->revoke_callback_userdata = NULL;
|
||||
p->release_callback = NULL;
|
||||
p->release_callback_userdata = NULL;
|
||||
|
||||
p->mempool = pool;
|
||||
|
||||
p->use_shm = 0;
|
||||
|
|
@ -376,11 +386,8 @@ void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa
|
|||
p->mainloop->defer_enable(p->defer_event, 1);
|
||||
}
|
||||
|
||||
/* might be called from thread context */
|
||||
static void memimport_release_cb(pa_memimport *i, uint32_t block_id, void *userdata) {
|
||||
void pa_pstream_send_release(pa_pstream *p, uint32_t block_id) {
|
||||
struct item_info *item;
|
||||
pa_pstream *p = userdata;
|
||||
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
|
|
@ -401,13 +408,26 @@ static void memimport_release_cb(pa_memimport *i, uint32_t block_id, void *userd
|
|||
}
|
||||
|
||||
/* might be called from thread context */
|
||||
static void memexport_revoke_cb(pa_memexport *e, uint32_t block_id, void *userdata) {
|
||||
struct item_info *item;
|
||||
static void memimport_release_cb(pa_memimport *i, uint32_t block_id, void *userdata) {
|
||||
pa_pstream *p = userdata;
|
||||
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
if (p->dead)
|
||||
return;
|
||||
|
||||
if (p->release_callback)
|
||||
p->release_callback(p, block_id, p->release_callback_userdata);
|
||||
else
|
||||
pa_pstream_send_release(p, block_id);
|
||||
}
|
||||
|
||||
void pa_pstream_send_revoke(pa_pstream *p, uint32_t block_id) {
|
||||
struct item_info *item;
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
if (p->dead)
|
||||
return;
|
||||
/* pa_log("Revoking block %u", block_id); */
|
||||
|
|
@ -423,6 +443,19 @@ static void memexport_revoke_cb(pa_memexport *e, uint32_t block_id, void *userda
|
|||
p->mainloop->defer_enable(p->defer_event, 1);
|
||||
}
|
||||
|
||||
/* might be called from thread context */
|
||||
static void memexport_revoke_cb(pa_memexport *e, uint32_t block_id, void *userdata) {
|
||||
pa_pstream *p = userdata;
|
||||
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
if (p->revoke_callback)
|
||||
p->revoke_callback(p, block_id, p->revoke_callback_userdata);
|
||||
else
|
||||
pa_pstream_send_revoke(p, block_id);
|
||||
}
|
||||
|
||||
static void prepare_next_write_item(pa_pstream *p) {
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
|
@ -875,6 +908,22 @@ void pa_pstream_set_recieve_memblock_callback(pa_pstream *p, pa_pstream_memblock
|
|||
p->recieve_memblock_callback_userdata = userdata;
|
||||
}
|
||||
|
||||
void pa_pstream_set_release_callback(pa_pstream *p, pa_pstream_block_id_cb_t cb, void *userdata) {
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
p->release_callback = cb;
|
||||
p->release_callback_userdata = userdata;
|
||||
}
|
||||
|
||||
void pa_pstream_set_revoke_callback(pa_pstream *p, pa_pstream_block_id_cb_t cb, void *userdata) {
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
|
||||
p->release_callback = cb;
|
||||
p->release_callback_userdata = userdata;
|
||||
}
|
||||
|
||||
int pa_pstream_is_pending(pa_pstream *p) {
|
||||
int b;
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ typedef struct pa_pstream pa_pstream;
|
|||
typedef void (*pa_pstream_packet_cb_t)(pa_pstream *p, pa_packet *packet, const pa_creds *creds, void *userdata);
|
||||
typedef void (*pa_pstream_memblock_cb_t)(pa_pstream *p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk, void *userdata);
|
||||
typedef void (*pa_pstream_notify_cb_t)(pa_pstream *p, void *userdata);
|
||||
typedef void (*pa_pstream_block_id_cb_t)(pa_pstream *p, uint32_t block_id, void *userdata);
|
||||
|
||||
pa_pstream* pa_pstream_new(pa_mainloop_api *m, pa_iochannel *io, pa_mempool *p);
|
||||
void pa_pstream_unref(pa_pstream*p);
|
||||
|
|
@ -48,12 +49,15 @@ pa_pstream* pa_pstream_ref(pa_pstream*p);
|
|||
|
||||
void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, const pa_creds *creds);
|
||||
void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk);
|
||||
void pa_pstream_send_release(pa_pstream *p, uint32_t block_id);
|
||||
void pa_pstream_send_revoke(pa_pstream *p, uint32_t block_id);
|
||||
|
||||
void pa_pstream_set_recieve_packet_callback(pa_pstream *p, pa_pstream_packet_cb_t cb, void *userdata);
|
||||
void pa_pstream_set_recieve_memblock_callback(pa_pstream *p, pa_pstream_memblock_cb_t cb, void *userdata);
|
||||
void pa_pstream_set_drain_callback(pa_pstream *p, pa_pstream_notify_cb_t cb, void *userdata);
|
||||
|
||||
void pa_pstream_set_die_callback(pa_pstream *p, pa_pstream_notify_cb_t cb, void *userdata);
|
||||
void pa_pstream_set_release_callback(pa_pstream *p, pa_pstream_block_id_cb_t cb, void *userdata);
|
||||
void pa_pstream_set_revoke_callback(pa_pstream *p, pa_pstream_block_id_cb_t cb, void *userdata);
|
||||
|
||||
int pa_pstream_is_pending(pa_pstream *p);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue