示例#1
0
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;
}
示例#2
0
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;
}