summaryrefslogtreecommitdiffstats
path: root/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'common.c')
-rw-r--r--common.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/common.c b/common.c
index a08316c..2470cca 100644
--- a/common.c
+++ b/common.c
@@ -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;