diff options
| author | Lennart Poettering <lennart@poettering.net> | 2007-08-10 23:41:50 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2007-08-10 23:41:50 +0000 | 
| commit | ff4814cac79bc947d6430d79c1ae09d21247305c (patch) | |
| tree | 54beb6b08215f08afcf1108bd8f89fe3c9a983cb /src | |
| parent | 4e145b676ab76235468953634ba6d17717a3d933 (diff) | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/pstream.c | 63 | ||||
| -rw-r--r-- | src/pulsecore/pstream.h | 6 | 
2 files changed, 61 insertions, 8 deletions
diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c index ed552705..b91813e4 100644 --- a/src/pulsecore/pstream.c +++ b/src/pulsecore/pstream.c @@ -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,8 +408,7 @@ 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); @@ -410,6 +416,20 @@ static void memexport_revoke_cb(pa_memexport *e, uint32_t block_id, void *userda      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); */      item = pa_xnew(struct item_info, 1); @@ -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; diff --git a/src/pulsecore/pstream.h b/src/pulsecore/pstream.h index 544cba4d..72babea9 100644 --- a/src/pulsecore/pstream.h +++ b/src/pulsecore/pstream.h @@ -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);  | 
