mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-10-04 04:48:05 +03:00
Refactor DRI
This commit is contained in:
+26
-34
@@ -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<uint8_t> data = dri_load(amus, page);
|
||||
if (data.empty())
|
||||
return;
|
||||
int rate = EM_ASM_INT({ return xsystem35.audio.enable_audio_hook(); });
|
||||
fm = std::make_unique<MakoYmfm>(rate, data, true);
|
||||
fm = std::make_unique<MakoYmfm>(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<uint8_t> wav_buffer = dri_load("AWAV.DAT", page);
|
||||
if (wav_buffer.empty()) {
|
||||
std::vector<uint8_t> 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() {
|
||||
|
||||
@@ -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<uint8_t> data) :
|
||||
MakoFM(std::move(data)),
|
||||
sample_rate(rate),
|
||||
opna(*this)
|
||||
{
|
||||
|
||||
+2
-1
@@ -1,12 +1,13 @@
|
||||
#ifndef MAKOYMFM_H_
|
||||
#define MAKOYMFM_H_
|
||||
|
||||
#include <vector>
|
||||
#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<uint8_t> data);
|
||||
void Process(int16_t* stream, int len);
|
||||
void get_mark(int* mark, int* loop);
|
||||
|
||||
|
||||
+4
-10
@@ -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<uint8_t> 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;
|
||||
|
||||
+3
-4
@@ -1,6 +1,7 @@
|
||||
#ifndef MAKOFM_H_
|
||||
#define MAKOFM_H_
|
||||
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
|
||||
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<uint8_t> 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<uint8_t> data;
|
||||
uint16_t tone_offset;
|
||||
uint16_t ver;
|
||||
|
||||
|
||||
+13
-17
@@ -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<uint8_t> data = dri_load(amus, page);
|
||||
if (data.empty())
|
||||
return;
|
||||
if (!fm_mutex)
|
||||
fm_mutex = SDL_CreateMutex();
|
||||
|
||||
SDL_LockMutex(fm_mutex);
|
||||
fm = std::make_unique<MakoYmfm>(SAMPLE_RATE, data, true);
|
||||
fm = std::make_unique<MakoYmfm>(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<uint8_t> 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);
|
||||
|
||||
+45
-50
@@ -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<uint8_t> 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)
|
||||
|
||||
+25
-23
@@ -9,7 +9,7 @@
|
||||
#include "crc32.h"
|
||||
#include "../fileio.h"
|
||||
|
||||
uint8* DRI::load(const char* file_name, int page, int* size)
|
||||
std::vector<uint8> 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<uint8_t> 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<uint8> 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<uint8_t> 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);
|
||||
|
||||
|
||||
+4
-10
@@ -7,16 +7,10 @@
|
||||
#ifndef _DRI_H_
|
||||
#define _DRI_H_
|
||||
|
||||
#include "../common.h"
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
|
||||
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<uint8_t> dri_load(const char* file_name, int page);
|
||||
std::vector<uint8_t> dri_load_mda(uint32_t crc32_a, uint32_t crc32_b, int page);
|
||||
|
||||
#endif
|
||||
|
||||
+15
-21
@@ -95,8 +95,8 @@ class Playback {
|
||||
public:
|
||||
static std::unique_ptr<Playback> 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<uint8_t>& data);
|
||||
void load_mda(const std::vector<uint8_t>& 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> Playback::create(NACT* nact, char* amus, int page, int loop, int seq)
|
||||
{
|
||||
auto playback = std::make_unique<Playback>(nact->crc32_a, loop, seq);
|
||||
auto dri = std::make_unique<DRI>();
|
||||
|
||||
int size;
|
||||
uint8* data = dri->load(amus, page, &size);
|
||||
if (!data)
|
||||
std::vector<uint8_t> 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<uint8_t>& 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<uint8_t>& 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];
|
||||
|
||||
+5
-15
@@ -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<int>(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;
|
||||
}
|
||||
|
||||
// 下位関数
|
||||
|
||||
+2
-2
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <stdio.h>
|
||||
#include "../common.h"
|
||||
#include "config.h"
|
||||
@@ -114,8 +115,7 @@ protected:
|
||||
char adisk[16];
|
||||
|
||||
// シナリオデータ
|
||||
uint8* scenario_data;
|
||||
int scenario_size;
|
||||
std::vector<uint8_t> scenario_data;
|
||||
|
||||
// アドレス、ページ管理
|
||||
int scenario_addr, prev_addr;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+26
-31
@@ -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<uint8_t> data = dri_load(amus, page);
|
||||
if (data.empty())
|
||||
return;
|
||||
|
||||
SDL_LockMutex(fm_mutex);
|
||||
fm = std::make_unique<MakoYmfm>(SAMPLE_RATE, data, true);
|
||||
fm = std::make_unique<MakoYmfm>(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<uint8_t> wav_buffer = dri_load("AWAV.DAT", page);
|
||||
if (wav_buffer.empty()) {
|
||||
std::vector<uint8_t> buffer = dri_load("AMSE.DAT", page);
|
||||
if (!buffer.empty()) {
|
||||
// AMSE形式 (乙女戦記)
|
||||
int samples = (static_cast<int>(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()
|
||||
|
||||
Reference in New Issue
Block a user