← Back
AISlop-Inc

AISlop-Inc/AudioMixer

View on GitHub ↗
Stars
3
Forks
0
Watchers
3
Open issues
0
Contributors
1
Language
Swift
License
MIT License
Default branch
main
Created Oct 1, 2026Updated Oct 1, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

!!!このプロジェクトはAI Slopです!!! !!!このプロジェクトはAI Slopです!!! !!!このプロジェクトはAI Slopです!!!

AudioMixer

macOSのメニューバーから、アプリごとの音量を調整するミキサーです。音楽はそのまま、ブラウザーだけ小さくする、といった使い方ができます。

Swift・SwiftUI・AppKitとCore Audioで実装しています。追加ライブラリや仮想オーディオドライバーは不要です。

できること

  • アプリごとの音量調整とミュート
  • 音声を出すアプリの自動管理と、システムの出力先への自動追従
  • 100%を超える音量のBoostと、上限の設定
  • 選択したアプリの音量・ミュートの一括変更
  • リッチ/コンパクト表示の切り替え
  • 日本語・英語の表示(macOSの優先言語に自動追従)
  • アプリごとの音量・ミュート、Boost上限、表示モードの保存

必要な環境

  • macOS 15以降
  • Swift 6.0以降を含むXcodeまたはCommand Line Tools
  • macOSの音声収録の許可

ビルドして起動

リポジトリのルートで実行します。

./build.sh --open

releaseビルド、アプリの作成、ローカルのadhoc署名、セルフテストを実行してから起動します。作成先は build/AudioMixer.app です。

メニューバーのスライダーアイコンをクリックすると音量一覧が開きます。Dockには表示しません。設定はメニューの「設定…」または ⌘, から開けます。

初回の音声収録許可

起動時にmacOSの標準ダイアログで音声収録の許可を要求します。許可した後、いずれかのアプリで音声を再生してください。実際の音声を受け取るまで、アプリごとの音量調整は待機します。

許可要求用の音声は再生・保存せず破棄します。許可済みなら通常はダイアログを再表示しません。拒否した場合やダイアログが出ない場合は、設定の「音声収録の許可設定を開く…」からシステム設定を確認してください。ローカルビルドの更新後に再許可を求められることがあります。

表示言語

初期表示はmacOSの優先言語から日本語・英語を選びます。どちらも指定されていない場合は英語を使用します。macOSの「システム設定 → 一般 → 言語と地域」でAudioMixerのアプリ別言語を設定した場合は、その設定に従います。言語を変更した後はアプリを再起動してください。

画面・操作説明・アプリ内エラー・音声収録の許可説明を翻訳しています。アプリ名やデバイス名はmacOSから取得した名前を表示します。

使い方

アプリごとの音量とミュート

起動中のアプリを一覧に表示し、音声を出しているアプリを自動で管理します。無音のアプリも表示します。Helperプロセスは、親アプリを特定できる場合は同じアプリにまとめます。

スライダーの左端が0%、目印が100%、右端がBoost上限です。スピーカーボタンでミュートを切り替えます。音量を変更してもミュートは解除しません。

設定の「表示モード」で、アプリ名・音量値を表示するリッチ表示と、アイコン中心のコンパクト表示を選べます。アイコンや操作にポインタを合わせると、アプリ名・音量・ミュート状態を確認できます。

Boost

100%を超えてスライダーを動かし、ドラッグを離すと、ポップアップ内に確認欄が表示されます。「Boostを有効にする」を押すまで、要求した増幅は適用しません。100%以下に戻した後、再び超えると確認します。

上限は設定で100〜1000%に変更できます。初期値は200%です。上限を下げると現在の音量と承認待ちの音量もその範囲に収めます。上限を上げただけでは現在の音量は変わりません。

Boostは大音量による聴覚への負担や音割れを招くことがあります。ピークを±1に制限するため、元音が大きい場合は歪むことがあります。

一括制御

設定の「一括制御」で対象アプリにチェックを入れ、音量を指定して「選択したアプリに適用」を押します。「全選択」「選択解除」と、選択したアプリの「ミュート」「アンミュート」も使えます。

「音量を下げるだけ」を有効にすると、指定値より小さい音量を維持します。あるアプリ以外を下げたい場合は、全選択してそのアプリだけチェックを外してください。適用対象は、その時点で起動している選択済みアプリです。

停止と出力先の切り替え

設定の「すべて停止」で音量調整を解除し、元の音声出力へ戻して自動管理を停止します。「アプリを自動で管理」を有効にすると再開します。

システムの出力先と音声プロセスの変化は2秒間隔で確認します。出力先を変更すると音声出力を再構築し、音量を0から設定値へ立ち上げます。この間は短い途切れがあります。システム全体の出力先は変更しません。

開発と検証

# ビルドとセルフテスト(アプリは起動しません)
./build.sh

# 作成済みのアプリでセルフテストだけを実行
build/AudioMixer.app/Contents/MacOS/AudioMixer --self-test

# 実機のアプリ・音声プロセス・出力先を表示
build/AudioMixer.app/Contents/MacOS/AudioMixer --list

セルフテストはPCM処理、gain ramp、ミュート、チャンネル配置、Boost承認と上限、スライダー操作、一括制御、設定の保存・復元などを確認します。preconditionを使うためreleaseビルドでも有効です。保存のテストには一時的なUserDefaults領域を使い、普段の設定は変更しません。

./build.sh は日本語・英語それぞれでセルフテストを実行し、翻訳キー、引数の置換、言語選択、翻訳リソースの同梱と許可説明も検証します。テスト実行時のプロセスにだけ言語を指定し、macOSの言語設定は変更しません。

ビルドとセルフテストの成功は、音声収録の許可や実際の再生品質を確認したこととは別です。

コード整形

整形とlintにはXcode付属の swift-format を使います。.swift-format でインデントを4スペース、行幅の目安を120文字に設定しています。

./format.sh          # コードを整形
./format.sh --check  # lint・書式チェック(ファイルを書き換えない)

./build.sh もビルド前にチェックを実行します。

ソース構成

ファイル 役割
Sources/App.swift 起動、メニューバー、設定ウィンドウ、終了処理
Sources/MixerViews.swift 音量一覧と設定画面
Sources/NativeControls.swift AppKitの操作部品
Sources/MixerModel.swift アプリ監視、許可待ち、音声セッションと出力先の管理
Sources/VolumeSettings.swift 音量、ミュート、Boost承認、上限、一括変更、保存
Sources/Localization.swift / Sources/Resources macOSの言語選択、文字列の置換、日本語・英語の翻訳
Sources/Audio.swift Core Audioプロパティ操作、アプリと出力先の取得
Sources/TapSession.swift TapとAggregate Deviceの管理、リアルタイムPCM処理

音声処理の流れ

アプリのCore Audio process IDs
  → stereo Process Tap(元音をミュート)
  → private Aggregate Deviceの入力
  → HAL IO callbackでFloat32 PCMにgainを乗算
  → システムで選択された出力デバイス

アプリごとにTap・Aggregate Device・callbackを作成します。出力デバイスのUIDはAggregate Deviceの出力側へ指定し、停止時にデバイスを破棄します。物理出力デバイスの入力ストリームはIOProcで無効化します。リアルタイム処理内ではロック、メモリー確保、ログ出力を行わず、音量変更は1コールバック分のgain rampで反映します。

画面・設定・音声セッションは同じ親アプリ識別子で管理します。音量は親アプリのbundle IDをキーに保存し、音声プロセスが入れ替わるとセッションを再構築します。

ライセンス

MIT License © 2026 mattyatea