diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-05-17 23:42:28 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-05-17 23:42:28 +0000 |
commit | 30562d7cba51a9879489ce88840c5f67ff873026 (patch) | |
tree | d9184295ec5310bab0e81c1caae463fec9e136b2 /common.c | |
parent | bef6322859a5dc01e35d884de7afd2eabb1d9e4d (diff) |
basic threading model
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@27 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'common.c')
-rw-r--r-- | common.c | 25 |
1 files changed, 23 insertions, 2 deletions
@@ -323,15 +323,36 @@ int sa_stream_set_driver(sa_stream_t *s, const char *driver) { return SA_SUCCESS; } -int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t *callback) { +int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t callback) { int r; sa_return_val_if_fail(s, SA_ERROR_INVALID); sa_return_val_if_fail(callback, SA_ERROR_INVALID); sa_mutex_lock(s->mutex); - sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_INIT, SA_ERROR_STATE); + sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE); + sa_return_val_if_fail_mutex(s->mutex, !s->callback, SA_ERROR_STATE); r = driver_start_thread(s, callback); + + if (r == SA_SUCCESS) + s->callback = callback; + + sa_mutex_unlock(s->mutex); + return r; +} + +int sa_stream_stop_thread(sa_stream_t *s) { + int r; + + sa_return_val_if_fail(s, SA_ERROR_INVALID); + sa_mutex_lock(s->mutex); + sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE); + sa_return_val_if_fail_mutex(s->mutex, s->callback, SA_ERROR_STATE); + + r = driver_stop_thread(s); + + if (r == SA_SUCCESS) + s->callback = NULL; sa_mutex_unlock(s->mutex); return r; |