コード例 #1
0
ファイル: rtl_ais.c プロジェクト: JohnG4CVA/rtl-sdr-misc
static void *demod_thread_fn(void *arg)
{
	while (!do_exit) {
		safe_cond_wait(&ready, &ready_m);
		pthread_rwlock_wrlock(&both.rw);
		downsample(&both);
		memcpy(left.buf,  both.buf, 2*both.len_out);
		memcpy(right.buf, both.buf, 2*both.len_out);
		pthread_rwlock_unlock(&both.rw);
		rotate_90(left.buf, left.len_in);
		downsample(&left);
		memcpy(left_demod.buf, left.buf, 2*left.len_out);
		demodulate(&left_demod);
		if (dc_filter) {
			dc_block_filter(&left_demod);}
		//if (oversample) {
		//	downsample(&left);}
		arbitrary_upsample(left_demod.result, stereo.buf_left, left_demod.result_len, stereo.bl_len);
		rotate_m90(right.buf, right.len_in);
		downsample(&right);
		memcpy(right_demod.buf, right.buf, 2*right.len_out);
		demodulate(&right_demod);
		if (dc_filter) {
			dc_block_filter(&right_demod);}
		//if (oversample) {
		//	downsample(&right);}
		arbitrary_upsample(right_demod.result, stereo.buf_right, right_demod.result_len, stereo.br_len);
		output();
	}
	rtlsdr_cancel_async(dev);
	return 0;
}
コード例 #2
0
ファイル: rtl_fm.c プロジェクト: howard0su/rtl-sdr
static void *demod_thread_fn(void *arg)
{
	struct fm_state *fm2 = arg;
	while (!do_exit) {
		safe_cond_wait(&data_ready, &data_mutex);
		full_demod(fm2);
		if (fm2->exit_flag) {
			do_exit = 1;
			//rtlsdr_cancel_async(dev);
		}
	}
	return 0;
}
コード例 #3
0
ファイル: rtl_fm3.c プロジェクト: gpmed/pd-rtlsdr
// tz this is where gain and frequency are set
//
//
static void *controller_thread_fn(void *arg)
{
	// from original comments:
    // thoughts for multiple dongles
	// might be no good using a controller thread if retune/rate blocks
	
    // int i;
	struct controller_state *s = arg;
    static int latency_timer = 0;
    

    // tz - note that in optimal_settings the actual frequency in s-> is used to set the dongle.freq
    // then the dongle.freq what gets sent to the device.
    //
    //
	optimal_settings_new(s->freqs[0], demod.rate_in);
    
    // tz - we have temporarily abandoned these options but here is where you would set them
    //
	// if (dongle.direct_sampling) {
	//  	verbose_direct_sampling(dongle.dev, 1);}
	// if (dongle.offset_tuning) {
	//  	verbose_offset_tuning(dongle.dev);}
    
	/* Set the frequency */
	
    verbose_set_frequency(dongle.dev, dongle.freq);

	sprintf(errmesg, "Oversampling input by: %ix.\n", demod.downsample);
    post(errmesg,0);
	sprintf(errmesg, "Oversampling output by: %ix.\n", demod.post_downsample);
    post(errmesg,0);
	sprintf(errmesg, "Buffer size: %0.2fms\n",
            1000 * 0.5 * (float)ACTUAL_BUF_LENGTH / (float)dongle.rate);
    post(errmesg,0);
    
	/* Set the sample rate */
	verbose_set_sample_rate(dongle.dev, dongle.rate);
	sprintf(errmesg, "Output at %u Hz.\n", demod.rate_in/demod.post_downsample);
    post(errmesg,0);
    
    
    need_to_reset_circ_buffer = 1;  // tz - this will cause read buffer to reset
    
    
	while (!do_exit) {
        //usleep(100000);
        //post("in controller thread", 0);
        
		safe_cond_wait(&s->hop, &s->hop_m);
        // tz it might be possible to set 'mode' here - using the same init
		// sequence as with restarting the radio
        
        if(need_to_set_freq) {
            need_to_set_freq = 0;
            
            optimal_settings_new(new_freq, demod.rate_in);
            rtlsdr_set_center_freq(dongle.dev, dongle.freq);
            //sprintf(errmesg, "setting frequency to %d", new_freq);
            //post(errmesg, 0);
            
            // need_to_reset_circ_buffer = 1; // not sure if we need to do this here too...
            
            // post("hello...");
            
        }
        
        if(need_to_set_gain) {
            need_to_set_gain = 0;
            dongle.gain = new_gain;
            sprintf(errmesg, "setting gain to %d", new_gain);
            post(errmesg, 0);
            set_tuner_gain(&dongle);
            
        }
        
        if(need_to_reset_circ_buffer) {
            need_to_reset_circ_buffer = 0;
            latency_timer = circ_buf_latency_factor + 1;
            circ_index_write = 0;
            post("reseting circular buffer write index", 0);
        }
        
        // After latency timer counts down to 1, reset the read index too
        // timer cound represents number of vectors (determined by latency factor)
        if(latency_timer > 0) {
            if(latency_timer == 1) {
                post("reseting circular buffer read index", 0);
                circ_index_read = 0;
            }
            latency_timer--;
        }

     
        
  	}
	return 0;
   
}