Merge branch 'refs/heads/t/gui-improvements'
[paraslash.git] / ao_write.c
index af68824..82d98f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2011 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -40,19 +40,15 @@ static void aow_close(struct writer_node *wn)
 
        if (!pawd)
                return;
-       if (pawd->thread_btrn) {
-               pthread_cancel(pawd->thread);
-               pthread_join(pawd->thread, NULL);
-       }
+       assert(!pawd->thread_btrn);
        ao_close(pawd->dev);
        free(pawd);
        wn->private_data = NULL;
-       ao_shutdown();
 }
 
-static void aow_pre_select(struct sched *s, struct task *t)
+static void aow_pre_select(struct sched *s, void *context)
 {
-       struct writer_node *wn = container_of(t, struct writer_node, task);
+       struct writer_node *wn = context;
        struct private_aow_data *pawd = wn->private_data;
        int ret;
 
@@ -161,7 +157,6 @@ static int aow_init(struct writer_node *wn, unsigned sample_rate,
        struct private_aow_data *pawd = para_malloc(sizeof(*pawd));
        struct ao_write_args_info *conf = wn->conf;
 
-       ao_initialize();
        if (conf->driver_given) {
                ret = -E_AO_BAD_DRIVER;
                id = ao_driver_id(conf->driver_arg);
@@ -313,10 +308,9 @@ fail:
        return -E_AO_PTHREAD;
 }
 
-static int aow_post_select(__a_unused struct sched *s,
-               struct task *t)
+static int aow_post_select(__a_unused struct sched *s, void *context)
 {
-       struct writer_node *wn = container_of(t, struct writer_node, task);
+       struct writer_node *wn = context;
        struct private_aow_data *pawd = wn->private_data;
        int ret;
 
@@ -352,8 +346,10 @@ static int aow_post_select(__a_unused struct sched *s,
                return 0;
        }
        if (!wn->btrn) {
-               if (!pawd->thread_btrn)
+               if (!pawd->thread_btrn) {
+                       pthread_join(pawd->thread, NULL);
                        return -E_AO_EOF;
+               }
                PARA_INFO_LOG("waiting for play thread to terminate\n");
                return 0;
        }
@@ -456,6 +452,5 @@ void ao_write_init(struct writer *w)
        dh[num_lines] = NULL;
        w->help.detailed_help = (const char **)dh;
        ao_write_cmdline_parser_free(&dummy);
-       ao_shutdown();
 }