diff options
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; |