Implement k, M suffixes for frequency and sample rates.
This commit is contained in:
		
							parent
							
								
									d19123946e
								
							
						
					
					
						commit
						ddcb6a8500
					
				
							
								
								
									
										1
									
								
								TODO.txt
								
								
								
								
							
							
						
						
									
										1
									
								
								TODO.txt
								
								
								
								
							|  | @ -1,4 +1,3 @@ | |||
| * (feature) support 'M' 'k' suffixes for sample rates and tuning frequency | ||||
| * (feature) implement stereo pilot pulse-per-second | ||||
| * (speedup) maybe replace high-order FIR downsampling filter with 2nd order butterworth followed by lower order FIR filter | ||||
| * figure out why we sometimes lose stereo lock | ||||
|  |  | |||
							
								
								
									
										39
									
								
								main.cc
								
								
								
								
							
							
						
						
									
										39
									
								
								main.cc
								
								
								
								
							|  | @ -236,22 +236,41 @@ void badarg(const char *label) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool parse_opt(const char *s, int& v) | ||||
| bool parse_int(const char *s, int& v, bool allow_unit=false) | ||||
| { | ||||
|     char *endp; | ||||
|     long t = strtol(s, &endp, 10); | ||||
|     if (endp == s || *endp != '\0' || t < INT_MIN || t > INT_MAX) | ||||
|     if (endp == s) | ||||
|         return false; | ||||
|     if ( allow_unit && *endp == 'k' && | ||||
|          t > INT_MIN / 1000 && t < INT_MAX / 1000 ) { | ||||
|         t *= 1000; | ||||
|         endp++; | ||||
|     } | ||||
|     if (*endp != '\0' || t < INT_MIN || t > INT_MAX) | ||||
|         return false; | ||||
|     v = t; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool parse_opt(const char *s, double& v) | ||||
| bool parse_dbl(const char *s, double& v) | ||||
| { | ||||
|     char *endp; | ||||
|     v = strtod(s, &endp); | ||||
|     return (endp != s && *endp == '\0'); | ||||
|     if (endp == s) | ||||
|         return false; | ||||
|     if (*endp == 'k') { | ||||
|         v *= 1.0e3; | ||||
|         endp++; | ||||
|     } else if (*endp == 'M') { | ||||
|         v *= 1.0e6; | ||||
|         endp++; | ||||
|     } else if (*endp == 'G') { | ||||
|         v *= 1.0e9; | ||||
|         endp++; | ||||
|     } | ||||
|     return (*endp == '\0'); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -291,22 +310,22 @@ int main(int argc, char **argv) | |||
|                             longopts, &longindex)) >= 0) { | ||||
|         switch (c) { | ||||
|             case 'f': | ||||
|                 if (!parse_opt(optarg, freq) || freq <= 0) { | ||||
|                 if (!parse_dbl(optarg, freq) || freq <= 0) { | ||||
|                     badarg("-f"); | ||||
|                 } | ||||
|                 break; | ||||
|             case 'd': | ||||
|                 if (!parse_opt(optarg, devidx)) | ||||
|                 if (!parse_int(optarg, devidx)) | ||||
|                     devidx = -1; | ||||
|                 break; | ||||
|             case 's': | ||||
|                 // NOTE: RTL does not suppor sample rate 900 kS/s or lower
 | ||||
|                 if (!parse_opt(optarg, ifrate) || ifrate <= 900000) { | ||||
|                 if (!parse_dbl(optarg, ifrate) || ifrate <= 900000) { | ||||
|                     badarg("-s"); | ||||
|                 } | ||||
|                 break; | ||||
|             case 'r': | ||||
|                 if (!parse_opt(optarg, pcmrate) || pcmrate < 1) { | ||||
|                 if (!parse_int(optarg, pcmrate, true) || pcmrate < 1) { | ||||
|                     badarg("-r"); | ||||
|                 } | ||||
|                 break; | ||||
|  | @ -327,12 +346,12 @@ int main(int argc, char **argv) | |||
|                     alsadev = optarg; | ||||
|                 break; | ||||
|             case 'b': | ||||
|                 if (!parse_opt(optarg, bufsecs) || bufsecs < 0) { | ||||
|                 if (!parse_dbl(optarg, bufsecs) || bufsecs < 0) { | ||||
|                     badarg("-b"); | ||||
|                 } | ||||
|                 break; | ||||
|             case 'a': | ||||
|                 if (!parse_opt(optarg, agcmode)) { | ||||
|                 if (!parse_int(optarg, agcmode)) { | ||||
|                     badarg("-a"); | ||||
|                 } | ||||
|                 break; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue