Continued:
[core.git] / contrib / audio.php
1 <?php
2 $GLOBALS['options'] = [
3         'analyze_input' => FALSE,
4         'reduce_noise'  => FALSE,
5         'ignore_noise'  => FALSE,
6         'keep_noise'    => FALSE,
7         'buffer_size'   => 8,
8 ];
9
10 if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'a') {
11         $GLOBALS['options']['analyze_input'] = TRUE;
12 } elseif (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'r') {
13         $GLOBALS['options']['reduce_noise'] = TRUE;
14 } elseif (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'k') {
15         $GLOBALS['options']['keep_noise'] = TRUE;
16 }
17
18 if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'i') {
19         $GLOBALS['options']['ignore_noise'] = TRUE;
20 } elseif (isset($_SERVER['argv'][2]) && $_SERVER['argv'][2] == 'i') {
21         $GLOBALS['options']['ignore_noise'] = TRUE;
22 } elseif (isset($_SERVER['argv'][2]) && $_SERVER['argv'][2] == 'k') {
23         $GLOBALS['options']['keep_noise'] = TRUE;
24 }
25
26 function analyzeForNoiseOnly ($data) {
27         $GLOBALS['analysis']['breakdown'] = [];
28         $GLOBALS['analysis']['average']   = 0;
29
30         for ($i = 0; $i < strlen($data); $i++) {
31                 $ord = ord(substr($data, $i, 1));
32                 $GLOBALS['analysis']['breakdown'][$ord] = TRUE;
33                 $GLOBALS['analysis']['average'] += $ord;
34         }
35
36         if (!$GLOBALS['options']['keep_noise'] && !$GLOBALS['options']['ignore_noise'] && count($GLOBALS['analysis']['breakdown']) == 2 && isset($GLOBALS['analysis']['breakdown'][127]) && isset($GLOBALS['analysis']['breakdown'][128])) {
37                 if ($GLOBALS['options']['analyze_input']) {
38                         //echo 'NOISE1!' . PHP_EOL;
39                 }
40                 return NULL;
41         } elseif (!$GLOBALS['options']['keep_noise'] && !$GLOBALS['options']['ignore_noise'] && count($GLOBALS['analysis']['breakdown']) == 1 && isset($GLOBALS['analysis']['breakdown'][127])) {
42                 if ($GLOBALS['options']['analyze_input']) {
43                         //echo 'NOISE2!' . PHP_EOL;
44                 }
45                 return NULL;
46         } elseif (!$GLOBALS['options']['keep_noise'] && $GLOBALS['options']['ignore_noise'] && count($GLOBALS['analysis']['breakdown']) < 2) {
47                 if ($GLOBALS['options']['analyze_input']) {
48                         //echo 'NOISE3!' . PHP_EOL;
49                 }
50                 return NULL;
51         }
52
53         // Return given data
54         return $data;
55 }
56
57 //$pcm = fopen('output1.pcm', 'rb') or die('Cannot read from audio');
58 $pcm = fopen('/dev/dsp', 'rb') or die('Cannot read from audio' . PHP_EOL);
59
60 $empty = str_repeat(chr(128), $GLOBALS['options']['buffer_size']);
61
62 while (TRUE) {
63         //usleep(100);
64         $data = trim(fread($pcm, $GLOBALS['options']['buffer_size']));
65         if ((empty($data)) || ($data == $empty)) {
66                 if ($GLOBALS['options']['analyze_input']) {
67                         //echo 'EMPTY!' . PHP_EOL;
68                 }
69                 continue;
70         }
71
72         // Detect noise
73         $data = analyzeForNoiseOnly($data);
74
75         // Empty?
76         if (empty($data)) {
77                 // Skip this
78                 continue;
79         } // END - if
80
81         $GLOBALS['analysis']['average'] = floor($GLOBALS['analysis']['average'] / strlen($data));
82
83         if ($GLOBALS['options']['analyze_input']) {
84                 $simpleAnalysis = '';
85                 for ($i = 0; $i < strlen($data); $i++) {
86                         $ord = ord(substr($data, $i, 1));
87                         $simpleAnalysis .= str_pad($ord, 3, '0', STR_PAD_LEFT) . '=0x' . str_pad(dechex($ord), 2, '0', STR_PAD_LEFT) . ',';
88                 }
89                 $simpleAnalysis = substr($simpleAnalysis, 0, -1) . ' (' . count($GLOBALS['analysis']['breakdown']) . ')' . PHP_EOL;
90
91                 echo $simpleAnalysis;
92         } elseif ($GLOBALS['options']['reduce_noise']) {
93                 $out = '';
94                 for ($i = 0; $i < strlen($data); $i++) {
95                         $ord = ord(substr($data, $i, 1));
96                         // @TODO What do here to remove noise?
97                         $ord -= $GLOBALS['analysis']['average'];
98                         $out .= chr($ord);
99                 }
100
101                 $out = analyzeForNoiseOnly($out);
102
103                 if (empty($out)) {
104                         // Skip this
105                         continue;
106                 } // END - if
107
108                 echo $out;
109         } else {
110                 echo $data;
111         }
112
113         if (feof($pcm)) {
114                 if ($GLOBALS['options']['analyze_input']) {
115                         echo 'EOF!' . PHP_EOL;
116                 }
117                 break;
118         }
119 }
120
121 fclose($pcm);