static OSStatus InputProc(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { UNUSED(ioData); struct state_ca_capture * s = (struct state_ca_capture *) inRefCon; OSStatus err =noErr; err= AudioUnitRender(s->auHALComponentInstance, ioActionFlags, inTimeStamp, inBusNumber, //will be '1' for input data inNumberFrames, //# of frames requested s->theBufferList); if(err == noErr) { int i; int len = inNumberFrames * s->audio_packet_size; for(i = 0; i < s->frame.ch_count; ++i) mux_channel(s->tmp, s->theBufferList->mBuffers[i].mData, s->frame.bps, len, s->frame.ch_count, i, 1.0); uint32_t write_bytes = len * s->frame.ch_count; #ifdef HAVE_SPEEX if(s->nominal_sample_rate != s->frame.sample_rate) { int err; uint32_t in_frames = inNumberFrames; err = speex_resampler_process_interleaved_int(s->resampler, (spx_int16_t *) s->tmp, &in_frames, (spx_int16_t *) s->resampled, &write_bytes); //speex_resampler_process_int(resampler, channelID, in, &in_length, out, &out_length); write_bytes *= s->frame.bps * s->frame.ch_count; if(err) { fprintf(stderr, "Resampling data error.\n"); return err; } } #endif pthread_mutex_lock(&s->lock); #ifdef HAVE_SPEEX if(s->nominal_sample_rate != s->frame.sample_rate) ring_buffer_write(s->buffer, s->resampled, write_bytes); else #endif ring_buffer_write(s->buffer, s->tmp, write_bytes); s->data_ready = TRUE; if(s->boss_waiting) pthread_cond_signal(&s->cv); pthread_mutex_unlock(&s->lock); } else { fprintf(stderr, "[CoreAudio] writing buffer caused error %i.\n", (int) err); } return err; }
static int jack_process_callback(jack_nframes_t nframes, void *arg) { struct state_jack_capture *s = (struct state_jack_capture *) arg; int i; int channel_size = nframes * sizeof(int32_t); for (i = 0; i < s->frame.ch_count; ++i) { jack_default_audio_sample_t *in = jack_port_get_buffer(s->input_ports[i], nframes); float2int((char *) in, (char *) in, channel_size); mux_channel(s->tmp, (char *) in, sizeof(int32_t), channel_size, s->frame.ch_count, i); } ring_buffer_write(s->data, s->tmp, channel_size * s->frame.ch_count); return 0; }