Home | History | Annotate | Line # | Download | only in scripts
      1  1.1  christos #!/usr/bin/env bash
      2  1.1  christos 
      3  1.1  christos ## bash script to generate file magic support for flac.
      4  1.1  christos ## https://github.com/file/file/blob/master/magic/Magdir/audio
      5  1.1  christos ## below "#some common sample rates" (line 471), ie:
      6  1.1  christos ## >>17	belong&0xfffff0		0x2ee000	\b, 192 kHz
      7  1.1  christos 
      8  1.1  christos LANG=C
      9  1.1  christos 
     10  1.1  christos target=magic/Magdir/audio
     11  1.1  christos 
     12  1.1  christos ## construct static list of sample rates based on standard crystal
     13  1.1  christos ## oscillator frequencies.
     14  1.1  christos ## 16.384  MHz Unknown audio application
     15  1.1  christos ##             (16384 kHz  = 32 kHz * 512 = 32 * 2^9)
     16  1.1  christos ## 22.5792 MHz Redbook/CD
     17  1.1  christos ##             (22579.2 kHz = 44.1kHz * 512 = 44.1 * 2^9)
     18  1.1  christos ##             also used: 11.2896, 16.9344, 33.8688 and 45.1584
     19  1.1  christos ## 24.576  MHz DAT/Video
     20  1.1  christos ##             (24576 kHz = 48 kHz * 512 = 48 * 2^9)
     21  1.1  christos ##             also used: 49.1520
     22  1.1  christos 
     23  1.1  christos ## 33.8688 > 16.9344
     24  1.1  christos ## 36.864  > 18.432000
     25  1.1  christos declare -a a_ground_fs=(16384000 22579200 24576000)
     26  1.1  christos 
     27  1.1  christos ## multiply ground clock frequencies by 1953 to get usable base
     28  1.1  christos ## frequencies, for instance:
     29  1.1  christos ##  DAT/video:  24.576  MHz * 1000000 / 512 = 48000Hz
     30  1.1  christos ##  Redbook/CD: 22.5792 MHz * 1000000 / 512 = 44100Hz
     31  1.1  christos ## use base rates for calculating derived rates
     32  1.1  christos declare -a samplerates
     33  1.1  christos ## min divider: fs/n
     34  1.1  christos def_fs_n=512
     35  1.1  christos min_fs_n=4
     36  1.1  christos ## start at base_fs/(def_fs*min_fs)
     37  1.1  christos ## add each derived sample rate to the array
     38  1.1  christos for base_fs in "${a_ground_fs[@]}"; do 
     39  1.1  christos     min_fs=$( echo "${base_fs} / ( ${def_fs_n} * ${min_fs_n} )" | bc)
     40  1.1  christos     ## max multiplier: fs*n*min_fs
     41  1.1  christos     max_fs_n=$(( 8 * min_fs_n ))
     42  1.1  christos     n=${max_fs_n}
     43  1.1  christos     while [[ ${n} -ge 1 ]]; do
     44  1.1  christos 	sample_rate=$(( min_fs * n ))
     45  1.1  christos 	samplerates+=(${sample_rate})
     46  1.1  christos 	n=$(( n / 2 ))
     47  1.1  christos     done
     48  1.1  christos done
     49  1.1  christos 
     50  1.1  christos declare -a stripped_rates
     51  1.1  christos declare -a lines
     52  1.1  christos for samplerate in "${samplerates[@]}"; do
     53  1.1  christos     ## use bc with sed to convert and format Hz to kHz
     54  1.1  christos     stripped_rate="$(LANG=C bc <<< "scale=5; ${samplerate} / 1000" | \
     55  1.1  christos 			      sed 's#[0\.]*$##g')"
     56  1.1  christos     ## only add uniq sample rates (should be necessary
     57  1.1  christos     if [[ ! "${stripped_rates[@]}" =~ ${stripped_rate} ]]; then
     58  1.1  christos 	printf -v line ">>17\tbelong&%#-15x\t%#08x\t%s, %s kHz\n" \
     59  1.1  christos 	       "16777200" \
     60  1.1  christos 	       "$(( samplerate * 16 ))" \
     61  1.1  christos 	       "\b" \
     62  1.1  christos 	       "${stripped_rate}"
     63  1.1  christos 	stripped_rates+=("${stripped_rate}")
     64  1.1  christos 	lines+=("${line}")
     65  1.1  christos     fi
     66  1.1  christos 
     67  1.1  christos done
     68  1.1  christos printf "## start cutting >>> \n"
     69  1.1  christos ## print out the formatted lines
     70  1.1  christos printf "%s" "${lines[@]}" | sort -k5 -n
     71  1.1  christos printf "## <<< stop cutting\n"
     72