PORT void xresampleV (double* input, double* output, int numsamps, int* outsamps, void* ptr) { RESAMPLE a = (RESAMPLE)ptr; a->in = input; a->out = output; a->size = numsamps; *outsamps = xresample(a); }
static void *receive_thread(void *arg) { float isample; float qsample; int outsamples; int elements; int flags=0; long long timeNs=0; long timeoutUs=10000L; int i; #ifdef TIMING struct timeval tv; long start_time, end_time; rate_samples=0; gettimeofday(&tv, NULL); start_time=tv.tv_usec + 1000000 * tv.tv_sec; #endif running=1; fprintf(stderr,"lime_protocol: receive_thread\n"); while(running) { elements=SoapySDRDevice_readStream(lime_device,stream,(void *)&buffer,max_samples,&flags,&timeNs,timeoutUs); //fprintf(stderr,"read %d elements\n",elements); if(actual_rate!=sample_rate) { for(i=0; i<elements; i++) { resamples[i*2]=(double)buffer[i*2]; resamples[(i*2)+1]=(double)buffer[(i*2)+1]; } outsamples=xresample(resampler); for(i=0; i<outsamples; i++) { iqinputbuffer[samples*2]=(double)resampled[i*2]; iqinputbuffer[(samples*2)+1]=(double)resampled[(i*2)+1]; samples++; #ifdef TIMING rate_samples++; if(rate_samples==sample_rate) { gettimeofday(&tv, NULL); end_time=tv.tv_usec + 1000000 * tv.tv_sec; fprintf(stderr,"%d samples in %ld\n",rate_samples, end_time-start_time); start_time=end_time; rate_samples=0; } #endif if(samples==buffer_size) { int error; fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error); if(error!=0) { fprintf(stderr,"fexchange0 (CHANNEL_RX0) returned error: %d\n", error); } if(local_audio) { audio_write(audiooutputbuffer,outputsamples); } Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); samples=0; } } } else { for(i=0; i<elements; i++) { iqinputbuffer[samples*2]=(double)buffer[i*2]; iqinputbuffer[(samples*2)+1]=(double)buffer[(i*2)+1]; samples++; if(samples==buffer_size) { int error; fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error); if(error!=0) { fprintf(stderr,"fexchange0 (CHANNEL_RX0) returned error: %d\n", error); } audio_write(audiooutputbuffer,outputsamples); Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); samples=0; } } } } fprintf(stderr,"lime_protocol: receive_thread: SoapySDRDevice_closeStream\n"); SoapySDRDevice_closeStream(lime_device,stream); fprintf(stderr,"lime_protocol: receive_thread: SoapySDRDevice_unmake\n"); SoapySDRDevice_unmake(lime_device); }