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