スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ないなら作る

サウンド前書いた仮想サウンドデバイスでドライバはvadplusといういいドライバがすでにあったのですが、さらにスピーカーに転送するソフトでいいものがみあたらなかったので自分でつくってみた。

最小化でタスクトレーに入る常駐ソフト。
ワタシの環境ではないと困るくらいのものなので、急ぐということでGUIはC#で作ってみた。

内容としては
任意の入力デバイスから接続可能な出力デバイスひとつにサウンドを転送するというもの。
出力がひとつのみの選択だとヘッドホンを接続した場合にいちいち手動で切り替えないとならず、それではめんどくさいので、出力デバイスに優先度を付け、各デバイスの状態を監視し、1番が接続可能なときは1番と入力をつなぎ、1番が接続不可の場合は2番と入力をつなぐ。
これでXPのようにヘッドホンを接続するだけでスピーカーからヘッドホンへ音が移動します。
また、APIで取得できるデバイスは現在接続中のデバイスのみで、これではヘッドホンに優先度を与えることはできないので、検出したことのあるすべてのデバイスを記録し、検出できていない場合もそのデバイスを選択できるようにしてあるので、ヘッドホンを接続しない状態でアプリを起動したらヘッドホンを選択できない、なんとことはおこらない。
接続可能なデバイスの中からチェックをしたもので、優先度の高いものが出力に使われる。

アプリひとつではWaveIOを使用中に使用中デバイスをひっこぬくとメッセージループが来なくなり、そうなるとWaveIOの操作がすべて受け付けられなくなるので、実際の音声転送は別アプリで行っていて、こちらはC言語で書いてあります。
GUI側でデバイスの変更を検出した場合は転送アプリを強制停止し、新たな設定を与え再起動させている。ただデバイスのぬきさしを行うと二つのアプリ間で同じデバイスが別のIDで見えることがあるようで、仕方ないのでIDではなく、デバイス名で情報をやり取りしてみている。

そんなこんなで外見上はデバイスの変更を検出し、出力先を自由に変えているように見える。
(実際は別アプリがWaveIOでエラーがでて止まっていたり、強制停止したり、いろいろやってる。)

多重起動も可能で、そうするとひとつのデバイスの音を複数の音に飛ばすこともできる。
スピーカーとヘッドホン、ふたつ同時に同じを音を出すこともできる。


これでようやくステレオミキサー機能らしきものが使えるようになりました。
ステレオミキサーがないからって録音をあきらめるのはまだはやかった!
サウンドカードなんてなくてもソフトでなんとかできる!
vadplusっぽいのも自作したいなぁ。


あとこのアプリ転送できて、録音と同時にヘッドホンから音をだせるのはいいんだけど、
WaveInとかWaveOutでのバッファのやりとりとかの都合上、0.4秒とかそのくらいのラグが発生する。
まぁすごく遠回りして音を出力してるわけだからなんとなく、こんなもんかなぁ、とは思えるけど、目標はラグなし。

ドライバレベルで作り直せばできるのかなぁ。

コメントの投稿

非公開コメント

Go To 物置。
プロフィール

書いてる人:つん

まったりのんびり。書いてる人の息抜きブログです。

多分連絡先↓
metal_tsun@yahoo.co.jp

カテゴリー
リンク
月別アーカイブ
バロメーター
Java歴:2005年2月から今まで。
3DCG歴:2005年8月から数年。
C歴:2006年4月から今まで。
VB歴:2007年3月からちょっと。
Delphi歴:2007年3月からちょっと。
PIC歴:2007年5月から数年。
イラスト歴:2007年12月から今まで。
DTM歴2008年2月からちょっと。
PHP歴2008年4月からちょっと。
C++歴2008年4月から今まで。
C#歴2009年1月から今まで。
Objective-C歴2009年4月から今まで。
CSS歴2012年5月から今まで。

ブログ開始日2005/10/11


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。