]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - osx_writer.c
simplify osx_write_post_select()
[paraslash.git] / osx_writer.c
index df4194122f50818270c904da533fc4a113d81c93..9ea7ad454aafce0588a00a33f4122914e65f45ee 100644 (file)
@@ -113,9 +113,14 @@ static void fill_buffer(osx_buffer *b, short *source, long size)
                b->size = size;
        }
        dest = b->buffer;
-       while (size--)
+       while (size--) {
+               char *tmp = (char *)source;
+               char c = *tmp;
+               *tmp = *(tmp + 1);
+               *(tmp + 1) = c;
                /* *dest++ = ((*source++) + 32768) / 65536.0; */
                *dest++ = (*source++) / 32768.0;
+       }
        b->ptr = b->buffer;
        b->remaining = b->size;
 }
@@ -240,7 +245,7 @@ static int osx_writer_open(struct writer_node *wn)
                        kAudioUnitScope_Input, 0, &inputCallback,
                        sizeof(inputCallback)) < 0)
                goto e3;
-       return 0;
+       return 1;
 e3:
        destroy_buffers(powd);
 e2:
@@ -279,20 +284,30 @@ static void osx_writer_close(struct writer_node *wn)
        free(powd);
 }
 
+static int need_new_buffer(struct writer_node *wn)
+{
+       struct writer_node_group *wng = wn->wng;
+       struct private_osx_writer_data *powd = wn->private_data;
+
+       if (*wng->loaded < sizeof(short))
+               return 0;
+       if (powd->to->remaining) /* Non empty buffer, must still be playing */
+               return 0;
+       return 1;
+}
+
 static int osx_write_post_select(__a_unused struct sched *s,
                struct writer_node *wn)
 {
        struct private_osx_writer_data *powd = wn->private_data;
        struct writer_node_group *wng = wn->wng;
-       short *data = (short*)wng->buf + wn->written;
+       short *data = (short*)wng->buf;
 
-       if (*wng->loaded <= wn->written)
-               return 1;
-       if (powd->to->remaining) /* Non empty buffer, must still be playing */
+       if (!need_new_buffer(wn))
                return 1;
-       fill_buffer(powd->to, data, (*wng->loaded - wn->written) / sizeof(short));
+       fill_buffer(powd->to, data, *wng->loaded / sizeof(short));
        powd->to = powd->to->next;
-       wn->written += (*wng->loaded - wn->written);
+       wn->written = *wng->loaded;
        if (!powd->play) {
                if (AudioOutputUnitStart(powd->output))
                        return -1;
@@ -301,15 +316,8 @@ static int osx_write_post_select(__a_unused struct sched *s,
        return 1;
 }
 
-static int osx_write_pre_select(struct sched *s, struct writer_node *wn)
+static int osx_write_pre_select(struct sched *s, __a_unused struct writer_node *wn)
 {
-       struct writer_node_group *wng = wn->wng;
-       struct private_osx_writer_data *powd = wn->private_data;
-
-//     if (!*wng->loaded)
-//             return 1;
-//     if (powd->to->remaining) /* Non empty buffer, must still be playing */
-//             return 1;
        s->timeout.tv_sec = 0;
        s->timeout.tv_usec = 20;
        return 1;