Home
marochat edited this page Nov 29, 2022
·
5 revisions
このアプリケーションはTauriフロントエンドのオーディオ自動再生についての検証用として作成しました。
Tauriを使用した簡単なアラームアプリケーションを作成しています。 Macで開発を行い、運用はRaspberryPi(Debian Linux11)を搭載した据置機器にて行います。 しかし、開発時(Mac)では再生出来ていたアラーム音が実装環境(Linux)では再生出来ませんでした。 その問題点を検証するためのテストプログラムを作成しました。
- sample1: play with user interactive (button push)
- sample2: play with user interactive (but pre-create AudioContext non-interactive)
- sample3: play after 1s timer play == autoplay test
mac | windows | Linux | |
---|---|---|---|
sample1 | OK | OK | OK |
sample2 | OK | OK | NG |
sample3 | OK | OK | NG |
Linux環境では、ユーザーアクションをトリガとせずにオーディオ再生を行うことが出来なかった(sample3)。また、ユーザーアクションをトリガとせずに作成されたAudioContextを用いたオーディオ再生が出来なかかった(sample2)。
上記問題点を保留したままアラームアプリ開発を進める中で、偶然ではあるが何らかの条件で自動再生が行われる場面がみられた。いくつかの実験で調査を行った結果、次のような条件であればLinux環境でもオーディオの自動再生が行われることが確認できた。
- Rust側で適当なAPIを用意する(既存のAPIでも良い)
#[tauri::command]
fn logging(mes: Option<String>) {
if let Some(val) = mes {
println!("{}", val);
}
}
- フロントでオーディオ再生の直前に上記APIを同期的に挿入する
invoke('logging', {mes: 'audio play.'}).then(() => {
new Audio('audio.mp3').play();
});
本テストプログラムにおいても、sample3についてタイマー後のオーディオ処理の直前でinvokeをawaitすることで、オーディオの自動再生が出来るようになった。 autoplay-test:test
ただしこれはあくまでも偶然の発見により「問題回避できたかも知れない」という結果のみであり、どの様なメカニズムこのような結果を得られたのかなどは不明。