Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);

}