| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -83,6 +83,7 @@ void usage(void) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"\t[-d device_index (default: 0)]\n" | 
					 | 
					 | 
					 | 
							"\t[-d device_index (default: 0)]\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"\t[-g tuner_gain (default: -1dB)]\n" | 
					 | 
					 | 
					 | 
							"\t[-g tuner_gain (default: -1dB)]\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"\t[-l squelch_level (default: 150)]\n" | 
					 | 
					 | 
					 | 
							"\t[-l squelch_level (default: 150)]\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							"\t[-E freq sets lower edge (default: center)]\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"\tfilename (a '-' dumps samples to stdout)\n\n" | 
					 | 
					 | 
					 | 
							"\tfilename (a '-' dumps samples to stdout)\n\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"Produces signed 16 bit ints, use sox to hear them.\n" | 
					 | 
					 | 
					 | 
							"Produces signed 16 bit ints, use sox to hear them.\n" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							"\trtl_fm ... | play -t raw -r 24k -e signed-integer -b 16 -c 1 -\n\n"); | 
					 | 
					 | 
					 | 
							"\trtl_fm ... | play -t raw -r 24k -e signed-integer -b 16 -c 1 -\n\n"); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -234,13 +235,13 @@ static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fwrite(fm2->signal2, 2, fm2->signal_len/2, fm2->file); | 
					 | 
					 | 
					 | 
						fwrite(fm2->signal2, 2, fm2->signal_len/2, fm2->file); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void optimal_settings(struct fm_state *fm, int freq, int rate) | 
					 | 
					 | 
					 | 
					static void optimal_settings(struct fm_state *fm, int freq, int rate, int edge) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int r, capture_freq, capture_rate; | 
					 | 
					 | 
					 | 
						int r, capture_freq, capture_rate; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fm->downsample = (1000000 / rate) + 1; | 
					 | 
					 | 
					 | 
						fm->downsample = (1000000 / rate) + 1; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fprintf(stderr, "Oversampling by: %ix.\n", fm->downsample); | 
					 | 
					 | 
					 | 
						fprintf(stderr, "Oversampling by: %ix.\n", fm->downsample); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						capture_rate = fm->downsample * rate; | 
					 | 
					 | 
					 | 
						capture_rate = fm->downsample * rate; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						capture_freq = freq + capture_rate/4; | 
					 | 
					 | 
					 | 
						capture_freq = (freq + (edge*rate/2)) + capture_rate/4; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fm->output_scale = (1<<15) / (128 * fm->downsample); | 
					 | 
					 | 
					 | 
						fm->output_scale = (1<<15) / (128 * fm->downsample); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (fm->output_scale < 1) { | 
					 | 
					 | 
					 | 
						if (fm->output_scale < 1) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							fm->output_scale = 1; | 
					 | 
					 | 
					 | 
							fm->output_scale = 1; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -268,7 +269,7 @@ int main(int argc, char **argv) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char *filename = NULL; | 
					 | 
					 | 
					 | 
						char *filename = NULL; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int n_read; | 
					 | 
					 | 
					 | 
						int n_read; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int r, opt; | 
					 | 
					 | 
					 | 
						int r, opt; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int i, gain = -10; // tenths of a dB
 | 
					 | 
					 | 
					 | 
						int i, edge = 0, gain = -10; // tenths of a dB
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						uint8_t *buffer; | 
					 | 
					 | 
					 | 
						uint8_t *buffer; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						uint32_t dev_index = 0; | 
					 | 
					 | 
					 | 
						uint32_t dev_index = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						uint32_t frequency = 100000000; | 
					 | 
					 | 
					 | 
						uint32_t frequency = 100000000; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -278,7 +279,7 @@ int main(int argc, char **argv) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char vendor[256], product[256], serial[256]; | 
					 | 
					 | 
					 | 
						char vendor[256], product[256], serial[256]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fm.squelch_level = 150; | 
					 | 
					 | 
					 | 
						fm.squelch_level = 150; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#ifndef _WIN32 | 
					 | 
					 | 
					 | 
					#ifndef _WIN32 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						while ((opt = getopt(argc, argv, "d:f:g:s:b:l:S::")) != -1) { | 
					 | 
					 | 
					 | 
						while ((opt = getopt(argc, argv, "d:f:g:s:b:l:E::")) != -1) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							switch (opt) { | 
					 | 
					 | 
					 | 
							switch (opt) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							case 'd': | 
					 | 
					 | 
					 | 
							case 'd': | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								dev_index = atoi(optarg); | 
					 | 
					 | 
					 | 
								dev_index = atoi(optarg); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -295,6 +296,9 @@ int main(int argc, char **argv) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							case 's': | 
					 | 
					 | 
					 | 
							case 's': | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								samp_rate = (uint32_t)atof(optarg); | 
					 | 
					 | 
					 | 
								samp_rate = (uint32_t)atof(optarg); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								break; | 
					 | 
					 | 
					 | 
								break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							case 'E': | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
								edge = 1; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
								break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							default: | 
					 | 
					 | 
					 | 
							default: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								usage(); | 
					 | 
					 | 
					 | 
								usage(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								break; | 
					 | 
					 | 
					 | 
								break; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -352,7 +356,7 @@ int main(int argc, char **argv) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); | 
					 | 
					 | 
					 | 
						SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif | 
					 | 
					 | 
					 | 
					#endif | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						optimal_settings(&fm, frequency, samp_rate); | 
					 | 
					 | 
					 | 
						optimal_settings(&fm, frequency, samp_rate, edge); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						/* Set the tuner gain */ | 
					 | 
					 | 
					 | 
						/* Set the tuner gain */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						r = rtlsdr_set_tuner_gain(dev, gain); | 
					 | 
					 | 
					 | 
						r = rtlsdr_set_tuner_gain(dev, gain); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |