Exemple #1
0
        /// <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;
        }
Exemple #2
0
        /// <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;
        }