move function definitions from header to the cpp file

moved a few functions to static scope

svn-id: r43077
This commit is contained in:
Norbert Lange 2009-08-05 19:26:00 +00:00
parent 621071ea9e
commit 648bec1d0c
4 changed files with 100 additions and 90 deletions

View File

@ -1022,6 +1022,14 @@
<File
RelativePath="..\..\sound\mods\maxtrax.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
DisableSpecificWarnings="$(NOINHERIT)"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug_Command|Win32"
>

View File

@ -33,10 +33,25 @@
// test for engines using this class.
#if defined(SOUND_MODS_MAXTRAX_H)
namespace {
int32 precalcNote(byte baseNote, int16 tune, byte octave) {
return 0x9fd77 + 0x3C000 + (1 << 16) - ((baseNote << 14) + (tune << 11) / 3) / 3 - (octave << 16);
}
int32 calcVolumeDelta(int32 delta, uint16 time, uint16 vBlankFreq) {
const int32 div = time * vBlankFreq;
// div <= 1000 means time to small (or even 0)
return (div <= 1000) ? delta : (1000 * delta) / div;
}
}
namespace Audio {
MaxTrax::MaxTrax(int rate, bool stereo)
: Paula(stereo, rate, rate/50), _voiceCtx(), _patch(), _scores(), _numScores() {
: Paula(stereo, rate, rate/50),
_voiceCtx(),
_patch(),
_scores(),
_numScores() {
_playerCtx.maxScoreNum = 128;
_playerCtx.vBlankFreq = 50;
_playerCtx.frameUnit = (uint16)((1000 * (1<<8)) / _playerCtx.vBlankFreq);
@ -47,11 +62,6 @@ MaxTrax::MaxTrax(int rate, bool stereo)
_playerCtx.tempo = 120;
_playerCtx.tempoTime = 0;
//uint32 uinqueId = 0;
//byte flags = 0;
//uint32 colorClock = kPalSystemClock / 2;
for (int i = 0; i < ARRAYSIZE(_channelCtx); ++i)
resetChannel(_channelCtx[i], (i & 1) != 0);
}
@ -120,21 +130,13 @@ void MaxTrax::interrupt() {
_playerCtx.tempoTicks = 0;
}
break;
/* case 0xA0: // SPECIAL
break;
case 0xB0: // CONTROL
// TODO: controlChange((byte)stopTime, (byte)(stopTime >> 8))
break;
*/ case 0xC0: // PROGRAM
case 0xC0: // PROGRAM
channel.patch = &_patch[stopTime & (kNumPatches - 1)];
break;
case 0xE0: // BEND
channel.pitchBend = ((stopTime & 0x7F00) >> 1) | (stopTime & 0x7f);
// channel.pitchReal = ((int32)(channel.pitchBendRange << 8) * (channel.pitchBend - (64 << 7))) / (64 << 7);
channel.pitchReal = (((int32)channel.pitchBendRange * channel.pitchBend) >> 5) - (channel.pitchBendRange << 8);
channel.isAltered = true;
break;
@ -149,6 +151,9 @@ void MaxTrax::interrupt() {
// stop processing for this tick
goto endOfEventLoop;
case 0xA0: // SPECIAL
case 0xB0: // CONTROL
// TODO: controlChange((byte)stopTime, (byte)(stopTime >> 8))
default:
debug("Unhandled Command");
outPutEvent(*curEvent);
@ -199,7 +204,7 @@ endOfEventLoop:
voice.envelopeLeft = patch.attackLen;
voice.ticksLeft = duration << 8;
voice.status = VoiceContext::kStatusAttack;
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume, duration);
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume, duration, _playerCtx.vBlankFreq);
// Process Envelope
} else {
voice.status = VoiceContext::kStatusSustain;
@ -215,7 +220,7 @@ endOfEventLoop:
voice.envelopeLeft = patch.releaseLen;
voice.ticksLeft = duration << 8;
voice.status = VoiceContext::kStatusDecay;
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume - voice.baseVolume, duration);
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume - voice.baseVolume, duration, _playerCtx.vBlankFreq);
// Process Envelope
} else {
voice.status = VoiceContext::kStatusHalt;
@ -228,11 +233,6 @@ endOfEventLoop:
// Process Envelope
const uint16 envUnit = _playerCtx.frameUnit;
if (voice.envelope) {
// TODO remove paranoid asserts
assert(voice.status != VoiceContext::kStatusSustain);
assert(voice.status == VoiceContext::kStatusAttack || VoiceContext::kStatusRelease);
assert(voice.envelope);
assert(voice.envelopeLeft >= 0);
if (voice.ticksLeft > envUnit) { // envelope still active
voice.baseVolume = (uint16)MIN(MAX(0, voice.baseVolume + voice.incrVolume), 0x8000);
voice.ticksLeft -= envUnit;
@ -245,7 +245,7 @@ endOfEventLoop:
++voice.envelope;
const uint16 duration = voice.envelope->duration;
voice.ticksLeft = duration << 8;
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume - voice.baseVolume, duration);
voice.incrVolume = calcVolumeDelta((int32)voice.envelope->volume - voice.baseVolume, duration, _playerCtx.vBlankFreq);
// Update Volume and Period
} else if (voice.status == VoiceContext::kStatusDecay) {
voice.status = VoiceContext::kStatusHalt;
@ -285,8 +285,8 @@ endOfEventLoop:
}
// Send Audio Packet
Paula::setChannelPeriod(i, (voice.lastPeriod) ? voice.lastPeriod : 1000);
Paula::setChannelVolume(i, (voice.lastPeriod) ? voice.lastVolume : 0);
Paula::setChannelPeriod((byte)i, (voice.lastPeriod) ? voice.lastPeriod : 1000);
Paula::setChannelVolume((byte)i, (voice.lastPeriod) ? voice.lastVolume : 0);
}
for (ChannelContext *c = _channelCtx; c != &_channelCtx[ARRAYSIZE(_channelCtx)]; ++c)
c->isAltered = false;
@ -307,13 +307,6 @@ endOfEventLoop:
}
}
int32 MaxTrax::calcVolumeDelta(int32 delta, uint16 time) {
const int32 div = time * _playerCtx.vBlankFreq;
if (div <= 1000)
return delta; // time to small or 0
return (1000 * delta) / div;
}
void MaxTrax::stopMusic() {
Common::StackLock lock(_mutex);
_playerCtx.musicPlaying = false;
@ -321,7 +314,7 @@ void MaxTrax::stopMusic() {
_playerCtx.nextEvent = 0;
}
bool MaxTrax::playSong(int songIndex, bool loop, int advance) {
bool MaxTrax::playSong(int songIndex, bool loop) {
if (songIndex < 0 || songIndex >= _numScores)
return false;
Common::StackLock lock(_mutex);
@ -334,25 +327,31 @@ bool MaxTrax::playSong(int songIndex, bool loop, int advance) {
_playerCtx.ticks = 0;
for (int i = 0; i < ARRAYSIZE(_voiceCtx); ++i)
killVoice(i);
killVoice((byte)i);
for (int i = 0; i < kNumChannels; ++i)
resetChannel(_channelCtx[i], (i & 1) != 0);
const Event *cev = _scores[songIndex].events;
// Songs are special markers in the score
for (; advance > 0; --advance) {
// TODO - check for boundaries
for (; cev->command != 0xFF && (cev->command != 0xA0 || (cev->stopTime >> 8) != 0x00); ++cev)
; // no end_command or special_command + end
}
_playerCtx.nextEvent = cev;
_playerCtx.nextEventTime = cev->startTime;
_playerCtx.nextEvent = _scores[songIndex].events;;
_playerCtx.nextEventTime = _playerCtx.nextEvent->startTime;
_playerCtx.musicPlaying = true;
Paula::startPaula();
return true;
}
void MaxTrax::advanceSong(int advance) {
Common::StackLock lock(_mutex);
const Event *cev = _playerCtx.nextEvent;
if (cev) {
for (; advance > 0; --advance) {
// TODO - check for boundaries
for (; cev->command != 0xFF && (cev->command != 0xA0 || (cev->stopTime >> 8) != 0x00); ++cev)
; // no end_command or special_command + end
}
_playerCtx.nextEvent = cev;
}
}
void MaxTrax::killVoice(byte num) {
VoiceContext &voice = _voiceCtx[num];
if (voice.channel)
@ -742,6 +741,48 @@ bool MaxTrax::load(Common::SeekableReadStream &musicData, bool loadScores, bool
return true;
}
#ifndef NDEBUG
void MaxTrax::outPutEvent(const Event &ev, int num) {
struct {
byte cmd;
const char *name;
const char *param;
} COMMANDS[] = {
{0x80, "TEMPO ", "TEMPO, N/A "},
{0xa0, "SPECIAL ", "CHAN, SPEC # | VAL"},
{0xb0, "CONTROL ", "CHAN, CTRL # | VAL"},
{0xc0, "PROGRAM ", "CHANNEL, PROG # "},
{0xe0, "BEND ", "CHANNEL, BEND VALUE"},
{0xf0, "SYSEX ", "TYPE, SIZE "},
{0xf8, "REALTIME", "REALTIME, N/A "},
{0xff, "END ", "N/A, N/A "},
{0xff, "NOTE ", "VOL | CHAN, STOP"},
};
int i = 0;
for (; i < ARRAYSIZE(COMMANDS) - 1 && ev.command != COMMANDS[i].cmd; ++i)
;
if (num == -1)
debug("Event : %02X %s %s %02X %04X %04X", ev.command, COMMANDS[i].name, COMMANDS[i].param, ev.parameter, ev.startTime, ev.stopTime);
else
debug("Event %3d: %02X %s %s %02X %04X %04X", num, ev.command, COMMANDS[i].name, COMMANDS[i].param, ev.parameter, ev.startTime, ev.stopTime);
}
void MaxTrax::outPutScore(const Score &sc, int num) {
if (num == -1)
debug("score : %i Events", sc.numEvents);
else
debug("score %2d: %i Events", num, sc.numEvents);
for (uint i = 0; i < sc.numEvents; ++i)
outPutEvent(sc.events[i], i);
debug("");
}
#else
void MaxTrax::outPutEvent(const Event &ev, int num) {}
void MaxTrax::outPutScore(const Score &sc, int num) {}
#endif // #ifndef NDEBUG
} // End of namespace Audio
#endif // #if defined(ENABLE_KYRA)
#endif // #if defined(SOUND_MODS_MAXTRAX_H)

View File

@ -41,7 +41,8 @@ public:
virtual ~MaxTrax();
bool load(Common::SeekableReadStream &musicData, bool loadScores = true, bool loadSamples = true);
bool playSong(int songIndex, bool loop = false, int advance = 0);
bool playSong(int songIndex, bool loop = false);
void advanceSong(int advance = 1);
int playNote(byte note, byte patch, uint16 duration, uint16 volume, bool rightSide);
void setVolume(const byte volume) { _playerCtx.volume = volume; }
void setTempo(const uint16 tempo) {
@ -143,8 +144,7 @@ private:
kFlagDamper = 1 << 2,
kFlagMono = 1 << 3,
// kFlagMicrotonal = 1 << 4,
kFlagModVolume = 1 << 5//,
//kFlagAltered = 1 << 6
kFlagModVolume = 1 << 5
};
byte flags;
bool isAltered;
@ -205,52 +205,13 @@ private:
void resetChannel(ChannelContext &chan, bool rightChannel);
static int8 pickvoice(const VoiceContext voice[4], uint pick, int16 pri);
int32 calcVolumeDelta(int32 delta, uint16 time);
static uint16 calcNote(const VoiceContext &voice);
int8 noteOn(ChannelContext &channel, byte note, uint16 volume, uint16 pri);
void noteOff(VoiceContext &voice, byte note);
void killVoice(byte num);
static int32 precalcNote(byte baseNote, int16 tune, byte octave) {
return 0x9fd77 + 0x3C000 + (1 << 16) - ((baseNote << 14) + (tune << 11) / 3) / 3 - (octave << 16);
}
static void outPutEvent(const Event &ev, int num = -1) {
struct {
byte cmd;
const char *name;
const char *param;
} COMMANDS[] = {
{0x80, "TEMPO ", "TEMPO, N/A "},
{0xa0, "SPECIAL ", "CHAN, SPEC # | VAL"},
{0xb0, "CONTROL ", "CHAN, CTRL # | VAL"},
{0xc0, "PROGRAM ", "CHANNEL, PROG # "},
{0xe0, "BEND ", "CHANNEL, BEND VALUE"},
{0xf0, "SYSEX ", "TYPE, SIZE "},
{0xf8, "REALTIME", "REALTIME, N/A "},
{0xff, "END ", "N/A, N/A "},
{0xff, "NOTE ", "VOL | CHAN, STOP"},
};
int i = 0;
for (; i < ARRAYSIZE(COMMANDS) - 1 && ev.command != COMMANDS[i].cmd; ++i)
;
if (num == -1)
debug("Event : %02X %s %s %02X %04X %04X", ev.command, COMMANDS[i].name, COMMANDS[i].param, ev.parameter, ev.startTime, ev.stopTime);
else
debug("Event %3d: %02X %s %s %02X %04X %04X", num, ev.command, COMMANDS[i].name, COMMANDS[i].param, ev.parameter, ev.startTime, ev.stopTime);
}
static void outPutScore(const Score &sc, int num = -1) {
if (num == -1)
debug("score : %i Events", sc.numEvents);
else
debug("score %2d: %i Events", num, sc.numEvents);
for (uint i = 0; i < sc.numEvents; ++i)
outPutEvent(sc.events[i], i);
debug("");
}
static void outPutEvent(const Event &ev, int num = -1);
static void outPutScore(const Score &sc, int num = -1);
};
} // End of namespace Audio

View File

@ -1177,5 +1177,5 @@ void displayPatternstep(const void *const vptr) {}
#endif
} // End of namespace
#endif // #if defined(ENABLE_SCUMM)
#endif // #if defined(SOUND_MODS_TFMX_H)