sem_t *semaphore;
osx_buffer *from; /* Current buffers */
osx_buffer *to;
+ unsigned samplerate;
};
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;
}
AudioStreamBasicDescription format;
char s[10];
int m, ret;
+ struct writer_node_group *wng = wn->wng;
+ struct osx_write_args_info *conf = wn->conf;
wn->private_data = powd;
/* where did that default audio output go? */
* AND you want the DefaultOutputUnit to do any format conversions
* necessary from your format to the device's format.
*/
- format.mSampleRate = 44100.0; /* The sample rate of the audio stream */
+ if (!conf->samplerate_given && wng->samplerate)
+ powd->samplerate = *wng->samplerate;
+ else
+ powd->samplerate = conf->samplerate_arg;
+ format.mSampleRate = powd->samplerate;
/* The specific encoding type of audio stream*/
format.mFormatID = kAudioFormatLinearPCM;
/* flags specific to each format */
kAudioUnitScope_Input, 0, &inputCallback,
sizeof(inputCallback)) < 0)
goto e3;
- return 0;
+ return 1;
e3:
destroy_buffers(powd);
e2:
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;
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;