システム全体のアラート音を鳴らす

Recipe ID: dlg-014

エラーが発生した際や、ユーザーの注意を引きたいときに、OS 標準の警告音(ビープ音)を鳴らす方法を紹介します。

1. フロントエンドから作成する (TypeScript)

Web Audio API を使用して、ビープ音のような正弦波を生成・再生する方法です。簡易的ですがクロスプラットフォームで動作します。

Web Audio API によるビープ音

function playWebBeep(frequency = 440, duration = 0.2) {
  const audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();
  const oscillator = audioCtx.createOscillator();
  const gainNode = audioCtx.createGain();

  oscillator.type = 'sine'; // 正弦波
  oscillator.frequency.setValueAtTime(frequency, audioCtx.currentTime); 
  gainNode.gain.setValueAtTime(0.1, audioCtx.currentTime); // 音量
  oscillator.connect(gainNode);
  gainNode.connect(audioCtx.destination);

  oscillator.start();
  oscillator.stop(audioCtx.currentTime + duration);
}

// 呼び出し
playWebBeep(880, 0.1); 

2. バックエンドから作成する (Rust)

OS ネイティブの API (MessageBeep, NSBeep) を呼び出すコマンドを作成します。

Rust コマンドの実装

src-tauri/src/lib.rs:

use tauri::command;

#[command]
fn play_system_beep() {
    #[cfg(target_os = "macos")]
    unsafe {
        use cocoa::appkit::NSBeep;
        NSBeep();
    }

    #[cfg(target_os = "windows")]
    unsafe {
        use winapi::um::winuser::MessageBeep;
        use winapi::um::winuser::MB_OK;
        MessageBeep(MB_OK);
    }
    
    #[cfg(target_os = "linux")]
    println!("\x07"); 
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![play_system_beep])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

Cargo.toml に依存関係を追加:

[target.'cfg(target_os = "macos")'.dependencies]
cocoa = "0.24"

[target.'cfg(target_os = "windows")'.dependencies]
winapi = { version = "0.3", features = ["winuser"] }

TypeScript からの呼び出し

import { invoke } from '@tauri-apps/api/core';

async function beep() {
  await invoke('play_system_beep');
}

補足

  • ネイティブ統合: ユーザーがOS 設定で変更している警告音がそのまま再生されるため、Rust 版の方がネイティブ感があります。
  • 依存関係: OS 固有のクレート(winapi, cocoa)は cfg でターゲットを絞って追加してください。