diff options
Diffstat (limited to 'engines/scumm/imuse/sysex_samnmax.cpp')
-rw-r--r-- | engines/scumm/imuse/sysex_samnmax.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/engines/scumm/imuse/sysex_samnmax.cpp b/engines/scumm/imuse/sysex_samnmax.cpp new file mode 100644 index 0000000000..837fc65afa --- /dev/null +++ b/engines/scumm/imuse/sysex_samnmax.cpp @@ -0,0 +1,78 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "common/stdafx.h" +#include "common/util.h" + +/* + * SysEx command handlers must have full access to the + * internal IMuse implementation classes. Before including + * the relevant header file, two things must happen: + * 1. A function declaration must be made. + * 2. The following #define must be established: + * #define SYSEX_CALLBACK_FUNCTION functionName + */ +#define SYSEX_CALLBACK_FUNCTION sysexHandler_SamNMax +#include "scumm/imuse/imuse_internal.h" + +namespace Scumm { + +extern void sysexHandler_Scumm (Player *, const byte *, uint16); + +void sysexHandler_SamNMax (Player *player, const byte *msg, uint16 len) { + Part *part; + byte a; + + IMuseInternal *se = player->_se; + const byte *p = msg; + + switch (*p++) { + case 0: + // Trigger Event + // Triggers are set by doCommand(ImSetTrigger). + // When a SysEx marker is encountered whose sound + // ID and marker ID match what was set by ImSetTrigger, + // something magical is supposed to happen.... + for (a = 0; a < ARRAYSIZE(se->_snm_triggers); ++a) { + if (se->_snm_triggers[a].sound == player->_id && + se->_snm_triggers[a].id == *p) + { + se->_snm_triggers[a].sound = se->_snm_triggers[a].id = 0; + se->doCommand(8, se->_snm_triggers[a].command); + break; + } + } + break; + + case 1: + // maybe_jump. + if (player->_scanning) + break; + player->maybe_jump(p[0], p[1] - 1, (READ_BE_UINT16(p + 2) - 1) * 4 + p[4], ((p[5] * TICKS_PER_BEAT) >> 2) + p[6]); + break; + + default: + sysexHandler_Scumm (player, msg, len); + } +} + +} // End of namespace Scumm |