clean up stuff + add multitrack setting to json

This commit is contained in:
Struma 2023-04-23 20:19:31 -04:00
parent 2490b8b76b
commit 1cfbac0c41
6 changed files with 61 additions and 48 deletions

View file

@ -92,34 +92,36 @@ RB_METHOD(audio_bgmPlay)
int volume = 100;
int pitch = 100;
double pos = 0.0;
int channel = -127;
rb_get_args(argc, argv, "z|iifi", &filename, &volume, &pitch, &pos, &channel RB_ARG_END);
GUARD_EXC( shState->audio().bgmPlay(filename, volume, pitch, pos, channel); )
int track = -127;
rb_get_args(argc, argv, "z|iifi", &filename, &volume, &pitch, &pos, &track RB_ARG_END);
GUARD_EXC( shState->audio().bgmPlay(filename, volume, pitch, pos, track); )
return Qnil;
}
RB_METHOD(audio_bgmStop)
{
RB_UNUSED_PARAM;
int channel = -127;
rb_get_args(argc, argv, "|i", &channel RB_ARG_END);
shState->audio().bgmStop(channel);
int track = -127;
rb_get_args(argc, argv, "|i", &track RB_ARG_END);
shState->audio().bgmStop(track);
return Qnil;
}
RB_METHOD(audio_bgmPos)
{
RB_UNUSED_PARAM;
return rb_float_new(shState->audio().bgmPos());
int track = 0;
rb_get_args(argc, argv, "|i", &track RB_ARG_END);
return rb_float_new(shState->audio().bgmPos(track));
}
RB_METHOD(audio_bgmGetVolume)
{
RB_UNUSED_PARAM;
int channel = -127;
rb_get_args(argc, argv, "|i", &channel RB_ARG_END);
int track = -127;
rb_get_args(argc, argv, "|i", &track RB_ARG_END);
int ret = 0;
GUARD_EXC( ret = shState->audio().bgmGetVolume(); )
GUARD_EXC( ret = shState->audio().bgmGetVolume(track); )
return rb_fix_new(ret);
}
@ -127,9 +129,9 @@ RB_METHOD(audio_bgmSetVolume)
{
RB_UNUSED_PARAM;
int volume;
int channel = -127;
rb_get_args(argc, argv, "i|i", &volume, &channel RB_ARG_END);
GUARD_EXC( shState->audio().bgmSetVolume(volume, channel); )
int track = -127;
rb_get_args(argc, argv, "i|i", &volume, &track RB_ARG_END);
GUARD_EXC( shState->audio().bgmSetVolume(volume, track); )
return Qnil;
}
@ -142,9 +144,9 @@ RB_METHOD(audio_bgmFade)
{
RB_UNUSED_PARAM;
int time;
int channel = -127;
rb_get_args(argc, argv, "i|i", &time, &channel RB_ARG_END);
shState->audio().bgmFade(time, channel);
int track = -127;
rb_get_args(argc, argv, "i|i", &time, &track RB_ARG_END);
shState->audio().bgmFade(time, track);
return Qnil;
}

View file

@ -372,6 +372,12 @@
// this number. Maximum: 64.
//
// "SESourceCount": 6
// Number of streams to open for BGM tracks. If the game
// needs multitrack audio, this should be set to as many
// available tracks as the game needs. Maximum: 16.
//
// "BGMTrackCount": 1
// The Windows game executable name minus ".exe". By default

View file

@ -27,6 +27,7 @@
#include "sharedmidistate.h"
#include "eventthread.h"
#include "sdl-util.h"
#include "exception.h"
#include <string>
#include <vector>
@ -37,9 +38,6 @@
struct AudioPrivate
{
// mkxp-z manages multiple streams of BGM.
// play/pause states should be shared between them, so checking the state of the first
// one should be enough to know what the rest are doing.
std::vector<AudioStream*> bgmTracks;
AudioStream bgs;
AudioStream me;
@ -94,6 +92,14 @@ struct AudioPrivate
for (auto track : bgmTracks)
delete track;
}
AudioStream *getTrackByIndex(int index) {
if (index < 0) index = 0;
if (index > bgmTracks.size() - 1) {
throw Exception(Exception::MKXPError, "requested BGM track %d out of range (max: %d)", index, bgmTracks.size() - 1);
}
return bgmTracks[index];
}
void meWatchFun()
{
@ -287,60 +293,59 @@ void Audio::bgmPlay(const char *filename,
int volume,
int pitch,
float pos,
int channel)
int track)
{
if (channel == -127) {
if (track == -127) {
for (auto track : p->bgmTracks)
track->stop();
channel = 0;
track = 0;
}
p->bgmTracks[clamp(channel, 0, (int)p->bgmTracks.size() - 1)]->play(filename, volume, pitch, pos);
p->getTrackByIndex(track)->play(filename, volume, pitch, pos);
}
void Audio::bgmStop(int channel)
void Audio::bgmStop(int track)
{
if (channel == -127) {
if (track == -127) {
for (auto track : p->bgmTracks)
track->stop();
return;
}
p->bgmTracks[clamp(channel, 0, (int)p->bgmTracks.size() - 1)]->stop();
p->getTrackByIndex(track)->stop();
}
void Audio::bgmFade(int time, int channel)
void Audio::bgmFade(int time, int track)
{
if (channel == -127) {
if (track == -127) {
for (auto track : p->bgmTracks)
track->fadeOut(time);
return;
}
p->bgmTracks[clamp(channel, 0, (int)p->bgmTracks.size() - 1)]->fadeOut(time);
p->getTrackByIndex(track)->fadeOut(time);
}
int Audio::bgmGetVolume(int channel)
int Audio::bgmGetVolume(int track)
{
if (channel == -127)
return p->bgmTracks[channel]->getVolume(AudioStream::BaseRatio) * 100;
if (track == -127)
return p->bgmTracks[0]->getVolume(AudioStream::BaseRatio) * 100;
return p->bgmTracks[channel]->getVolume(AudioStream::Base) * 100;
return p->getTrackByIndex(track)->getVolume(AudioStream::Base) * 100;
}
void Audio::bgmSetVolume(int volume, int channel)
void Audio::bgmSetVolume(int volume, int track)
{
float vol = volume / 100.0;
if (channel == -127) {
if (track == -127) {
for (auto track : p->bgmTracks)
track->setVolume(AudioStream::BaseRatio, vol);
return;
}
channel = clamp(channel, 0, (int)p->bgmTracks.size() - 1);
p->bgmTracks[channel]->setVolume(AudioStream::Base, vol);
p->getTrackByIndex(track)->setVolume(AudioStream::Base, vol);
}
@ -398,9 +403,9 @@ void Audio::setupMidi()
shState->midiState().initIfNeeded(shState->config());
}
float Audio::bgmPos()
float Audio::bgmPos(int track)
{
return p->bgmTracks[0]->playingOffset();
return p->getTrackByIndex(track)->playingOffset();
}
float Audio::bgsPos()

View file

@ -42,11 +42,11 @@ public:
int volume = 100,
int pitch = 100,
float pos = 0,
int channel = -127);
void bgmStop(int channel = -127);
void bgmFade(int time, int channel = -127);
int bgmGetVolume(int channel = -127);
void bgmSetVolume(int volume = 100, int channel = -127);
int track = -127);
void bgmStop(int track = -127);
void bgmFade(int time, int track = -127);
int bgmGetVolume(int track = -127);
void bgmSetVolume(int volume = 100, int track = -127);
void bgsPlay(const char *filename,
int volume = 100,
@ -67,7 +67,7 @@ public:
void seStop();
void setupMidi();
float bgmPos();
float bgmPos(int track = 0);
float bgsPos();
void reset();

View file

@ -42,14 +42,13 @@ struct AudioStream
* Multiplied together for final
* playback volume. Used with setVolume().
* Base is set by play().
* BaseRatio is set by Audio::setVolume() when no specific channel is specified.
It should be identical among all BGM tracks.
* External is used by MeWatch */
enum VolumeType
{
Base = 0,
// BaseRatio should be identical among all BGM tracks.
BaseRatio,
FadeOut,
FadeIn,
External,

View file

@ -302,6 +302,7 @@ try { exp } catch (...) {}
rgssVersion = clamp(rgssVersion, 0, 3);
SE.sourceCount = clamp(SE.sourceCount, 1, 64);
BGM.trackCount = clamp(BGM.trackCount, 1, 16);
// Determine whether to open a console window on... Windows
winConsole = getEnvironmentBool("MKXPZ_WINDOWS_CONSOLE", editor.debug);