DLNAスピーカーと戯れるまだ、戯れるどころか翻弄されているだけだが、メモ。UPnPライブラリで変更が必要な点(DLNAのプロトコルがわからないため、サーティフィケーションできないので、UPnPライブラリとしては正しい動作の可能性がある、というか動作しているはずだから難しい。オープンクラスで良かった)。UPnP::SSDP会話用のUDPSocketを239.255.255.250のメンバーシップにしているが、少なくともスピーカーはソースIPアドレスに対して応答を返している。したがって、IP_ADD_MEMBERSHIPを呼んではならない。SSDPポートはWindowsでは他のサービスに食われている(ようだ)。M-SEARCHを送信したIPアドレスにレスポンスを返すので、ポート1440にバインドしないでエフェメラルポートを利用する。これってM-SEARCHのHOST変数を無視しているってことなので、スピーカーの実装ミスなのかDLNAの仕様なのかは不明。address.としている。したがって、ONKYOの実装は正しい。Socketと異なるのかも知れない。UPnP::Control::Service#parse_service_state_tableスピーカーはstateVariable要素のCurrentTrackDurationに対してdefaultValueとして00:00:00を返す。したがって、以下の行でエラーとなる。endまた、default.txtが空要素の場合があり、この時、text属性にはnilが入るため、無条件にstripを呼ぶと例外となる。以下のように修正する。US-ASCII&gtl;などのエラーになりまくり。default_externalをutf-8にしているのだが、REXMLは何を元にしているんだろう?(このあたりはまだ手をつけていない)。この場合、Content-Typeにはutf-8がセットされていて、かつopen-uriを利用している場合もSOAP4Rを利用している場合も、それは正しく認識している。特定のフラグメントの処理時にUS-ASCIIになる(それ以外はUTF-8)なのでわかりにくいことこの上ない。UPnP::Control::Service#method_missing1.9系では動かない。)だったが、こいつが、SetAVTransportURIの呼び出しでCurrentURIに、VirtualBoxのIPアドレスを設定してスピーカーに送り込んでいたことが判明。WMPにはサーバーのIPアドレスを設定する項目が無い......。いうわけで、WMPの役立たずっぷりがわかった。