> ただ、64bit版本体で起動直後の kbGuru2SMF.kpi の再生や、kbdmusic.kpi → kbGuru2SMF.kpi の切り替え後の再生が出来ないことが有りました。
検証ありがとうございます。
私も確認していて、手元の最新版では解決済みでした。原因となる箇所はご指摘の通りです。
後で気づきましたが FreeLibrary 時のフリーズは、スリープ時にデバイスを閉じるスレッドだけ
でなくて Port.cpp 内で作成したスレッドも関係してますね。
> 解放処理用の関数をexportし、FreeLibrary() の前に呼ぶのは解決法として間違っていないと思います。
何度考えても他に良いやり方が思いつきませんでした。
あえてやるなら、GGS4CloseDevice を呼ぶ度に内部で作成したインスタンスを破棄すること
でしょうか。そうすると GGS4CloseDevice を呼び出した後は GGS4GetSmfInformation 等の
結果も破棄されてしまうので、そうならないようにきちんと対応しようとすると結構大変
そうです。
VS2022 でビルドしたものだとフリーズは確認出来ないのですが、多分偶然だと思うのですよね。
API の新設以外に解決手段がないなら、公式版 GuruGuruSMF4.dll のパスを設定して使用出来る
ようにする現在の仕様は危険なのかもしれません。
手元の最新版では複数のインスタンスを同時に作成可能な作りにしてみました。
それ用の API を DLL に新設しなければなりませんが。
公式版があえてインスタンスを1つしか作らずに使い回すようにしてるのは、
デバイスを開く処理が何度も行われなくする為なのだろうとは思いますが、
ちょっと使い辛いんですよね。
インスタンスの使い回しは DLL を使う側で工夫してやれば良いかと思って。
でも苦労した割にほとんどメリットがないことが分かってしまいました。(笑)
64bit 版の本体から使う分には意味ないですし、32bit 版でも今の本体の仕様だと
やっぱりほとんど意味がないです。
演奏プラグイン仕様にフェードアウト用の API を追加するか本体が SetVolume を
駆使してフェードアウトを行ってクロスフェードに対応すれば 32bit 版でだけ意味
が出てくるかもしれないです。
記事編集