■プロフィール

うなちょ

Author:うなちょ
うなちょのほんわか日記へようこそ

RagnarokOnlineと、PC版Minecraft++Forge+MODで
遊びつつ、片手間でWindowsのソフト作って遊んでます

■最近の記事
■最近のコメント
■最近のトラックバック

■月別アーカイブ
■カテゴリー

■リンク
■RSSフィード
■ブログ内検索

うなちょホットライン

うなちょへ直接連絡したい場合は、こちらから。
うなちょのPCメールへ着信するので、比較的
レスポンス早いかも…?(5分周期でチェック中)
※E-Mailですので、メルアドがある方のみです
※うなちょの携帯に転送する方法は、直接聞いて
  くだし。
無料アクセス解析
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | --:--:--

でーけたでけた、ようやくできたー
しばらくリアルの自由時間をROとプログラムに費やしていた訳ですが、
ようやくアプリが完成しまんた。

20110223_01.png
このアプリは、2台のPCのライン出力を1つに纏めようとしたのが始まり。
ダイソーで購入したステレオミニジャックの分岐ケーブルで、PC2台の
音を1つのイヤホンに纏めるということをやってみたら、どうもライン
出力がもう1つの方に入力されているというか、どうやっても音が低く
なってしまう。
まぁ、電気関係やってる人なら判るんだろうけどなぁ。

んで、うちはどう解決したかというと、このアプリなのだ。
メインPCはROやっていても、比較的CPUパワーが余ってる。さらに、
もう1つのPC(UMPC)側はROやっている最中は起動してるだけで何も
やってない。ならば…メインPCで鳴っている音を録音して、それを
ネット経由でUMPCに送ってそちらで再生させたら…?っていうのが
作る原因となった。

ここでポイントがいくつか。

1)プロセスレベルを変更するよ!
こいつ、起動した後はプロセスの優先度が普通になってるんだけど
(通常プロセスは通常で起動する)、録音・再生が始まるとリアルタイム
まで優先度を上げて処理をする。停止させると、普通に戻る。
これは、録音と再生の音ラグを極限まで減らすための方法。
最初、開発中はデバックモードでコンパイルしていたんだけど、
デバック用でコンパイルすると、エラー検出のために目に見えない
余計なことをやっている為、えらく遅延した。大体200mS位。
前に作ったIP電話なら余裕で許されるけど(因みに固定電話~携帯電話
のラグはほぼ1秒程度あるよ?)、こいつはライン出力を1つに纏める
という発想が原点だから、遅延は極力許されない。
なので、リアルタイムという、Windows上でほかに影響が出てしまい
そうなレベルまで上げて処理をさせる。
なお、プログラム内部は処理しない時はCPUパワーをほかにまわす様に
してあるため、動画やROやりつつリアルタイムレベルまで上げても、
問題はなかった。ただし、BGM鳴らしつつRO起動したら、起動パワーに
大分とられて、遅延が恐ろしく高くなったが…。

2)UDP通信だから、音が抜けるよ!?
通常、動画とかのストリームデータはTCPで再送したりするのだが、
こいつは再生よりリアルタイム性を優先させるため、UDPを使って、
データ欠損しても気にしないで動く様にした。
再送させても録音からの経過時間が結構長いことになってしまうので、
音としての価値は無いと割り切った結果。
ただし、UDPも1つ欠点があって、一方向でデータを送り続けると、
ARPという、IPアドレスからMACアドレスを取得するプロトコルが、
一定周期で動く(大体10分程度だっけかな…)のだが、これ規格上は
最新1つのUDPデータを確保しておけばいいということになっていて、
ARP処理中に送信しようとしたデータは消えていくのだ。
なので、一定周期でデータ欠損が発生する。
一応、サーバ側でシーケンス番号をチェックしていてデータ抜けは
判る様にしてはあるのだが…あまり意味ねーなw

3)PC性能に応じて、サンプリングを設定できるよ!
デフォルト、つまり現状では25mSごとにデータを取得できる様に
バッファサイズを切って処理させている。
このため、48kHzステレオ16Bitだと、通信が25mS毎に発生し、スルー
プットが192kByteになる。普通のPCなら問題無いのだが、相手が
UMPCのため、結構気を使うスループット。
なので、他に44.1kHz、24kHz、22kHz、16kHz、12kHz、11kHz、8kHz、
4kHzでそれぞれ8/16ビット、モノラル/ステレオを選べる様に
してある。但し、25mSで割り切れないレートは表示されない。
設定ファイルを直接編集すれば25mSでなくて50mSとかも可能だけど、
これにすると11kHzは出なくなる。割り切れないから。
(11kHzは正しくは11,025Hzである為、余り25となってしまう)
まぁ、電話で4kHz(音声が2kHz程度なのでサンプリングの法則で2倍
して4kHzでサンプリングする)だし、ラジオで11kHzらしいから、
22kHzでも、聞くだけなら問題ないんだけどね。
これにするだけでも、44.1kHzから比べればスループット半分になるし。


まぁ、なんだかんだでまだうまく動かない所とかあったり、まだ
手抜きをしている所もあるけど、一応動くので、しばらく使って
不良を出しておこう。


|ω゚)ノ しばらくはこれの改造だなー


┗【作ってみた(?)】 | 00:06:44 | Trackback(0) | Comments(0)

コメントの投稿

管理者にだけ表示を許可する

FC2Ad

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