2016年8月19日 (金)

Ver.1.5.6 リリース

以下からダウンロードできます。(Windows/Linux/Mac版)

https://github.com/funfun-dc5/qtbrynhildr/releases

Ver.1.2.8 修正時のポカミスが原因でネットワーク接続が切れた場合の再接続機能が正常動作しなくなっていました。

UACによる制御が入り強制的にサーバとの接続が切られた場合に自動で再接続しないので手動で「切断」-> 「接続」を行うか、Qt Brynhildrを再起動しなければならないことになっていました。

主な変更は以下です。

[不具合修正]
・ネットワーク通信の自動再接続処理が正常に行えない不具合修正(Ver.1.2.8からVer.1.5.6-RC1)

[その他変更]
・Qt5.7.0でビルドするように変更(Linux(x86)版のみ5.4.2のまま)
・Mac版の制限事項をドキュメントに追加


ポカミスの内容はクラスのメンバ関数宣言で派生先(子クラス)でオーバライド可能なメンバ関数であることを示す"virtual"を付け忘れていたという酷いものでした…。当然オーバライドされていて呼び出されていると思っていた処理が全然呼び出されていなかったというオチです。

Mac版では上記の修正ミス以外にBSD socketへの対応が必要でした。ネットワーク接続を確立する時にリトライを何度かすることがあるのですがBSDベースの実装では一度失敗したソケット記述子はcloseして新たにソケット記述子を取得して再度トライする必要があるのですね。一度失敗したソケット記述子は永遠に失敗し続けると…

WinSock2やLinuxでは一度失敗したソケット記述子をそのまま使っても問題なさそうです。

-----------------------------------------------------------------------------------
[SHA256SUM]
-----------------------------------------------------------------------------------
9bbad3803efcc9255091d8eff1bd41c53103e32714bea090cd8b00575e2afdb4 *QtBrynhildr-linux_x64-v156.run

c48e6dd724e3d302f3a6de037bc402ea9aced6ef4234277193bd1851e85c3199 *QtBrynhildr-linux_x86-v156.run

30144f5ba6bf4f1572c90bb9b306d4e82ede2f5003eed1fde618b6edad2b2a0d *QtBrynhildr-macosx_x64-v156.dmg

652e0c2e59b20ff1e6916053d6a7eca8159eeabfa18a3922e301c3543e0e18db *QtBrynhildr-windows-v156.exe

2016年8月 2日 (火)

CELTライブラリをビルドする その4

modeが0ということは

mode = celt_mode_create(44100, 256, &error)

という一文が失敗しているようです。失敗の原因はerrorに設定されて戻されるようなのでこの値を表示させてみると"-1"という値でした。

libceltのソースコードを眺めるとerrorという変数にはcelt.hに定義されているCELT_xxxxxという値がエラーコードとして設定されるようです。"-1"という値はCELT_BAD_ARGという名前で定義されていました。つまり、不正な引数が渡されているということのようですね。

READMEを読むと第二引数で渡している値256は開発中のテストでも利用されている代表的な値だと書いてあるので引数としては問題なさそうです。となると怪しい引数は第一引数の"44100"という値だということになりますがCDのサンプリングレートである44.1KHzが怪しいとは思えなかったのですが…

./configure --help でオプションをよく見ると、

--enable-custom-modes Enable non-Opus modes, like 44.1 kHz and powers of two

というのがありましたヽ(´▽`)/

結局以下のオプションを付けて、configure し直しました。

--enable-custom-modes --disable-oggtest

上記のように指定してもtoolsの下でmakeしようとするので、Makefileを手で修正しました。

SUBDIRS = libcelt tests tools

SUBDIRS = libcelt tests

makeして出来上がったlibcelt0.a と 2つのヘッダーファイル(celt.h/celt_types.h)を前回と同様にコピーしました。
これでサンプリングレートに44.1KHzも指定できるようになったような気がします。

(注)
前回必要と書いた celt_header.h は不要でした…

2016年7月11日 (月)

Ver.1.5.6-RC1 リリース

Qt5.7.0でのテストが主目的です。

以下からダウンロードできます。(Windows/Linux(x64)/Mac版)

https://github.com/funfun-dc5/qtbrynhildr/releases


主な変更は以下です。

[その他変更]
・Qt5.7.0でビルドするように変更(Linux(x86)版以外)

(*) Linux(x64)では Qt5.7.0 のインストールが必要です。

-----------------------------------------------------------------------------------
[SHA256SUM]
-----------------------------------------------------------------------------------
3a47416e2c15c6c01ebb04d62b91c13ec4fbbf1b7e9b022c5ca52d9c6e59f4e4 *QtBrynhildr-linux_x64-v156-rc1.run

3df8f27fcf3b67b3e72a069805f1404bbbc7dce057f930f14511981b5aaf2fce *QtBrynhildr-macosx_x64-v156-rc1.dmg

858e205681a4e7be8f4f09b643dfa007385d9f325d77ff7a669ed695c40cfe2c *QtBrynhildr-windows-v156-rc1.exe

2016年7月 9日 (土)

Brynhildr 2.0.7 がリリースされました

Lokasenna プラグインに対応した Brynhildr 2.0.7 がリリースされました。

Brynhildr「2.0.7」リリース

Lokasenna をダウンロードして、含まれる lokasenna.dll を brynhildr\plugins 下に配置すれば Lokasenna が有効になります。

Lokasenna「0.1.3」リリース(2016/7/9時点の最新)

私の環境だと60FPS近くの性能が出ています。

ただし、Lokasenna の機能は Windows8 以降のみで有効だそうなのでそこは注意が必要ですね。

CELTライブラリをビルドする その3

コピーしたヘッダーファイル・ライブラリファイルをインクルード・リンクできるように.proファイルに以下を追加しました。

# for CELT
INCLUDEPATH += ../libs
LIBS += -L../libs -lcelt0

CELTを正式に組み込む場合はもう少しやり方を考えたほうがよさそうですが、とりあえずこれでテストはできそうです。

CELTライブラリ関数を呼び出せるかを確かめるために、main.cpp に確認用コードを追加しました。

まずはヘッダーファイルのインクルード。

#if 1 // for TEST
// for CELT
#include "celt.h"
#endif
main関数の先頭に以下のように書きました。
#if 1 // for TEST
  int error;
  CELTMode *mode = celt_mode_create(44100, 256, &error);
  cout << "celt_mode_create : error = " << error << endl << flush;
  celt_int32 skip = 0;
  if (mode != 0){
	celt_mode_info(mode, CELT_GET_LOOKAHEAD, &skip);
	cout << "skip = " << skip << endl << flush;
	celt_mode_destroy(mode);
  }
  else {
	cout << "Ouch: mode = 0" << endl << flush;
  }
#endif // for TEST
44.1kHz用のモードを作成して、すぐ削除するだけの処理です。qmake を実行し、.pro の変更を反映させビルドすると正常にビルドは完了しました。CELTライブラリのリンクには成功したようです。

早速実行すると、

"Ouch: mode = 0"

と出ました…(;ω;)

2016年7月 8日 (金)

CELTライブラリをビルドする その2

通常出来上がったCELTライブラリ関連ファイルは

make install

すれば/usr/local下にインストールされるのでしょうが、MinGWを使うように設定したのですんなりとは行きません。

今回はQt Brynhildr のためだけに必要なものなので必要なファイルだけを手動でコピーします。まず、

make -n install

でインストール実行時にどのような処理が行われるかを確認します。

どうやら、libcelt下にある3つのヘッダーファイル(celt.h/celt_types.h/celt_header.h)とibcelt/.libs下に出来ているlibcelt0.aをコピーしてしまえば良さそうです。

というわけで、テスト用にsrcと同じレベルにlibsというディレクトリを作って、そこに上記4つのファイルをコピーしました。


cd libcelt
cp celt.h celt_types.h celt_header.h .libs/libcelt0.a ~/Src/qtbrynhildr/libs


あとlibcelt/libcelt0.laを確認すると

# Libraries that this one depends upon.
dependency_libs=' -lwinmm'

とあるのでリンク時に"-lwinmm"を付ける必要がありそうです。が、qtbrynhildr.proを確認するとすでに"-lwinmm"は設定しているので追加の設定は必要ありませんでした。

2016年7月 7日 (木)

CELTライブラリをビルドする その1

CELTライブラリの使い方の概要はつかめたような気がするので、実際にライブラリを Qt Brynhildr で使えるようにしたいと思います。

ビルド時に静的にCELTライブラリをリンクしてQt Brynhildr の実行ファイル内に取り込んでしまいたいので、まずはCELTライブラリのスタティック版ライブラリファイルを作る必要がありますね。

READMEを読むと

./configure
make

で出来ると書いてあります。が、これってUnix環境の場合ですよね。

configureスクリプトを使うためにはUnix環境が必要なので今回はCygwin(x64)環境でビルドすることにしました。ただし、Windows版 Qt BrynhildrはQt5に同梱されているMinGWに含まれるツール(C++コンパイラなど)を使って作っているので、CELTライブラリも同じMinGWで作る必要があります。

というわけで、Qt5に含まれるビルドツール(g++など)を使うように、PATH の先頭に

Qt5.x.x/Tools/mingw???_32/bin

を追加しました。

この状態で、./configure を実行しました。「テスト用コマンドを作るためにliboggの開発パッケージが必要だよ」と最後に表示されますが、とりあえず放置します。

config.log を確認するとQt5に同梱されているMinGWを見つけてくれているようですので、そのままmakeを実行しました。

しばらく待つとlibcelt/.libs の下に libcelt0.a が出来上がりました。 …がこのライブラリファイルは実際には使えず、再ビルドすることになります(;ω;)

2016年7月 3日 (日)

パブリックモード 7

パブリックモード 6 についてはIchiGekiさんから近日(そのうち?)公開予定とお聞きしていますが、さらにパブリックモード 7 の情報を頂きまして情報開示の許可を頂いたので記事にしてみました。

現在公開されているパブリックモード(モード5,6)ではデスクトップ転送はMotionJPEG、サウンドデータ転送はPCMに制限されていますが、モード 7 ではデスクトップ転送のVP8での転送、CELTによるサウンドデータ転送が可能となるそうです。

CELTだと音質は少し低下しますが、データ量が最大で10分の1程度になることもあるとか。

パブリックモード 7 に対応するサンプルソースコードもいずれ公開されるそうですが、テスト的にCELT対応してみようかと思います。

まとめるとこんな感じです。

Mode 5:MotionJPEG/PCM

Mode 6:Mode 5 + ファイル転送/クリップボード共有

Mode 7:Mode 6 + VP8/CELT

--------------------------------------------------------------------------------
[CELT]
--------------------------------------------------------------------------------

早速CELTのホームページを見てみました。

The CELT ultra-low delay audio codec

ホームページのトップには以下のようにあります。

—The CELT codec has been merged into the IETF Opus codec and is now obsolete—

2011年8月にCELT自体の開発は終了。CELTとSILKを併用する形でOpusとしてIETFで標準化、作業も2012年9月に終了 (RFC 6716として公開)したそうです。

CELT部分のみが対応できればいいので今回はCELTの最終公式リリースを利用します。

celt-0.11.1.tar.gz

CELTの概要がREADMEにまとめられているので目を通します。とりあえず、libceltの使い方を勉強するにはlibceltディレクトリ下にできるtestceltというコマンドを参考にすれば良さそうです。ソースコードはtestcelt.cです。

このコマンドは以下の様な処理を行うようです。

PCMデータ -> (CELTエンコード処理 )-> CELTのデータ -> (CELTデコード処理) -> (CELTを経由した)PCMデータ

BrynhildrクライアントはCELTデコード処理以降を行えばよいのですよね、多分。

流れとしては大体こんな感じでしょうか。

------------------------------------------------------------
[初期化処理:サーバ接続時]
------------------------------------------------------------
(1) celt_mode_create()でモード情報を生成

celt_mode_info()で必要な情報を取得しておく

(2) celt_decoder_create_custom()でデコーダを生成

------------------------------------------------------------
[サウンド再生:サーバ接続中]
------------------------------------------------------------
(3) celt_decode()でデコードし、取得したPCMデータをサウンドバッファへ転送

------------------------------------------------------------
[終了処理:サーバ切断時]
------------------------------------------------------------
(4) celt_decoder_destroy()でデコーダを削除

(5) celt_mode_destroy()でモード情報を削除

2016年6月27日 (月)

Ver.1.5.5 リリース

以下からダウンロードできます。(Windows/Linux/Mac版)

https://github.com/funfun-dc5/qtbrynhildr/releases


主な変更は以下です。

[不具合修正]
・フレームレート制御処理の不具合修正


-----------------------------------------------------------------------------------
[SHA256SUM]
-----------------------------------------------------------------------------------
33759acc4405a90f92d560962c4c9525add69d11c24f7aeea0acdd15960dbcae *QtBrynhildr-documents-20160626.zip

d5830957c5a03c7c4bbcf82395ff6cf9d14fb1f9b62354a4be4fd54a9f4c05ad *QtBrynhildr-linux_x64-v155.run

cfa2521f74af4772a94061fd3fd6de3b66adca7905a0ee1ed869a17b4cdcc63c *QtBrynhildr-linux_x86-v155.run

a0a2cb6ec0a228ca77cbb260e4ddedc50466757a9a9070e142f7ed5218f9da89 *QtBrynhildr-macosx_x64-v155.dmg

cde16cedadde4d2ecba558c6d7a08307eaa4cc42640f3746c317af94b06ec267 *QtBrynhildr-windows-v155.exe

2016年6月23日 (木)

フレームレート制御がマズイ…

Lokasenna の接続および性能の確認を行っています。

ネットワーク環境やサーバマシンの性能が十分であれば Lokasenna の最高性能である60fpsが出ることは確かめられたのですが、ふと1つの疑問が湧きました。

フレームレートの設定を 30 fpsに設定しても、表示されるフレームレートが全然30 fpsに足らないのです。これまで無線LAN + 少し非力なサーバマシンという思い込みで少々フレームレートが低いのだろうと勝手に納得していたのですが最大60fps出るので余裕のあるはずなのになぜか…

で、確認したら発覚しました。

Qt Brynhildrではフレームレートの制御を次のデスクトップ画像を受信するまでボケーと待つという方式で制御しています。つまり、ある一定時間ボケーと待って必要になったら受信を開始して描画するのですね。この一定時間の計算が不適切でした。

30fpsならば1秒間に30フレームだから30分の1秒ボケーと待てばいいかと単純に計算していたのです…

この待ち時間には調整が必要でした、つまりスレッドの基本待ち時間と1枚のデスクトップ画像の描画に掛かる時間を考慮しなければいけなかったのです(;ω;)

余計な待ち時間が長いため、結果設定したフレームレートをかなり下回る値しか出てこないという酷いオチでした。

30 fps と設定しているのに18 fps程度しか出ていないとなると、Brynhildrと比較して性能悪いよねというイメージは拭えないですよね…

調整した結果、設定したフレームレート相当の性能が出るようになりました。

PS.

feel a heartbeat ヘビーローテーション中です。

«Ver.1.5.4 リリース