Comiket86/87で頒布した「いつもの人発見装置の作成」という本で作った装置は、マイコンとスマホとのデータ通信に、マイコンでDBPSK変調 → オーディオケーブル → スマホ(タブレット)のブラウザ上のJavaScriptで復調という手段をとってます。
で、Comiket86で作った装置を、Comiket87でもデモしようと思って、久しぶりに火を入れてみたら、うまく動かない。
タブレットにオーディオケーブルを指して、しばらくは、うまく通信できているのに、しばらくするとまったく通信できなくなる。
ブラウザ側のJavaScriptは getUserMedia というAPIでオーディオ入力データを取得しているのですが、どうやらComiket 86からComiket 87までの半年間でブラウザとして使っていたChormeのgetUserMediaの挙動が変わったようです。
いつの間にか AGC (Auto Gain Control) やら、エコー除去処理やら、ノイズ除去処理やらがデフォルトで動作するようになった模様。
いつもの人発見装置からブラウザに送り込んでいるオーディオデータは人間が聞くような音ではないので、新たに動くようになった機能によって、次第に、getUserMediaで得られるデータからDBPSKで変調された部分がフィルタで取り除かれてしまったようです。
これらの新機能を動かさないようにするには・・・・
http://d-rissoku.net/WifiDetector/ のデモのソースコード ( http://d-rissoku.net/WifiDetector/WifiDetector.js )でいえば、
navigator.getUserMedia( {audio : true}, function(s) { AudioComm.startReceive(audioCtx, s, WifiDetector.recvByteHandler); }, function(e) { console.log(e); });
となっているのを、
navigator.getUserMedia( {audio: { "mandatory": { "googEchoCancellation": false, "googAutoGainControl": false, "googNoiseSuppression": false, "googHighpassFilter": false }, "optional": [] }}, function(s) { AudioComm.startReceive(audioCtx, s, WifiDetector.recvByteHandler); }, function(e) { console.log(e); });
な塩梅にすればOKなようです。
最近のコメント