]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/afh_receiver'
authorAndre Noll <maan@systemlinux.org>
Sun, 2 Dec 2012 21:23:43 +0000 (22:23 +0100)
committerAndre Noll <maan@systemlinux.org>
Sun, 2 Dec 2012 21:28:53 +0000 (22:28 +0100)
57d75e play: Fix segfault if decoder is not supported.
98f192 Interactive support depends on curses lib.
3e3d8e para_play, implementation.
d02f88 para_play, infrastructure.
3b2ee2 Make writer nodes honor notifications.
e541d7 interactive: Introduce i9e_print_status_bar().
901f66 interactive: Implement single key mode.
6cb789 interactive: Add producer to struct i9e_client_info.
c31982 Interactive: Introduce i9e_get_error().
be1074 interactive: Fix wipe_bottom_line() on MacOS.
3ba772 interactive: Honor SIGWINCH.
56561c interactive: Honor SIGTERM.
06f33c para_afh: remove streaming mode.
4a30c5 The afh receiver, documentation.
b84e37 The afh receiver, implementation.
618a25 The afh_receiver, infrastructure.
4fa8cb Add execute mechanism to receiver nodes.
7c8931 Introduce afh_get_afhi_txt().
3f1510 audiod: Replace kill_btrn() by task notifications.
5edb8f sched: Replace sched_shutdown() by task_notify_all().
58ce61 sched: Introduce task notifications.
b56199 i9e_attach_to_stdout(): Don't insist on btrn == NULL.
7867cd Interactive: Assorted whitespace/newline fixes.
b654be interactive: kill i9ep->line_handler_running.
77b607 interactive: Do not close stderr in i9e_close().
099ef4 Add missing documentation of send_strerror().

Conflicts:
osx_write.c

1  2 
NEWS
osx_write.c

diff --combined NEWS
index 69372cc42c4ea40712fe6f5a337840875ddff04b,2c05b8f90be044f7070ef5a2a08a589e4d46b58d..62e3b7d1b08bdef9ac0a3719cf719e803c27b91f
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,14 -1,13 +1,18 @@@
-----------------------------------------------
--0.?.? (to be announced) "volatile relativity"
-----------------------------------------------
++----------------------------------------------
++0.4.12 (to be announced) "volatile relativity"
++----------------------------------------------
++The new command line player, ALSA support for para_fade, and the
++improved build system are the highlights of this release, which
++probably marks the end of the 0.4.x series.
  
++      - The afh receiver and the para_play executable
        - The "versions" directory has been removed from the master
          branch. The tarballs of the old releases are now available
          in the new "releases" branch.
        - Overhaul of the build system: All generated files are now
          written to the "build" directory.
        - The modular mixer API and the alsa mixer.
 +      - Minor fixes for the osx writer.
  
  --------------------------------------
  0.4.11 (2012-07-20) "mutual diversity"
diff --combined osx_write.c
index 2894f11eb6672dd5f06fa1f3166f6a77afad7ae0,f8476bfde425cb7f41c16c33e13f70d7d6d1c398..b057b9c057991864b582ad8519cbac1b9083a90d
@@@ -43,28 -43,9 +43,28 @@@ struct private_osx_write_data 
        unsigned sample_format;
        /** Number of channels of the current audio stream. */
        unsigned channels;
 -      /** Serializes access to buffer tree nodes. */
 +      /**
 +       * Serializes access to buffer tree nodes between the writer and
 +       * the callback which runs in a different thread.
 +       */
        int mutex;
 -      /** The btr node of the callback. */
 +      /**
 +       * The btr node of the callback.
 +       *
 +       * Although access to the btr node is serialized between the writer and
 +       * the callback via the above mutex, this does not stop other buffer
 +       * tree nodes, for example the decoder, to race against the osx
 +       * callback.
 +       *
 +       * However, since all operations on buffer tree nodes are local in the
 +       * sense that they only affect one level in the buffer tree (i.e.
 +       * parent or child nodes, but not the grandparent or the
 +       * grandchildren), we may work around this problem by using another
 +       * buffer tree node for the callback.
 +       *
 +       * The writer grabs the mutex in its post_select method and pushes down
 +       * the buffers to the callback node.
 +       */
        struct btr_node *callback_btrn;
  };
  
@@@ -78,14 -59,10 +78,14 @@@ static OSStatus osx_callback(void *cb_a
  {
        int i;
        struct writer_node *wn = cb_arg;
 -      struct private_osx_write_data *powd = wn->private_data;
 +      struct private_osx_write_data *powd;
        size_t samples_have, samples_want = 0;
  
 +      powd = wn->private_data;
        mutex_lock(powd->mutex);
 +      powd = wn->private_data;
 +      if (!powd || !wn->btrn)
 +              goto out;
        /*
         * We fill with zeros if no data was yet written and we do not have
         * enough to fill all buffers.
@@@ -289,7 -266,7 +289,7 @@@ static void osx_write_pre_select(struc
        }
  
        mutex_lock(powd->mutex);
 -      ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF);
 +      ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_INTERNAL);
        if (ret < 0)
                drain_delay_nec = need_drain_delay(powd);
        mutex_unlock(powd->mutex);
@@@ -308,40 -285,37 +308,44 @@@ static void osx_write_post_select(__a_u
        struct btr_node *btrn = wn->btrn;
        int ret;
  
+       ret = task_get_notification(t);
+       if (ret < 0)
+               goto fail;
        if (!powd) {
                ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
                if (ret == 0)
                        return;
                if (ret < 0)
-                       goto remove_btrn;
+                       goto fail;
                ret = core_audio_init(wn);
                if (ret < 0)
-                       goto remove_btrn;
+                       goto fail;
                powd = wn->private_data;
 -              AudioOutputUnitStart(powd->audio_unit);
 +              ret = -E_UNIT_START;
 +              if (AudioOutputUnitStart(powd->audio_unit) != noErr) {
 +                      AudioUnitUninitialize(powd->audio_unit);
 +                      CloseComponent(powd->audio_unit);
 +                      btr_remove_node(&powd->callback_btrn);
 +                      goto remove_btrn;
 +              }
        }
        mutex_lock(powd->mutex);
 -      btr_pushdown(btrn);
 -      ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
 +      ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_INTERNAL);
 +      if (ret > 0)
 +              btr_pushdown(btrn);
        if (ret < 0 && need_drain_delay(powd))
                ret = 0;
-       if (ret >= 0) {
-               mutex_unlock(powd->mutex);
+       mutex_unlock(powd->mutex);
+       if (ret >= 0)
                return;
+ fail:
+       assert(ret < 0);
+       if (powd && powd->callback_btrn) {
+               AudioOutputUnitStop(powd->audio_unit);
+               AudioUnitUninitialize(powd->audio_unit);
+               CloseComponent(powd->audio_unit);
+               btr_remove_node(&powd->callback_btrn);
        }
-       AudioOutputUnitStop(powd->audio_unit);
-       AudioUnitUninitialize(powd->audio_unit);
-       CloseComponent(powd->audio_unit);
-       btr_remove_node(&powd->callback_btrn);
-       mutex_unlock(powd->mutex);
- remove_btrn:
        btr_remove_node(&wn->btrn);
        PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
        t->error = ret;