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