音声データ保存と復元

プロジェクトの保存の際に起きていたことを調べると、次のことがわかりました。

  • 先に「チェックポイントエラー」と書いてしまっていた「CheckPoint Failure」は、すぐエラーということではなく、Islandの外のオブジェクトへの参照が入ってしまっている場合に、同じものに対するIsland外からの参照を探す処理(SnapshotTracer>>#gcTrace:label:)にとても時間がかかっているだけでした。辛抱強く待っていると処理が進みます。
  • 待っていると、今度は SampledSoundからポイントしている SoundBufferオブジェクトを IslandWriter>>export: で書き出そうとしてエラーになります。今のIsland/Projectの実装では、読み書きできる FarRef参照先のクラスは限定されていることがわかりました。(IslandWriter>>initialize でsplObjects に登録しているものが基本)これはプロジェクト保存がうまくいかない時の調査事項として役に立つ知見になりそうです。

このSampledSoundオブジェクトを自分のIslandに取り込んで near 参照すればよさげに見えるので、試してみます。

  • Island copy: で自分のアイランドにコピーするが駄目。なぜかSampledSSampledSoundのクラス変数として持っている音声ライブラリに登録されているインスタンス(deepcopy元)とdeepcopy結果が同じSoundBufferを参照しています。deepcopyが完全ではないように見えます。
  • しかたがないので、実験として、SampledSoundにあるインスタンスをいったん削除して near参照だけになるようにしてあげると、正常にプロジェクトが保存できました。またそれを読み込むこともできました。

ということでかなり苦労しましたが、(確実なdeepcopyの手法があれば)元々やりたかったことを実現できる目処が無事立ちました。