スポンサーサイト

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

DirectSound

どうにも再生ラグが消えなかったので、いろいろネットで調べたところWindowsXP時代ではWaveIn、WaveOutのラグが大きい、とのことでした。
Vistaではこの辺の仕様が全面的に改善されていてラグは少ないようですが、WaveIn、WaveOut自体ラグは付き物なのかもしれません。となればプログラムではどうしようもない。

現在50分の1秒のバッファを20個程度用意し、1個録音完了したら即再生、再生終了したら即録音バッファに登録をループさせていますが、録音完了から再生終了までバッファ10個分はないと安定動作しないので、ラグは50分の1秒×10、つまり0.2秒以上はありそう。(他のプログラムの動作で再生動作が遅れた場合録音バッファが増加してしまうのでバッファが一定以下になるようにしてる。)
この0.2秒ってのはバッファサイズを100分の1にしてもそうなってしまうことからイベント発生に遅延がある予感。

それが仕様なら別の録音再生手段を使うしかないわけで。。
DirectSoundの登場ですな。
まだ仕様とか全然わかりませんが、一度試してみたいですねー。


■公開について
雑な作りなので公開したら不具合たくさん見つかりそうな予感。
音転送やってる実プログラムの方はGUI側で強制キルされることがあたりまえに行われるわけですが、このとき音転送プログラムのメモリ放置。OS側がなんとかやってくるけどなんか不安。
まぁ動作中はメモリ確保なんてしないのでリークはしないですが、メッセージを渡してしっかり終了させたいなぁ。GUI側もかなりお粗末。

そんなこんなでまだ公開できません。
(この手のアプリは山ほどありそうだし。)

物置

気づいてる人多いと思いますが物置サーバーが落ちてます。

物置のサーバーは鯖持ちの後輩からレンタルしてるもので、その後輩の都合で一時的に鯖が落ちるとのことです。復旧はいつになるのやら。復旧しないってこともあるらしいので、なんか別な鯖でもみつけないとなぁ。iRemote公開する場所がない!

phpとかガシガシ、でもないですけどほぼphpで書いてたサイトなのでphpないと厳しいかなぁ。
せっかくアプリをdocomoじゃないとアクセスできなくしたり、いろいろ遊んでいたんですがね。

htmlでもなんでもいいのでとりあえずiRemoteくらいDLできる場所確保してみます。
アカウント持ってる忍者ツールでいいかな、

http://kannimonooki.at-ninja.jp/

ってさっそく用意。ページは気が向いたら作る。


ってか結局キャンプから帰ってきたあとサウンドアプリをつくっててiRemoteに触れてない。
まぁバグとってさっさと公開しよー。

ないなら作る

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

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

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

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

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

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


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


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

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

[iRemote]サービスとして起動[sexe]

窓の杜を除いてみると通常プログラムを強制的にサービスとして立ち上げる『sexe』というアプリケーションが紹介されていました。

軟式』さんが公開しております。

さっそくiRemoteでも使えたら便利ねってことで早速試してみました。
.NETで組んだプログラムも動くのか不安でしたがものは試し。
sexeを起動し、ファイルにiRemote.exeを指定して、自動起動、デスクトップとの対話も許可。
iRemoteはデスクトップと対話しまくるソフトですからこれは必須。
そして起動。

すると今まで通りにiRemoteが起動し、あとはいつも通りやると無事リモートができることが確認できました。すごいぜsexe。iRemoteを終了してもsexeの力で強制復活するので、万が一落ちても平気。
ただ、普通に起動しちゃうのでiRemote側は起動時にすぐ開始にチェックをいれ、またすでにスタートアップに登録している場合はsexeによる起動と衝突するのでスタートアップの方は削除。
これでiRemoteをサービスとして利用できるかと思います。

ただログオフ時に操作できるかは未確認。できなかったら残念。
動画モードで音がでるのかも試せていません。一回ログオフしたら音でなくなるとかあるかも。
そういうときはリモート操作でiRemoteサーバーを終了させると直るはず。(sexeにより即復帰するので再ログインすればOK)

サービスとして起動してもGUIによる設定の変更はできる模様。
GUIのあるものはサービスとして起動できないのかと思っていたけど、本当大丈夫なのか気になる。
しかしiRemoteがサービスとして登録されてるし、、うーむ。(登録されている実体はsexe側)

■追記
実際には実家から離れていて試せないですけど、ログオフしてみた。
すると、一瞬アイコンが消えるけど、すぐ復帰し、それが見えた直後ログオフが完了。
ログオンすると常駐アプリが他が起動していないときにすでにiRemoteのアイコンだけは最初からありました。

これはいけるのでは、、、ゴクリ

仮想サウンドカード

iRemoteで動画モードを試していたら音がでないことに気がついた。
原因はステレオミキサーをオンにしてないからだと思い確認したところ、
なんとステレオミキサーが存在しないことが判明。

MacBookはイヤホンとマイクの端子が共有だったりといろいろ特殊らしく、
そんなことがいろいろあってWindows側ではステレオミキサーが使用できないような。
よってデフォルトでPC上でなっている音を録音することができない。
端子共通により端子をふたつ物理的につなぐということもできない。


そこで思いついたのが仮想サウンドデバイス。
OSの出力設定を仮想サウンドデバイスに入力させ、その仮想サウンドデバイスから音を取り出し録音することができるのでは、と考えました。


ぐぐったところ実在するようで、仮想サウンドカードが存在しました。
Virtual Audio Cable」というもの。
試用版は無料で使え、
OSの出力先に設定できる仮想スピーカーにいれられた音声をそのまま対応する仮想マイクに転送するドライバと、好きな入力から入った音を好きな出力から再生できるアプリケーションのセットです。

まずドライバを導入するだけで録音が可能になりました。
Vista側で既定デバイスを仮想スピーカーにあわせ、サウンドエンジンなどで入力に仮想マイクを指定すれば録音が可能になります。
ただVistaは別な音を別のデバイスから再生することはできても、同じ音をすべてのデバイスから鳴らすことはできず、結果的に録音するときはスピーカーから音はでないということになります。

そこでセットのアプリケーションを使います。
仮想マイクに入っている音を実際のスピーカーに転送。
これで録音と再生が同時にできるようになります。
ただし、試用版ではドライバに音がはいったとき、定期的に「トライアル」という声がミックスされるようになっており、常用はできません。。。

そこで、仮想ケーブルともいえるドライバと同様の働きのあるドライバを検索。
vadplus」というものを発見。用途もぴったりステレオミキサーつき仮想サウンドデバイス。このドライバは確認したところVirtual Audio Cableのドライバと同様の働きをしていることがわかったので、こちらを採用。もちろんトライアルという声は入りません。

以上の便利な便利なソフトを用いることで、ステレオミキサーが存在しない、マイク端子も存在しないようなハードに、ステレオミキサーのあるサウンドカードと同等の機能を追加することができるようです。



仮想デバイスからの入力をiRemoteで拾えるのか一瞬不安でしたが、問題なく拾えてます。
ステレオミキサーがなくてiRemoteに音を転送できなかった人はお試しあれ。
この方法はスピーカーからの出力を完全に切った状態でもiRemoteに音を転送できるのでその点でも便利。vadplusすげー。

(XPの場合はマイクの音声をスピーカーで出力する設定があるのでVirtual Audio Cableは必要ないかも。どちらのソフトも仕組みは理解できたのでいつか自分でも組めればいいなぁ。VACが常駐アプリでないのでウィンドウが邪魔。マイクからスピーカーに音を転送するくらいはできるかも。ドライバ自体にスピーカーから音を出す機構もいれれば外部アプリ不要で通常のステレオミキサーに見えるのでそれもいいかも。どれにせよ修行が必要w)

[iRemote]バグ取り中

ある程度機能がそろってきたので公開の準備中。
16,17とキャンプにいくので、そのとき車中にでもアプリのテストを行って、
バグがないことを確認した上に18くらいに公開します。

機能的には領域限定モードと音声操作モードは非搭載。
ファイル転送も非搭載になります。

今回のバージョンアップでメインになるのは、
キー配置のカスタム、任意のカスタムコマンド送信機能。
その他は細かいところばかり。

中身はかなりの部分が変更になっているため、これまでになかったバグが沸いてくることが予想されます。○○と設定すると応答がなくなる、とか、画面の更新がされないがマウスの位置はPC上で更新はされる、とか、メニューのこのボタンが押せない、とかそんなことがおきる可能性があります。

バージョンは中身の変化具合と機能の追加具合から0.8から0.9になります。
1.0になるのは未実装機能をすべてそろえてからになる予定。


■0.8.9⇒0.9.0変更点
・キー配置を変更できる(12キー)
 ・カスタム特殊コマンドも割り当て可能
 ・マウスセンターボタンドラッグ、クリックなどを追加
 ・動画モード、音声モードへのショートカットも追加
・任意の特殊コマンドを設定、送信できる(12個まで)
・メニュー構成変更
 ・キー配置の変更メニュー追加
 ・特殊コマンド送信用の設定メニュー追加
 ・領域限定モード、ファイル転送の項目追加(内容は未実装)
 ・メニュー窓のデザイン変更
・動画メニュー構成の変更
 ・リモートモード中で動画モード設定、音声モード設定の変更ができる
・通信間隔に自動を追加
 ・画面の変化が少ない場合は通信間隔を大きめにする
・拡大縮小アニメーションの動作を変更

・ウィンドウフィットモードでPCの解像度がケータイを下回る場合、カーソルがPC画面外にでれるバグを修正

[iRemote]キー配置カスタム

iRemoteダイヤルキーカスタムが動作するようになってきたのSSを。
画像のメニューがデフォルトの状態。上下キーで項目移動、右左で内容切り替え。適用を押すことで初めて反映されます。特殊コマンドのメニューでは項目を選択でそのコマンドを実行できましたが、このメニューではできません、あくまで設定だけ。メニュー非表示時にこの配置になってるわけだから、選択できる意味もないと思う。。多分。

この機能がつくことでスクリーンショット配置してエンターを配置したり、動画とアクティブウィンドウを取り除いて操作特化の配置にカスタムするのもよいかもしれませんね。拡大率100%もスライダだけおいとけば変わりになるし、まぁいろいろ。


■拡大アニメーション
拡大縮小で大きく拡大率を変えた場合のアニメーションがしょぼいと思った。
ケータイ画面に大してカーソルの位置が動かないようにアニメーションさせるのが綺麗かな、と。
iPhoneぽくしたい。

[iRemote]内部命令の見直し

マウスアクションのバリエーションを増やす関係で、現存の命令送信では対応しきれない部分がでてきた。送信するメッセージ自体に右クリックなら右クリック固有の命令がなくてはならなく汎用度が低すぎるのが問題。

また、マウス、文字入力、その他の命令がそれぞれ独立することが問題なども問題で、これら3種の命令は同時に送信可能であったが、これはほとんど意味がない上にソースコードの複雑化もひどくなってきた。

また、スタックを設けて入力データを取りこぼしなくすべて送信するかの仕様は3種によりまちまち。
スタックがない場合は送信前に同種の命令を渡すと上書きされ、先に入った命令は送信されずに消えてしまう。

これをどんな命令もかまわずスタックにいれるようにして、取りこぼしをなくし、また統合することでソースの簡略化を図る。
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。