SoundJS.play()メソッドを呼出してつくられるサウンドのインスタンスが消えない [Edit]

SoundJSクラスの静的メソッドSoundJS.play()を呼出すと、引数に定めたサウンドを扱うSoundInstanceオブジェクトがつくられ、サウンドが再生されます。ところが、再生が終わってもSoundInstanceオブジェクトはメモリから消えないようです。

01 SoundInstanceを特定するSoundInstance.uniqueIdプロパティとSoundJS.getInstanceById()メソッド

SoundJS.play()メソッドは、再生するSoundInstanceオブジェクトを返します。SoundInstanceオブジェクトにはSoundInstance.uniqueIdというプロパティが備わり、それぞれのインスタンスを識別できます。また、静的メソッドSoundJS.getInstanceById()にそのプロパティ値を渡すと、その値で識別されるSoundInstanceオブジェクトの参照が得られます。

なお、SoundInstance.uniqueIdプロパティは、SoundJS.play()メソッドなどの引数として定めるサウンドデータのidとは異なることにご注意ください。同じサウンドデータのidを引数に渡しても、SoundJS.play()メソッドを改めて呼出せば、新たなSoundInstanceオブジェクトがつくられるのです。

02 SoundInstanceの来し方行く末

SoundJS.play()メソッドでつくられるSoundInstanceオブジェクトには、デフォルトでSoundInstance.uniqueIdプロパティに0から始まる連番整数が与えられます。

var instance = SoundJS.play(id);
alert(instance.uniqueId);  // 0

そして、SoundInstanceオブジェクトの参照はもたなくても、そのSoundInstance.uniqueIdプロパティ値がわかれば、SoundJS.getInstanceById()メソッドでいつでも参照を取出せます。そこで、戻り値はとらずにSoundJS.play()メソッドでいくつものサウンドを再生し、そのたびにSoundJS.getInstanceById()メソッドに0を渡して戻り値がどうなるか確かめてみます。

SoundJS.play(eventObject.id);
alert(SoundJS.getInstanceById(0));  // [HTMLAudioPlugin SoundInstance]

すると、いくつサウンドを再生し終えても、SoundInstance.uniqueIdプロパティが0のSoundInstanceオブジェクトはメモリから消える気配がありません。もちろん、連番1以降のインスタンスについても同じでしょう。

CreateJS Supportに問合せたところ、この問題は確認されていて、対応を検討しているとのことです(「How to play the finished sound again?」参照)。再生を終えたインスタンスはガベージコレクトするか、あるいは削除のメソッドを提供してほしいところです。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事