Refactor DRI

This commit is contained in:
kichikuou
2024-08-17 12:59:36 +09:00
parent 58859deec1
commit 4174e0c1bb
15 changed files with 174 additions and 222 deletions
+26 -34
View File
@@ -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() {
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+1 -1
View File
@@ -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 {
+1 -1
View File
@@ -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
View File
@@ -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()