diff --git a/src/emscripten/mako.cpp b/src/emscripten/mako.cpp index e0db227..1a71362 100644 --- a/src/emscripten/mako.cpp +++ b/src/emscripten/mako.cpp @@ -50,13 +50,11 @@ void MAKO::play_music(int page) EM_ASM_ARGS({ xsystem35.cdPlayer.play($0, $1); }, cd_track[page] + 1, next_loop ? 0 : 1); } else { - DRI dri; - int size; - uint8* data = dri.load(amus, page, &size); - if (!data) + std::vector data = dri_load(amus, page); + if (data.empty()) return; int rate = EM_ASM_INT({ return xsystem35.audio.enable_audio_hook(); }); - fm = std::make_unique(rate, data, true); + fm = std::make_unique(rate, std::move(data)); } current_music = page; @@ -110,39 +108,33 @@ void MAKO::play_pcm(int page, bool loop) 0x00, 0x00, 0x00, 0x00 }; - uint8* wav_buffer; - uint8* buffer; - int size; - DRI* dri = new DRI(); + // WAV形式 (Only You) + std::vector wav_buffer = dri_load("AWAV.DAT", page); + if (wav_buffer.empty()) { + std::vector buffer = dri_load("AMSE.DAT", page); + if (!buffer.empty()) { + // AMSE形式 (乙女戦記) + int samples = (buffer.size() - 12) * 2; + int total = samples + 0x24; - if ((buffer = dri->load("AWAV.DAT", page, &size)) != NULL) { - // WAV形式 (Only You) - wav_buffer = buffer; - } else if ((buffer = dri->load("AMSE.DAT", page, &size)) != NULL) { - // AMSE形式 (乙女戦記) - int total = (size - 12) * 2 + 0x24; - int samples = (size - 12) * 2; - - wav_buffer = (uint8*)malloc(total + 8); - memcpy(wav_buffer, header, 44); - wav_buffer[ 4] = (total >> 0) & 0xff; - wav_buffer[ 5] = (total >> 8) & 0xff; - wav_buffer[ 6] = (total >> 16) & 0xff; - wav_buffer[ 7] = (total >> 24) & 0xff; - wav_buffer[40] = (samples >> 0) & 0xff; - wav_buffer[41] = (samples >> 8) & 0xff; - wav_buffer[42] = (samples >> 16) & 0xff; - wav_buffer[43] = (samples >> 24) & 0xff; - for(int i = 12, p = 44; i < size; i++) { - wav_buffer[p++] = buffer[i] & 0xf0; - wav_buffer[p++] = (buffer[i] & 0x0f) << 4; + wav_buffer.resize(total + 8); + memcpy(wav_buffer.data(), header, 44); + wav_buffer[ 4] = (total >> 0) & 0xff; + wav_buffer[ 5] = (total >> 8) & 0xff; + wav_buffer[ 6] = (total >> 16) & 0xff; + wav_buffer[ 7] = (total >> 24) & 0xff; + wav_buffer[40] = (samples >> 0) & 0xff; + wav_buffer[41] = (samples >> 8) & 0xff; + wav_buffer[42] = (samples >> 16) & 0xff; + wav_buffer[43] = (samples >> 24) & 0xff; + for (size_t i = 12, p = 44; i < buffer.size(); i++) { + wav_buffer[p++] = buffer[i] & 0xf0; + wav_buffer[p++] = (buffer[i] & 0x0f) << 4; + } } - free(buffer); - size = total + 8; } - if (muspcm_load_data(wav_buffer, size) == 0) + if (muspcm_load_data(wav_buffer.data(), wav_buffer.size()) == 0) EM_ASM({ xsystem35.audio.pcm_start(0, $0); }, loop ? 0 : 1); - free(wav_buffer); } void MAKO::stop_pcm() { diff --git a/src/fm/mako_ymfm.cpp b/src/fm/mako_ymfm.cpp index c989c24..a0a5efc 100644 --- a/src/fm/mako_ymfm.cpp +++ b/src/fm/mako_ymfm.cpp @@ -7,8 +7,8 @@ int16_t mixSample(int32_t fm, int32_t ssg) { return ymfm::clamp(fm * 2 + ssg / 2, -32768, 32767); } -MakoYmfm::MakoYmfm(int rate, const uint8_t* data, bool free_data) : - MakoFM(data, free_data), +MakoYmfm::MakoYmfm(int rate, std::vector data) : + MakoFM(std::move(data)), sample_rate(rate), opna(*this) { diff --git a/src/fm/mako_ymfm.h b/src/fm/mako_ymfm.h index bc32a82..fb4ace0 100644 --- a/src/fm/mako_ymfm.h +++ b/src/fm/mako_ymfm.h @@ -1,12 +1,13 @@ #ifndef MAKOYMFM_H_ #define MAKOYMFM_H_ +#include #include "ymfm_opn.h" #include "makofm.h" class MakoYmfm : private MakoFM, private ymfm::ymfm_interface { public: - MakoYmfm(int rate, const uint8_t* data, bool free_data); + MakoYmfm(int rate, std::vector data); void Process(int16_t* stream, int len); void get_mark(int* mark, int* loop); diff --git a/src/fm/makofm.cpp b/src/fm/makofm.cpp index c6174c5..4451943 100644 --- a/src/fm/makofm.cpp +++ b/src/fm/makofm.cpp @@ -43,9 +43,8 @@ const uint8_t PresetFMTone[TONE_DATA_SIZE] = { } // namespace -MakoFM::MakoFM(const uint8_t* data, bool free_data) : - data(data), - free_data(free_data), +MakoFM::MakoFM(std::vector data) : + data(std::move(data)), tone_offset(GetWord(0)), ver(GetWord(2)) { memset(work, 0, sizeof(work)); @@ -59,11 +58,6 @@ MakoFM::MakoFM(const uint8_t* data, bool free_data) : } } -MakoFM::~MakoFM() { - if (free_data) - free((void*)data); -} - void MakoFM::MainLoop() { if (time_ms == 0.0) { InitOPNA(); @@ -130,7 +124,7 @@ void MakoFM::ExecSequence(int ch, bool execcmd) { execcmd: cmdFF = 0; - work[ch].seq_ptr = ExecCmd(ch, data + work[ch].seq_ptr) - data; + work[ch].seq_ptr = ExecCmd(ch, &data[work[ch].seq_ptr]) - data.data(); if (cmdFF) { uint16_t block_addr = GetWord(work[ch].jump_ptr); work[ch].jump_ptr += 2; @@ -335,7 +329,7 @@ const uint8_t* MakoFM::ExecCmd(int ch, const uint8_t* code) { case 0xf5: // FM tone set work[ch].tone_num = *code++; - SetFMTone(ch, data + tone_offset + TONE_DATA_SIZE * work[ch].tone_num); + SetFMTone(ch, &data[tone_offset + TONE_DATA_SIZE * work[ch].tone_num]); ExecHWLFO(ch); cont = true; break; diff --git a/src/fm/makofm.h b/src/fm/makofm.h index 327db0b..fc3cda7 100644 --- a/src/fm/makofm.h +++ b/src/fm/makofm.h @@ -1,6 +1,7 @@ #ifndef MAKOFM_H_ #define MAKOFM_H_ +#include #include const int MAKO_MAXCH = 9; @@ -12,8 +13,7 @@ const int MAKO_MAXCH = 9; // [2] http://mydocuments.g2.xrea.com/html/p6/makop6.html class MakoFM { public: - MakoFM(const uint8_t* data, bool free_data); - ~MakoFM(); + explicit MakoFM(std::vector data); void MainLoop(); double GetTime() const { return time_ms; } @@ -117,8 +117,7 @@ private: }; Work work[9]; - const uint8_t* data; - const bool free_data; + const std::vector data; uint16_t tone_offset; uint16_t ver; diff --git a/src/generic/mako.cpp b/src/generic/mako.cpp index 175ab70..856539c 100644 --- a/src/generic/mako.cpp +++ b/src/generic/mako.cpp @@ -117,16 +117,14 @@ void MAKO::play_music(int page) } } } else if (use_fm) { - DRI dri; - int size; - uint8* data = dri.load(amus, page, &size); - if (!data) + std::vector data = dri_load(amus, page); + if (data.empty()) return; if (!fm_mutex) fm_mutex = SDL_CreateMutex(); SDL_LockMutex(fm_mutex); - fm = std::make_unique(SAMPLE_RATE, data, true); + fm = std::make_unique(SAMPLE_RATE, std::move(data)); SDL_UnlockMutex(fm_mutex); Mix_HookMusic(&FMHook, this); } else if (midi->is_available()) { @@ -195,19 +193,18 @@ void MAKO::play_pcm(int page, bool loop) stop_pcm(); - uint8* buffer = NULL; - int size; - DRI* dri = new DRI(); - - if((buffer = dri->load("AWAV.DAT", page, &size)) != NULL) { + std::vector buffer = dri_load("AWAV.DAT", page); + if (!buffer.empty()) { // WAV形式 (Only You) - mix_chunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(buffer, size), 1 /* freesrc */); - free(buffer); + mix_chunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(buffer.data(), buffer.size()), 1 /* freesrc */); Mix_PlayChannel(-1, mix_chunk, loop ? -1 : 0); - } else if((buffer = dri->load("AMSE.DAT", page, &size)) != NULL) { + return; + } + buffer = dri_load("AMSE.DAT", page); + if (!buffer.empty()) { // AMSE形式 (乙女戦記) - int total = (size - 12) * 2 + 0x24; - int samples = (size - 12) * 2; + int samples = (buffer.size() - 12) * 2; + int total = samples + 0x24; uint8* wav = (uint8*)malloc(total + 8); memcpy(wav, header, 44); @@ -219,11 +216,10 @@ void MAKO::play_pcm(int page, bool loop) wav[41] = (samples >> 8) & 0xff; wav[42] = (samples >> 16) & 0xff; wav[43] = (samples >> 24) & 0xff; - for(int i = 12, p = 44; i < size; i++) { + for (size_t i = 12, p = 44; i < buffer.size(); i++) { wav[p++] = buffer[i] & 0xf0; wav[p++] = (buffer[i] & 0x0f) << 4; } - free(buffer); mix_chunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(wav, total + 8), 1 /* freesrc */); free(wav); diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index 5f356b5..90b5a0d 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -29,61 +29,56 @@ void AGS::load_cg(int page, int transparent) return; } } - DRI* dri = new DRI(); - int size; - uint8* data = dri->load(acg, page, &size); - if(data && size > 0) { - switch (nact->sys_ver) { - case 1: - switch (nact->crc32_a) { - case CRC32_BUNKASAI: - case CRC32_GAKUEN: - case CRC32_GAKUEN_ENG: - load_vsp(data, page, transparent); - break; - case CRC32_INTRUDER: - // load_gm3(data, page, transparent); - load_vsp(data, page, transparent); // 暫定 - break; - case CRC32_VAMPIRE: - case CRC32_VAMPIRE_ENG: - load_vsp2l(data, page, transparent); - break; - default: - load_gl3(data, page, transparent); - break; - } + std::vector data = dri_load(acg, page); + if (data.empty()) + return; + switch (nact->sys_ver) { + case 1: + switch (nact->crc32_a) { + case CRC32_BUNKASAI: + case CRC32_GAKUEN: + case CRC32_GAKUEN_ENG: + load_vsp(data.data(), page, transparent); break; - case 2: - if(nact->crc32_a == CRC32_AYUMI_PROTO) { - // あゆみちゃん物語 PROTO - load_gl3(data, page, transparent); - } else if(nact->crc32_a == CRC32_AYUMI_FD || nact->crc32_a == CRC32_AYUMI_HINT) { - // あゆみちゃん物語 - load_vsp(data, page, transparent); - } else if(nact->crc32_a == CRC32_SDPS) { - // Super D.P.S - load_pms(data, page, transparent); - } else { - if(data[0x8] == 0) { - load_vsp(data, page, transparent); - } else { - load_pms(data, page, transparent); - } - } + case CRC32_INTRUDER: + // load_gm3(data.data(), page, transparent); + load_vsp(data.data(), page, transparent); // 暫定 break; - case 3: - if(data[0x8] == 0) { - load_vsp(data, page, transparent); - } else { - load_pms(data, page, transparent); - } + case CRC32_VAMPIRE: + case CRC32_VAMPIRE_ENG: + load_vsp2l(data.data(), page, transparent); + break; + default: + load_gl3(data.data(), page, transparent); break; } + break; + case 2: + if(nact->crc32_a == CRC32_AYUMI_PROTO) { + // あゆみちゃん物語 PROTO + load_gl3(data.data(), page, transparent); + } else if(nact->crc32_a == CRC32_AYUMI_FD || nact->crc32_a == CRC32_AYUMI_HINT) { + // あゆみちゃん物語 + load_vsp(data.data(), page, transparent); + } else if(nact->crc32_a == CRC32_SDPS) { + // Super D.P.S + load_pms(data.data(), page, transparent); + } else { + if(data[0x8] == 0) { + load_vsp(data.data(), page, transparent); + } else { + load_pms(data.data(), page, transparent); + } + } + break; + case 3: + if(data[0x8] == 0) { + load_vsp(data.data(), page, transparent); + } else { + load_pms(data.data(), page, transparent); + } + break; } - if (data) - free(data); - delete dri; } void AGS::copy(int sx, int sy, int ex, int ey, int dx, int dy) diff --git a/src/sys/dri.cpp b/src/sys/dri.cpp index 02ecf5d..7c4873f 100644 --- a/src/sys/dri.cpp +++ b/src/sys/dri.cpp @@ -9,7 +9,7 @@ #include "crc32.h" #include "../fileio.h" -uint8* DRI::load(const char* file_name, int page, int* size) +std::vector dri_load(const char* file_name, int page) { char tmp_name[20]; strcpy_s(tmp_name, sizeof(tmp_name), file_name); @@ -20,7 +20,7 @@ uint8* DRI::load(const char* file_name, int page, int* size) tmp_name[0] = 'A'; if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; - return NULL; + return {}; } int link_sector = fio->Fgetc(); @@ -32,7 +32,7 @@ uint8* DRI::load(const char* file_name, int page, int* size) // ページ番号不正 fio->Fclose(); delete fio; - return NULL; + return {}; } fio->Fseek((link_sector - 1) * 256 + (page - 1) * 2, FILEIO_SEEK_SET); @@ -43,7 +43,7 @@ uint8* DRI::load(const char* file_name, int page, int* size) // 欠番 fio->Fclose(); delete fio; - return NULL; + return {}; } // A??.DAT以外にリンクされている場合はファイルを開き直す @@ -52,7 +52,7 @@ uint8* DRI::load(const char* file_name, int page, int* size) fio->Fclose(); if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; - return NULL; + return {}; } } @@ -63,16 +63,17 @@ uint8* DRI::load(const char* file_name, int page, int* size) int end_sector = fio->Fgetc(); end_sector |= fio->Fgetc() << 8; - if((*size = (end_sector - start_sector) * 256) == 0) { + int size = (end_sector - start_sector) * 256; + if (size == 0) { // サイズ不正 fio->Fclose(); delete fio; - return NULL; + return {}; } - uint8 *buffer = (uint8 *)malloc(*size); + std::vector buffer(size); fio->Fseek((start_sector - 1) * 256, FILEIO_SEEK_SET); - fio->Fread(buffer, 256, end_sector - start_sector); + fio->Fread(buffer.data(), 256, end_sector - start_sector); fio->Fclose(); delete fio; @@ -80,7 +81,7 @@ uint8* DRI::load(const char* file_name, int page, int* size) return buffer; } -uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) +std::vector dri_load_mda(uint32_t crc32_a, uint32_t crc32_b, int page) { // データ取得 const char* name = NULL; @@ -195,12 +196,12 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) } if(name == NULL) { - return NULL; + return {}; } SDL_RWops* rw = open_resource(name, "mda"); if (!rw) - return NULL; + return {}; uint8 buf[4]; // ページの位置を取得 @@ -211,7 +212,7 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) if(page > (data_sector - link_sector) * 128 - 1) { // ページ番号不正 SDL_RWclose(rw); - return NULL; + return {}; } SDL_RWseek(rw, (link_sector - 1) * 256 + (page - 1) * 2, RW_SEEK_SET); @@ -223,7 +224,7 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) if(disk_index == 0 || disk_index == 0x1a) { // 欠番 SDL_RWclose(rw); - return NULL; + return {}; } // AMUS.MDA以外にリンクされている場合はリソースを開き直す @@ -271,10 +272,10 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) break; } if(name == NULL) { - return NULL; + return {}; } if((rw = open_resource(name, "mda")) == NULL) { - return NULL; + return {}; } } else if(disk_index == 3) { SDL_RWclose(rw); @@ -287,15 +288,15 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) break; } if(name == NULL) { - return NULL; + return {}; } if((rw = open_resource(name, "mda")) == NULL) { - return NULL; + return {}; } } else if(disk_index != 1) { // AMUS.MDA以外にリンクされている場合は失敗 SDL_RWclose(rw); - return NULL; + return {}; } // データ取得 @@ -304,14 +305,15 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) int start_sector = buf[0] | (buf[1] << 8); int end_sector = buf[2] | (buf[3] << 8); - if((*size = (end_sector - start_sector) * 256) == 0) { + int size = (end_sector - start_sector) * 256; + if (size == 0) { // サイズ不正 SDL_RWclose(rw); - return NULL; + return {}; } - uint8* buffer = (uint8*)malloc(*size); + std::vector buffer(size); SDL_RWseek(rw, (start_sector - 1) * 256, RW_SEEK_SET); - SDL_RWread(rw, buffer, *size, 1); + SDL_RWread(rw, buffer.data(), size, 1); SDL_RWclose(rw); diff --git a/src/sys/dri.h b/src/sys/dri.h index efe8725..a2e814b 100644 --- a/src/sys/dri.h +++ b/src/sys/dri.h @@ -7,16 +7,10 @@ #ifndef _DRI_H_ #define _DRI_H_ -#include "../common.h" +#include +#include -class DRI -{ -public: - DRI() {} - ~DRI() {} - - uint8* load(const char* file_name, int page, int* size); - uint8* load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size); -}; +std::vector dri_load(const char* file_name, int page); +std::vector dri_load_mda(uint32_t crc32_a, uint32_t crc32_b, int page); #endif diff --git a/src/sys/mako_midi.cpp b/src/sys/mako_midi.cpp index 2a6a329..9b3dba5 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -95,8 +95,8 @@ class Playback { public: static std::unique_ptr create(NACT* nact, char* amus, int page, int loop, int seq); Playback(uint32_t crc32_a, int loop, int seq) : crc32_a(crc32_a), loop_(loop), seq_(seq) {} - bool load_mml(uint8_t* data, int size); - void load_mda(uint8_t* data, int size); + bool load_mml(const std::vector& data); + void load_mda(const std::vector& data); void start_midi(); bool play_midi(SDL_atomic_t* current_loop, SDL_atomic_t* current_mark); int seq() const { return seq_; } @@ -382,32 +382,26 @@ bool Playback::play_midi(SDL_atomic_t* current_loop, SDL_atomic_t* current_mark) std::unique_ptr Playback::create(NACT* nact, char* amus, int page, int loop, int seq) { auto playback = std::make_unique(nact->crc32_a, loop, seq); - auto dri = std::make_unique(); - int size; - uint8* data = dri->load(amus, page, &size); - if (!data) + std::vector data = dri_load(amus, page); + if (data.empty()) return nullptr; - if (!playback->load_mml(data, size)) { - free(data); + if (!playback->load_mml(data)) return nullptr; - } - free(data); // Load MDA char path[16]; strcpy_s(path, 16, amus); strcpy(path + strlen(path) - 3, "MDA"); - data = dri->load(path, page, &size); - if (!data) - data = dri->load_mda(nact->crc32_a, nact->crc32_b, page, &size); - playback->load_mda(data, size); - free(data); + data = dri_load(path, page); + if (data.empty()) + data = dri_load_mda(nact->crc32_a, nact->crc32_b, page); + playback->load_mda(data); return playback; } -bool Playback::load_mml(uint8_t* data, int size) +bool Playback::load_mml(const std::vector& data) { // FM音源データの判定 int p, d0, d1, d2; @@ -563,7 +557,7 @@ bool Playback::load_mml(uint8_t* data, int size) return true; } -void Playback::load_mda(uint8_t* data, int size) +void Playback::load_mda(const std::vector& data) { // 未設定時の音色設定 (Piano, Acoustic Bass Drum) for(int i = 0; i < 256 + 3; i++) { @@ -582,7 +576,7 @@ void Playback::load_mda(uint8_t* data, int size) } tempo_dif = 0x40; - if (!data) + if (data.empty()) return; tempo_dif = data[7]; @@ -592,7 +586,7 @@ void Playback::load_mda(uint8_t* data, int size) // SSGパートの音色設定 for(int i = 0; i < 3; i++) { - uint8* buf = &data[map_wide * i + 27]; + const uint8_t* buf = &data[map_wide * i + 27]; mda[i + 256].bank_select = buf[0]; mda[i + 256].program_change = buf[1]; mda[i + 256].level = buf[2]; @@ -604,7 +598,7 @@ void Playback::load_mda(uint8_t* data, int size) // 通常の音色設定 for(int i = 0; i < inst_num; i++) { - uint8* buf = &data[27 + map_wide * 3 + (map_wide + 1) * i]; + const uint8_t* buf = &data[27 + map_wide * 3 + (map_wide + 1) * i]; int n = buf[0]; mda[n].bank_select = buf[1]; mda[n].program_change = buf[2]; @@ -617,7 +611,7 @@ void Playback::load_mda(uint8_t* data, int size) // ドラムパートの音色設定 if(drum_format) { - uint8* buf = &data[27 + map_wide * 3 + (map_wide + 1) * inst_num]; + const uint8_t* buf = &data[27 + map_wide * 3 + (map_wide + 1) * inst_num]; int drum_num = buf[0]; for(int i = 0; i < drum_num; i++) { int d = buf[i * 3 + 1]; diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 15334d2..265c603 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -59,7 +59,6 @@ NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const Config& config) strcpy_s(adisk, 16, "ADISK.DAT"); // シナリオ管理 - scenario_data = NULL; load_scenario(0); scenario_page = 0; scenario_addr = 2; @@ -118,11 +117,6 @@ NACT::~NACT() delete mako; delete msgskip; - // シナリオ開放 - if(scenario_data) { - free(scenario_data); - } - platform_finalize(); } @@ -160,7 +154,7 @@ EMSCRIPTEN_KEEPALIVE // Prevent inlining, because this function is listed in AS void NACT::execute() { // アドレスの確認 - if(scenario_addr < 2 || scenario_addr >= scenario_size) { + if (scenario_addr < 2 || scenario_addr >= static_cast(scenario_data.size())) { fatal("Scenario error"); return; } @@ -320,7 +314,7 @@ void NACT::skip_string(uint8 terminator) for (uint8 c = getd(); c != terminator; c = getd()) { if (c != '\\') ungetd(); - scenario_addr += encoding->mblen(scenario_data + scenario_addr); + scenario_addr += encoding->mblen(&scenario_data[scenario_addr]); } } @@ -332,7 +326,7 @@ void NACT::get_string(char* buf, int size, uint8 terminator) for (uint8 c = getd(); c != terminator; c = getd()) { if (c != '\\') ungetd(); - int len = encoding->mblen(scenario_data + scenario_addr); + int len = encoding->mblen(&scenario_data[scenario_addr]); if (i + len >= size) fatal("String buffer overrun. page = %d, addr = %d", scenario_page, start_addr); memcpy(&buf[i], &scenario_data[scenario_addr], len); @@ -393,14 +387,10 @@ void NACT::text_wait() void NACT::load_scenario(int page) { - if(scenario_data) { - free(scenario_data); - } - DRI* dri = new DRI(); - if((scenario_data = dri->load(adisk, page + 1, &scenario_size)) == NULL) { + scenario_data = dri_load(adisk, page + 1); + if (scenario_data.empty()) { fatal("Cannot load scenario %d", page); } - delete dri; } // 下位関数 diff --git a/src/sys/nact.h b/src/sys/nact.h index 29b63e3..c87b66b 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -9,6 +9,7 @@ #include #include +#include #include #include "../common.h" #include "config.h" @@ -114,8 +115,7 @@ protected: char adisk[16]; // シナリオデータ - uint8* scenario_data; - int scenario_size; + std::vector scenario_data; // アドレス、ページ管理 int scenario_addr, prev_addr; diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 5a2196b..aeb10e4 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -220,7 +220,7 @@ void NACT_Sys1::cmd_branch() skip_string(cmd); } else if (is_message(cmd)) { ungetd(); - scenario_addr += encoding->mblen(scenario_data + scenario_addr); + scenario_addr += encoding->mblen(&scenario_data[scenario_addr]); } else if (cmd >= 0x20 && cmd < 0x7f) { fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); } else { diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index dc299d0..6b6460c 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -258,7 +258,7 @@ void NACT_Sys2::cmd_branch() skip_string(cmd); } else if (is_message(cmd)) { ungetd(); - scenario_addr += encoding->mblen(scenario_data + scenario_addr); + scenario_addr += encoding->mblen(&scenario_data[scenario_addr]); } else if (cmd >= 0x20 && cmd < 0x7f) { fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); } else { diff --git a/src/win/mako.cpp b/src/win/mako.cpp index 9880ca5..62be19d 100644 --- a/src/win/mako.cpp +++ b/src/win/mako.cpp @@ -288,14 +288,12 @@ void MAKO::play_music(int page) return; music = new Music(playlist[track], next_loop); } else if (use_fm) { - DRI dri; - int size; - uint8* data = dri.load(amus, page, &size); - if (!data) + std::vector data = dri_load(amus, page); + if (data.empty()) return; SDL_LockMutex(fm_mutex); - fm = std::make_unique(SAMPLE_RATE, data, true); + fm = std::make_unique(SAMPLE_RATE, std::move(data)); SDL_UnlockMutex(fm_mutex); SDL_PauseAudio(0); } else if (midi->is_available()) { @@ -420,35 +418,32 @@ void MAKO::play_pcm(int page, bool loop) stop_pcm(); - uint8* buffer = NULL; - int size; - DRI* dri = new DRI(); + // WAV形式 (Only You) + std::vector wav_buffer = dri_load("AWAV.DAT", page); + if (wav_buffer.empty()) { + std::vector buffer = dri_load("AMSE.DAT", page); + if (!buffer.empty()) { + // AMSE形式 (乙女戦記) + int samples = (static_cast(buffer.size()) - 12) * 2; + int total = samples + 0x24; - if ((buffer = dri->load("AWAV.DAT", page, &size)) != NULL) { - // WAV形式 (Only You) - wav_buffer = buffer; - } else if ((buffer = dri->load("AMSE.DAT", page, &size)) != NULL) { - // AMSE形式 (乙女戦記) - int total = (size - 12) * 2 + 0x24; - int samples = (size - 12) * 2; - - wav_buffer = (uint8*)malloc(total + 8); - memcpy(wav_buffer, header, 44); - wav_buffer[ 4] = (total >> 0) & 0xff; - wav_buffer[ 5] = (total >> 8) & 0xff; - wav_buffer[ 6] = (total >> 16) & 0xff; - wav_buffer[ 7] = (total >> 24) & 0xff; - wav_buffer[40] = (samples >> 0) & 0xff; - wav_buffer[41] = (samples >> 8) & 0xff; - wav_buffer[42] = (samples >> 16) & 0xff; - wav_buffer[43] = (samples >> 24) & 0xff; - for(int i = 12, p = 44; i < size; i++) { - wav_buffer[p++] = buffer[i] & 0xf0; - wav_buffer[p++] = (buffer[i] & 0x0f) << 4; + wav_buffer.resize(total + 8); + memcpy(wav_buffer.data(), header, 44); + wav_buffer[ 4] = (total >> 0) & 0xff; + wav_buffer[ 5] = (total >> 8) & 0xff; + wav_buffer[ 6] = (total >> 16) & 0xff; + wav_buffer[ 7] = (total >> 24) & 0xff; + wav_buffer[40] = (samples >> 0) & 0xff; + wav_buffer[41] = (samples >> 8) & 0xff; + wav_buffer[42] = (samples >> 16) & 0xff; + wav_buffer[43] = (samples >> 24) & 0xff; + for (size_t i = 12, p = 44; i < buffer.size(); i++) { + wav_buffer[p++] = buffer[i] & 0xf0; + wav_buffer[p++] = (buffer[i] & 0x0f) << 4; + } } - free(buffer); } - PlaySound((LPCTSTR)wav_buffer, NULL, SND_ASYNC | SND_MEMORY | (loop ? SND_LOOP : 0)); + PlaySound((LPCTSTR)wav_buffer.data(), NULL, SND_ASYNC | SND_MEMORY | (loop ? SND_LOOP : 0)); } void MAKO::stop_pcm()