/// <summary> /// ファイル(wav,ogg,mid)の読み込み。 /// ここで読み込んだものは、bgmとして再生される /// </summary> /// <param name="filename"></param> /// <returns></returns> private YanesdkResult LoadMusic(string filename) { if (NoSound) return YanesdkResult.PreconditionError; tmpFile = FileSys.GetTmpFile(filename); string f = tmpFile.FileName; YanesdkResult result; if (f != null) { music = SDL.Mix_LoadMUS(f); // Debug.Fail(SDL.Mix_GetError()); // ここでmusic == 0が返ってくるのは明らかにおかしい。 // smpeg.dllがないのに mp3を再生しようとしただとか? if (music == IntPtr.Zero) result = YanesdkResult.HappenSomeError; else result = YanesdkResult.NoError; } else { result = YanesdkResult.FileNotFound; // file not found } // music = Mix_LoadMUS_RW(rwops,1); // この関数なんでないかなーヽ(´Д`)ノ // ↑については↓と教えていただきました。 // この関数は SDL_mixer をコンパイルするときに // "USE_RWOPS" プリプロセッサ定義を追加すると使えるようです。 // http://ilaliart.sourceforge.jp/tips/mix_rwops.html // 最新のSDL_mixerならばあるらしい。 // ここで、注意して欲しいのは、Mix_LoadMUS_RW関数でMix_Musicオブジェクトを生成しても // すぐにSDL_RWclose関数でSDL_RWopsオブジェクトを開放していないことである。 // Mix_Musicオブジェクトはストリーミング再生されるため、常にファイルを開いた状態でなければならない。 // そのため、SDL_RWcloseでロード後にすぐにファイルを閉じてしまった場合、Mix_PlayMusic関数で再生に失敗してしまう。 // そのため、再生に用いるSDL_RWopsオブジェクトは再生停止後に破棄する必要がある。 /* SDL_RWopsH rwops = FileSys.ReadRW(filename); if (rwops.Handle != IntPtr.Zero) { music = SDL.Mix_LoadMUS_RW(rwops.Handle); // ↑このときrwopsをどこかで解放する必要あり } else { return YanesdkResult.FileNotFound; // file not found } if (music == IntPtr.Zero) { return YanesdkResult.SdlError; } */ // MacOSやmp3再生だと対応してないっぽいので、やっぱりこれ使うのやめ if (result == YanesdkResult.NoError) { this.fileName = filename; CacheSystem.OnResourceChanged(this); } return result; }
/// <summary> /// loadで読み込んだサウンドを解放する /// </summary> public void Release() { if (music != IntPtr.Zero) { Stop(); SDL.Mix_FreeMusic(music); music = IntPtr.Zero; } if (chunk != IntPtr.Zero) { Stop(); SDL.Mix_FreeChunk(chunk); chunk = IntPtr.Zero; } tmpFile = null; loaded = false; fileName = null; // リソースサイズが変更になったことをcache systemに通知する CacheSystem.OnResourceChanged(this); constructInfo = null; }