skype crash [VGC-RM95S]
リバースエンジニアリングのブロックかもしれないが、純粋にドライバを開発している技術者にとっては、不快感を感じる。同様の現象を体験された方の参考になればと思う。
Bluetooth Feature Pack 5.0.14 [VGC-RM95S]
VGC-RM95S がオーディオ出力 Bluetooth Audio Renderer のデフォルトとして設定できる。
これで Radiko の音声や YouTube のサウンドを 44.1kHz Stereo で録音できることになる。
我が Streams Jockey は、この Feature Pack の反対の機能を実現しているこになるので試験相手としてちょうどよい。Skype は HFP でうまくいかなかったので HSP でやってみよう。応用範囲が広がってきた。
Play A2DP - Timer Driven vs. Event Driven [VGC-RM95S]
[Timer Driven]
hEvRead = timeSetEvent(nInterval, 1, readEvent, (DWORD) NULL, TIME_PERIODIC);
hEvPlay = timeSetEvent(nInterval, 1, playEvent, (DWORD) NULL, TIME_PERIODIC);
[Event Driven]
case MM_WOM_OPEN:
a2dp_startWaveOut(hWnd);
break;
case MM_WOM_DONE:
a2dp_doneWaveOut(wP, lP);
break;
「MS Stack で A2DP Sink がすぐに出来ない」 や 「MS Stack で Bluetooth 3.0 は出来ない」 というブログをよく見かけるが、これらは誤解であるということを明記しておきたい。
MyMobiler 1.25 [VGC-RM95S]
KMDF VeriSign Code Sign [VGC-RM95S]
(1) VeriSign からインストールされた証明書は PFX 形式を export することで使用する。
(2) インストールの警告は、以下のようなものが表示された。
(3) デバイスマネジャでも署名ありとなった。
(4) ALPS のチップが古いので SCO は問題ないが A2DP は音が飛んでしまうが Linux の HF console よりはよく持ちこたえている。
試行錯誤で一時はどうなるかと思ったが、なんとか目標まで到達した感じである。
HFP A2DP における SDP [VGC-RM95S]
HF console 0.4 [VGC-RM95S]
Bluetooth MS Stack で SCO と A2DP を切り替えるようにしたバージョンを作ってみた。ドライバー側の耐久性は問題ないが WaveOut の切り替えでつまづいた。
WaveOut の終了処理は、以下のような手順がよいようだ。
for(k=0; k<BNUM; k++){
waveOutUnprepareHeader(a2dp_hWaveOut, &whdr[k], sizeof(WAVEHDR));
GlobalFree(whdr[k].lpData);
}
waveOutReset(a2dp_hWaveOut);
waveOutClose(a2dp_hWaveOut);
a2dp から sco に切り替えた時に、若干 a2dp の音が sco に流れてきているような気もする。もう少し調べてみよう。
Bluetooth コントロールパネル [VGC-RM95S]
複数の Bluetooth Stack を入れ替えているうちに "MS Stack" のコントロールパネルが explorer.exe から起動できなくなるケースがあった。
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\DeviceDisplayObject\InterfaceClass\{0850302A-B344-4fda-9BE9-90576B8D46F0}\Shell\Bluetooth\command]
この値が "MS Stack" の場合
@="rundll32.exe shell32.dll,Control_RunDLL bthprops.cpl,,1"
でなければならないが Toshiba Stack をインストールしてアンインストールすると
@="C:\Program Files (x86)\Toshiba\Bluetooth Toshiba Stack\ECCenter1.exe"
のままとなる場合があるようだ。アクセス権を変更すれば変更できるのだが、東芝さんの対応を期待したい。
SBC codec [VGC-RM95S]
A2DP --> AVDTP の最後のハードルは SBC Codec だった。T-01A の場合 Media Packet Header を含む Packet は 650 byte できている。しかし、割り込み処理レベルでは 256 + 256 + 138 の3分割できている。しかも、この間隔が微妙に開くことがあり、下手に wait すると Block してしまう。
カーネル内の Lock free circular buffer (Ring Buffer) に手を加えて Spin Lock しないようにしてみた。それでも、たまに音飛びが発生するが、個人的には十分なレベルだと思う。Decode 処理後は 3584byte となる。
これで 車載装置で実装される HFP と A2DP を MS Stack の KMDF で実装できた。
NVBTH212 (車載オデッセイ)
CLARION FB285BT (室内用車載)
VGC-RM95US (自作車載モドキ)
車載本来の閉じた空間で聞く方が、包まれる感じがして良い。それでも OS のカーネル内部で自作のドライバが動いているというのは、妙に満足感がある。
AVDTP_SUSPEND [VGC-RM95S]
手持ちの T-01A は L2CAP 上の AVDTP は signaling と media streaming だけの Basic Service でもいけるようだ。接続をおこなうと signaling の電文が以下の順番で飛んでくる。
AVDTP_DISCOVER
AVDTP_GET_CAPABILITIES
AVDTP_SET_CONFIGURATION
AVDTP_OPEN
AVDTP_START
この後、いきなり streaming data がくる。そうして
AVDTP_SUSPEND
が飛んで来て応答を返さないと、ご破産となってしまう。つまり SUSPEND 状態で待機して Media Player で再生を始めると SUSPEND 解除になるという流れであった。
後は ユーザランドで decode してスピーカに出ればよい。 HFP のようにマイクのハンドリングがないので多少気持ちが楽である。つまづいたのは unsigned char での bitfield である。
#pragma warning(disable:4214)
#pragma pack(push, 1)
#pragma pack(pop)
これらを明示しておかないと KMDF の build ではうまく通らない。いよいよ自作の "ワイヤレスステレオ" も山場となってきた。