SSブログ

skype crash [VGC-RM95S]

"bcdedit -debug on" の状態で skype をインストールすると、起動時に Kernel から応答がなくなることが判明した。同様の現象が tomshareware.com でも報告されていた。

リバースエンジニアリングのブロックかもしれないが、純粋にドライバを開発している技術者にとっては、不快感を感じる。同様の現象を体験された方の参考になればと思う。

Bluetooth Feature Pack 5.0.14 [VGC-RM95S]

CSR Plc. の Bluetooth Feature Pack 5.0.14 64bit 版を VGC-RM95US に入れてみた。これで A2DP の Source 側になるので Streams Jockey をいれた VGC-RM95S が A2DP の Sink 側になり、さらに VGC-RM94S のスピーカで流してみた。

csr_help.png

VGC-RM95S がオーディオ出力 Bluetooth Audio Renderer のデフォルトとして設定できる。

A2DP_sink.png

これで Radiko の音声や YouTube のサウンドを 44.1kHz Stereo で録音できることになる。

streams_jockey_003.png

我が Streams Jockey は、この Feature Pack の反対の機能を実現しているこになるので試験相手としてちょうどよい。Skype は HFP でうまくいかなかったので HSP でやってみよう。応用範囲が広がってきた。

続きを読む


Play A2DP - Timer Driven vs. Event Driven [VGC-RM95S]

A2DP の再生方法を Timer Driven と Event Driven でかなり比較してみた。ローカルのファイルを再生している場合は違いは出てこない。しかし Stream 転送して再生する場合は Timer Driver は不安定になる。何度やっても同じなので、手間はかかるが Event Driver の方が安定している。

[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]

自作ドライバと MyMobiler 1.25 との共存をチェックしてみた。MyMobiler は ActiveSync を使っている。結果からいうと、あっさりと動作した。これで 3つの HFP Device が並ぶこととなった。

MyMobiler_001.png MyMobiler_002.png

この状態で天気予報を聞いてみた。続いて、お気に入りの曲を聴いてみた。

MyMobiler_011.png MyMobiler_012.png

MyMobiler がサクサク動けば、申し分ないのだが。

KMDF VeriSign Code Sign [VGC-RM95S]

VeriSign の証明書が入手できたので RM95S の ALPS のチップで SCO, A2DP のドライバをテストしてみた。まず、インストールであるが cat, sys, inf を取りそろえて ドライバ登録と更新という手順でおこなった。

(1) VeriSign からインストールされた証明書は PFX 形式を export することで使用する。
(2) インストールの警告は、以下のようなものが表示された。

install_001.png

(3) デバイスマネジャでも署名ありとなった。

install_002.png

(4) ALPS のチップが古いので SCO は問題ないが A2DP は音が飛んでしまうが Linux の HF console よりはよく持ちこたえている。

試行錯誤で一時はどうなるかと思ったが、なんとか目標まで到達した感じである。

HFP A2DP における SDP [VGC-RM95S]

MS STack を使った場合 SDP への登録が WinSock レベルと A2DP, SCO からの登録の3種類が発生している。
SDP_001.png

さらに Windows Mobile が登録された時に自動的にインストールされる ActiveSync との連携が、どうもうまくいっていない。Windows Mobile 側で個別にサービスを選択しておくと、問題ないが全部を ON にしておくと期待どおりにならない。カーネルレベルで追跡する必要がある。

HF console 0.4 [VGC-RM95S]

Bluetooth MS Stack で SCO と A2DP を切り替えるようにしたバージョンを作ってみた。ドライバー側の耐久性は問題ないが WaveOut の切り替えでつまづいた。

HF_console_04.png

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 ではうまく通らない。いよいよ自作の "ワイヤレスステレオ" も山場となってきた。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。