diff --git a/src/map-file b/src/map-file index a20314c24..91d61c23d 100644 --- a/src/map-file +++ b/src/map-file @@ -220,6 +220,7 @@ pa_msleep; pa_operation_cancel; pa_operation_get_state; pa_operation_ref; +pa_operation_set_state_callback; pa_operation_unref; pa_parse_sample_format; pa_path_get_filename; diff --git a/src/pulse/internal.h b/src/pulse/internal.h index c5bdcb1ef..833653df0 100644 --- a/src/pulse/internal.h +++ b/src/pulse/internal.h @@ -234,6 +234,8 @@ struct pa_operation { pa_operation_state_t state; void *userdata; pa_operation_cb_t callback; + void *state_userdata; + pa_operation_notify_cb_t state_callback; void *private; /* some operations might need this */ }; diff --git a/src/pulse/operation.c b/src/pulse/operation.c index fe160a3c7..8fdbea71d 100644 --- a/src/pulse/operation.c +++ b/src/pulse/operation.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "internal.h" #include "operation.h" @@ -91,6 +92,8 @@ static void operation_unlink(pa_operation *o) { o->stream = NULL; o->callback = NULL; o->userdata = NULL; + o->state_callback = NULL; + o->state_userdata = NULL; } static void operation_set_state(pa_operation *o, pa_operation_state_t st) { @@ -104,6 +107,9 @@ static void operation_set_state(pa_operation *o, pa_operation_state_t st) { o->state = st; + if (o->state_callback) + o->state_callback(o, o->state_userdata); + if ((o->state == PA_OPERATION_DONE) || (o->state == PA_OPERATION_CANCELED)) operation_unlink(o); @@ -130,3 +136,17 @@ pa_operation_state_t pa_operation_get_state(pa_operation *o) { return o->state; } + +void pa_operation_set_state_callback(pa_operation *o, pa_operation_notify_cb_t cb, void *userdata) { + pa_assert(o); + pa_assert(PA_REFCNT_VALUE(o) >= 1); + + if (pa_detect_fork()) + return; + + if (o->state == PA_OPERATION_DONE || o->state == PA_OPERATION_CANCELED) + return; + + o->state_callback = cb; + o->state_userdata = userdata; +} diff --git a/src/pulse/operation.h b/src/pulse/operation.h index b6b5691d2..4d5aa2be9 100644 --- a/src/pulse/operation.h +++ b/src/pulse/operation.h @@ -34,6 +34,9 @@ PA_C_DECL_BEGIN /** An asynchronous operation object */ typedef struct pa_operation pa_operation; +/** A callback for operation state changes */ +typedef void (*pa_operation_notify_cb_t) (pa_operation *o, void *userdata); + /** Increase the reference count by one */ pa_operation *pa_operation_ref(pa_operation *o); @@ -50,6 +53,10 @@ void pa_operation_cancel(pa_operation *o); /** Return the current status of the operation */ pa_operation_state_t pa_operation_get_state(pa_operation *o); +/** Set the callback function that is called when the operation + * is canceled due to disconnection. \since 4.0 */ +void pa_operation_set_state_callback(pa_operation *o, pa_operation_notify_cb_t cb, void *userdata); + PA_C_DECL_END #endif