「NeoMupl」に関する日記(5)

<前 次>

無題

オプーナやってました。
今日のところはストーリーのほうはそっちのけでお掃除。
スナイパーじゃなくてスイーパーです。

NeoMuplの開発を進めてました。
多重起動の防止について考えていたのですが、やっぱり単に起動を禁止するんじゃなくて、前に開いていたウィンドウを前面に出すようにしたほうがいいかなと思って、だったらミューテックスを使うよりウィンドウを検索したほうがいいだろうと考えて、FindWindowに相当するものを探していたのですが、面倒くさくなって別の部分をいじってました。
で、新再生DLLを呼び出すクラスをとりあえず作っておいて、呼び出されるDLL側も、インターフェースだけは作ってしまいました。

無題

NeoMuplのDLLを作ってました。
最初DLLとEXEファイル(プログラム本体)のファイル名が同じでDLLが読み込めないという問題が起こりましたが、ファイル名を変更したら何とかなりました。
とりあえずDirectMusicの初期化と終了処理は完了、MIDIポートの列挙もできました。
.NETのSystem.Guid構造体とDirectXで使っているGUID構造体の対応がどうにもうまく取れないので、GUIDをラップするクラスも作ってみました。

無題

ふーむ。
NeoMuplの旧形式の再生クラスから専用DLLを呼び出す新方式のクラスにスムーズに移行するために共通のインターフェースを作っているところなんですが、あまり使ったことがないので少し難航してます。

無題

NeoMuplのDLL作ってました。
DirectMusicPerformanceの初期化なんですが、IDirectMusic8のインターフェースポインタを取得するのがやや面倒なようです。

無題

NeoMuplの安定性を増すためのDLL作成の続きをしていました。
再生オプション系は再生開始時にまとめて渡すようにして再生中は取得のみできるようにしておこうかな。
途中でオプションが変わるとややこしくなるし。

無題

NeoMuplのDLLを作ってました。
DirectSoundでもどの部分をどう使うのかが分かっていないので、DirectSoundを使うDirectMusicも並行して組み込んでいました。

無題

NeoMuplDLL初期化の方針。DirectShowとDirectMusicを使うと仮定して。MCIはまた対応はずすかも。

  1. バックグラウンドでDirectSoundを初期化。これは両方に必要。
  2. DirectShowとDirectMusicのどちらを先に初期化するか決める。デフォルトはDirectShowで、再生キューにDirectMusic使用曲が先に入っていたら順番を入れ替える。
  3. DirectShowを初期化。
  4. DirectMusicを初期化。

…としたいんだけど、メインスレッドと別のスレッドで初期化だけしてもいいのかな。
場合によってはアプリケーション本体用スレッドと再生専用スレッドに完全に分離するかも。

無題

今日は父が古いパソコンの調子をよくするためにメモリを増設しようとしたのですがうまく合わなくて、今使ってるのに入れたらしっくりきたので貰っておきました。
なんとなく起動が早くなった気はするけど…どうなんだろう。

NeoMuplについては、C++でのプロパティの扱いが分かってきたので音楽再生に必要なデータはクラスのプロパティに入れることにしました。

無題

引き続きNeoMuplの再生DLL作ってます。
今度のDLLは再生全体を担い、再生にかかわる部分はDirectMusicの部分だろうとDirectShowの部分だろうと受け持ちます。

無題

勢いでステータスバーも拡張してまたバージョンアップしました。

無題

とりあえず誤動作とかはなさそうなのでNeoMupl最新版アップしました。

無題

今日はNeoMuplの改良を行っていました。
ひとつはウィンドウ位置を次回起動時に復元する機能、もうひとつはウィンドウのタイトルをカスタマイズする機能です。
再生関連は不安定なので全体的に作り直します。
そのため、しばらくは再生関連での細かい改良はありません。

無題

で、いろいろ試した結果、いじればいじるほど、再生が重くなって、音が出なくなって、エラーが出るという結果になったため、いったんプレイヤーを以前のバージョンに戻しました。

あと、サイト全体のスタイルシートを微調整しました。

無題

で、この『改良』を行ったところ、起動の重さはそのままに、初回再生時も重くなって、おまけにしばらく使っていると落ちる問題は健在という有様になってしまいました。
う~む、困ったのです。

無題

NeoMuplがエラーを起こすのは、ずっと再生し続けていたときだけで、1回目の再生時にいきなり落ちたことは確か一度もありません。
なので、可能な限り再生ごとに起動時の最初の状況になるように、内部的に使用しているプレイヤークラスを毎回作り直すようにしてみました。
ただ、エラーが起こらない環境もあると思うので、そのような場合にはオプションで前のプレイヤーを使いまわすようにするつもりです。

無題

さて、自分でコーディングしてない部分だから対応できないとは言ったものの、間接的にせよ影響があるからこそ私のプログラムで強制終了が発生するわけで。
エラーの元凶は次の例外です。

System.ComponentModel.Win32Exception: 現在のプロセスが Window Manager オブジェクトのハンドルのシステム許容範囲をすべて使用しました。
これが原因だとすると、何らかの形でリソースリークが起こっている可能性があるわけです。

無題

NeoMuplは例外最終処理を入れたにもかかわらず例外ダイアログを出さずに落ちまくります。
しかし、落ちる前に何とかログは残してくれていたので、落ちる直接の原因は分かりました。
ただ、それが自分でコーディングしていなくて手の出しようのない部分だということも分かったのです。

アンパンマンDBにコメント機能を搭載しました。
今回はユーザーの投稿をデータベースに格納するので、ちょっとセキュリティにいつもより気を遣っています。

無題

NeoMuplをバージョンアップしました。
前からちょくちょくいじっていたのですが、アップするのを忘れていました。
いまだに不安定なためにエラー処理が中心の更新ですが、今回でエラーにはかなり強くなったと考えています。
エラーと何の関係もないところでは、フォルダ順にしたときの並べ替え規則を変更しました。
今までは拡張子まで含んだファイル名で比較していたため、文字コードがピリオドより前に来る文字が入っていたら直感に反する並び方になってしまうことがありました。
なので、今回からは、いったん拡張子を含まないファイル名でも比較するようにしました。
フルパスでのソートに関しては今までどおり拡張子のピリオドも比較の対象にしています。

<前 次>