diff --git a/src/emscripten/mako.cpp b/src/emscripten/mako.cpp index dd7c373..492b82a 100644 --- a/src/emscripten/mako.cpp +++ b/src/emscripten/mako.cpp @@ -13,7 +13,6 @@ namespace { std::unique_ptr fm; -uint8* fmdata; } // namespace @@ -45,9 +44,7 @@ void MAKO::play_music(int page) uint8* data = dri.load(amus, page, &size); if (!data) return; - fm = std::make_unique(data); - free(fmdata); - fmdata = data; + fm = std::make_unique(data, true); EM_ASM({ xsystem35.audio.enable_audio_hook(); }); } else { auto midi = std::make_unique(nact, amus); @@ -77,8 +74,6 @@ void MAKO::stop_music() }); fm = nullptr; - free(fmdata); - fmdata = nullptr; current_music = 0; } diff --git a/src/fm/mako_fmgen.cpp b/src/fm/mako_fmgen.cpp index 03b93e1..d2fa09a 100644 --- a/src/fm/mako_fmgen.cpp +++ b/src/fm/mako_fmgen.cpp @@ -6,8 +6,8 @@ const int SAMPLE_RATE = 44100; const int OPNA_CLOCK = 3993600 * 2; -MakoFMgen::MakoFMgen(const uint8_t* data) : - MakoFM(data), +MakoFMgen::MakoFMgen(const uint8_t* data, bool free_data) : + MakoFM(data, free_data), sync_ms(0), samples_left(0) { bool ok = opna.Init(OPNA_CLOCK, SAMPLE_RATE, false); @@ -49,7 +49,7 @@ void MakoFMgen::Mix(int samples) { samples_left = samples - out_samples; samples = out_samples; } - FM_SAMPLETYPE* buf = new FM_SAMPLETYPE[samples * 2]; + FM_SAMPLETYPE* buf = (FM_SAMPLETYPE*)alloca(samples * 2 * sizeof(FM_SAMPLETYPE)); memset(buf, 0, samples * sizeof(FM_SAMPLETYPE) * 2); opna.Mix(buf, samples); for (int i = 0; i < samples * 2; i += 2) { @@ -58,5 +58,4 @@ void MakoFMgen::Mix(int samples) { } out_samples -= samples; output += samples * 2; - delete[] buf; } diff --git a/src/fm/mako_fmgen.h b/src/fm/mako_fmgen.h index e55c06f..17d5bd8 100644 --- a/src/fm/mako_fmgen.h +++ b/src/fm/mako_fmgen.h @@ -6,7 +6,7 @@ class MakoFMgen : private MakoFM { public: - MakoFMgen(const uint8_t* data); + MakoFMgen(const uint8_t* data, bool free_data); void Process(int16* stream, int len); private: diff --git a/src/fm/makofm.cpp b/src/fm/makofm.cpp index 243f38f..c6174c5 100644 --- a/src/fm/makofm.cpp +++ b/src/fm/makofm.cpp @@ -1,6 +1,7 @@ #include "makofm.h" #include #include +#include #include #include "common.h" @@ -42,8 +43,9 @@ const uint8_t PresetFMTone[TONE_DATA_SIZE] = { } // namespace -MakoFM::MakoFM(const uint8_t* data) : +MakoFM::MakoFM(const uint8_t* data, bool free_data) : data(data), + free_data(free_data), tone_offset(GetWord(0)), ver(GetWord(2)) { memset(work, 0, sizeof(work)); @@ -57,6 +59,11 @@ MakoFM::MakoFM(const uint8_t* data) : } } +MakoFM::~MakoFM() { + if (free_data) + free((void*)data); +} + void MakoFM::MainLoop() { if (time_ms == 0.0) { InitOPNA(); diff --git a/src/fm/makofm.h b/src/fm/makofm.h index 622b4b9..b97d0cd 100644 --- a/src/fm/makofm.h +++ b/src/fm/makofm.h @@ -12,7 +12,8 @@ const int MAKO_MAXCH = 9; // [2] http://mydocuments.g2.xrea.com/html/p6/makop6.html class MakoFM { public: - MakoFM(const uint8_t* data); + MakoFM(const uint8_t* data, bool free_data); + ~MakoFM(); void MainLoop(); float GetTime() const { return time_ms; } @@ -116,6 +117,7 @@ private: Work work[9]; const uint8_t* data; + const bool free_data; uint16_t tone_offset; uint16_t ver; diff --git a/src/linux/mako.cpp b/src/linux/mako.cpp index 1208649..935567c 100644 --- a/src/linux/mako.cpp +++ b/src/linux/mako.cpp @@ -25,7 +25,6 @@ Mix_Music *mix_music; Mix_Chunk *mix_chunk; SDL_mutex* fm_mutex; std::unique_ptr fm; -uint8* fmdata; void FMHook(void *udata, Uint8 *stream, int len) { SDL_LockMutex(fm_mutex); @@ -114,9 +113,7 @@ void MAKO::play_music(int page) fm_mutex = SDL_CreateMutex(); SDL_LockMutex(fm_mutex); - free(fmdata); - fmdata = data; - fm = std::make_unique(fmdata); + fm = std::make_unique(data, true); Mix_HookMusic(&FMHook, this); SDL_UnlockMutex(fm_mutex); } else {