Manusで作る!Windows用オーディオ切替ウィジェットの開発記
Manusで作る!Windows用オーディオ切替ウィジェットの開発記
今回はAIアシスタント「Manus」と一緒に、Windows用のオーディオ出力切替ウィジェットを開発した体験を共有します。この記事では、アイデアの発案から実装、そして様々な技術的課題の解決までの道のりをお伝えします。
きっかけ:日常の小さな不便さ
皆さんは、PCで作業中に「スピーカーからヘッドホンに音声出力を切り替えたい」と思ったとき、どうしていますか?
Windows標準の切替方法は以下の通り:
- タスクバーの音量アイコンを右クリック
- 「サウンド」を選択
- 「再生」タブを開く
- 目的のデバイスを右クリック
- 「既定のデバイスとして設定」を選択
この5ステップ、毎回行うには面倒すぎますよね。特にオンライン会議中に急いで切り替えたいときなど、ストレスになります。
特にVR系バーチャルデスクトップを繋いだ後はまずオーディオ持ってかれるんですよね。
「常に確認できてワンクリックで切り替えられるツールがあれば...」
そんな思いから、Manusに相談してみることにしました。
Manusとの開発プロセス
要件定義:明確なゴールを設定
まず、Manusに以下の要件を伝えました:
- Windowsのウィジェットとして動作するアプリ
- 現在のオーディオ出力デバイスを表示
- ワンクリックで別のデバイスに切り替え可能
- 軽量でバックグラウンドで常駐可能
- 前回選択したデバイスを記憶
Manusはこれらの要件を整理し、実装方針を提案してくれました。C#とWPFを使用し、Core Audio APIでデバイス操作を行う方針です。
技術調査:適切なAPIの選定
Manusは、Windows Core Audio APIに関する情報を収集し、オーディオデバイスの列挙と切替に必要なコードを調査してくれました。
特に印象的だったのは、単にコードを提示するだけでなく、以下のような詳細な説明も付けてくれたこと:
- IMMDeviceEnumeratorインターフェースの使い方
- デバイス列挙のためのEnumAudioEndpointsメソッドの使用法
- デフォルトデバイス設定のためのIPolicyConfigインターフェースの活用方法
UI設計:使いやすさを重視
Manusは、Windows 11風のミニマルなデザインを提案してくれました:
- 折りたたみ可能なウィジェット
- デバイスタイプに応じたアイコン表示(スピーカー、ヘッドホン、HDMI等)
- 展開時にはデバイス一覧をリスト表示
- 選択するとすぐに切り替わる直感的な操作性
実装:段階的な開発
Manusは、プロジェクト構成から実装まで、段階的に進めてくれました:
- Visual Studioソリューションの作成
- MVVMパターンに基づくプロジェクト構造の設計
- Core Audio APIを利用したデバイス操作機能の実装
- WPFによるUI実装
- 設定保存機能の追加
直面した技術的課題と解決策
開発は順調に進んでいるように見えましたが、実際にビルドして動かしてみると、いくつかの問題が発生しました。
課題1:Visual Studioのバージョン互換性
最初に提供されたプロジェクトが.NET 6.0向けだったため、古いVisual Studioでは開けないというエラーが発生しました。
MSBuild バージョン 17.0.0 以上が必要です。現在利用可能な MSBuild のバージョンは 16.11.2.50704 です。
Manusは問題を即座に理解し、Visual Studio 2022のインストールを提案。その後も様々なビルドエラーに対して、的確な修正を提供してくれました。
課題2:メモリアクセス違反
最も難しかったのは、アプリ実行時に発生したメモリアクセス違反です:
System.AccessViolationException
Message=Attempted to read or write protected memory.
これはCore Audio APIの低レベルなCOM呼び出しが原因でした。Manusは以下の対応を行いました:
- まず構造体定義とメモリ管理を見直した修正版を提供
- それでも解決しなかったため、NAudioライブラリを導入する抜本的な改善策を提案
- NAudioを使ったコードでも問題が残ったため、COMインターフェース定義を徹底的に見直し
最終的には、正確なインターフェース定義とMarshalAs属性の適切な設定により、問題を解決できました。
課題3:UI動作の不具合
UIの動作にも問題がありました:
- デバイスをクリックしても切り替わらない
- ウィジェットが折りたためない
- ListBoxの参照があいまいというエラー
これらの問題に対しても、Manusは根気強く対応してくれました。特にWPFとWindows Formsの名前空間競合を解決するために、完全修飾名を使用するという解決策は勉強になりました。
完成!使ってみた感想
最終的に完成したアプリは、まさに求めていた機能を実現してくれました:
- ウィジェットをクリックするとデバイス一覧が表示される
- デバイスを選択すると即座に切り替わる
- 軽量で邪魔にならないデザイン
- 前回使用したデバイスを記憶してくれる
特に気に入ったのは、デバイスタイプに応じたアイコン表示です。視覚的に分かりやすく、どのデバイスに切り替えるか迷うことがなくなりました。
Manusとの開発体験
今回のプロジェクトを通じて、Manusとの開発体験について感じたことをいくつか共有します:
1. 技術的な深さと広さ
Manusは、C#、WPF、Windows API、COMインターフェースなど、多岐にわたる技術領域に精通していました。特に印象的だったのは、問題が発生したときの原因特定と解決策の提案の速さです。
2. 段階的な問題解決アプローチ
複雑な問題に直面したとき、Manusは「まずこれを試してみましょう」という形で段階的に解決策を提案してくれました。一度に全てを解決しようとするのではなく、一歩ずつ進める姿勢が、開発プロセスを分かりやすくしてくれました。
3. 丁寧な説明とドキュメント
コードだけでなく、設計書やREADME、ビルド手順など、充実したドキュメントも提供してくれました。これにより、自分でコードを理解し、必要に応じて修正することも容易になりました。
4. 柔軟な対応力
当初の計画から変更が必要になったとき(例:Core Audio APIの直接利用からNAudioへの切り替え)も、柔軟に対応してくれました。これは実際のソフトウェア開発でも重要な資質だと感じます。
まとめ:Manusとの開発は「共同作業」
今回のプロジェクトを通じて最も感じたのは、Manusとの開発は単なる「AIに命令する」という関係ではなく、本当の意味での「共同作業」だということです。
私が問題を伝え、Manusが解決策を提案し、それを試した結果をフィードバックする...このサイクルを繰り返すことで、一人では難しかったプロジェクトを完成させることができました。
特に、Windows APIのような複雑な領域では、Manusの知識と問題解決能力が大きな助けになりました。
もし皆さんも「あったら便利だけど、作るのは大変そう」というアイデアをお持ちなら、Manusに相談してみることをおすすめします。きっと素晴らしい共同開発体験ができるはずです!
皆さんも、日常の小さな不便を解決するアプリ開発、Manusと一緒に挑戦してみませんか?
Discussion