scummvm/tfmx/tfmxplayer.cpp
Norbert Lange e3a5da7b7e engines/scumm/*: enabled choosing of the colorpalette, by setting RenderMode to EGA the "old" palette will be used
tfmx/tfmxplayer.cpp: removed some unused stuff
sound/mods/tfmx.cpp: emulating the way MI initialises new macro-programms. (Difference might not be audible at all)

svn-id: r41976
2009-06-30 17:41:24 +00:00

170 lines
3.8 KiB
C++

#include "common/scummsys.h"
#include "common/system.h"
#include "common/stream.h"
#include "common/file.h"
#include "common/fs.h"
#include "common/endian.h"
#include "common/debug.h"
#include "sound/mixer.h"
#include "sound/mods/protracker.h"
#include "sound/mods/tfmx.h"
#include "tfmx/tfmxdebug.h"
#define FILEDIR ""
using namespace Common;
#define MUSICFILE "mdat.monkey"
#define SAMPLEFILE "smpl.monkey"
Audio::Tfmx *loadTfmxfile(const char *mdatName, const char *sampleName) {
FSNode fileDir(FILEDIR);
FSNode musicNode = fileDir.getChild(mdatName);
FSNode sampleNode = fileDir.getChild(sampleName);
SeekableReadStream *musicIn = musicNode.createReadStream();
if (0 == musicIn) {
debug("Couldnt load file %s", MUSICFILE);
return 0;
}
SeekableReadStream *sampleIn = sampleNode.createReadStream();
if (0 == sampleIn) {
debug("Couldnt load file %s", SAMPLEFILE);
delete musicIn;
return 0;
}
Audio::Tfmx *player = new Audio::Tfmx(44100, true);
player->load(*musicIn, *sampleIn);
delete musicIn;
delete sampleIn;
return player;
}
void runFlac(int chan, int bits, int sr, const char *fileName);
void tfmxmain(const int argc, const char *const argv[]) {
debug("Started Scumm&VM");
debug("Sound celebrating utility for monkey melodies & Various Malfunctions");
debug("");
//simplePlaybacktest(argc, argv);
Audio::Tfmx *player = loadTfmxfile(MUSICFILE, SAMPLEFILE);
if (!player) {
debug("couldnt create TFMX-Player");
return;
}
int i = 1;
int playflag = 1;
bool hasCmd = false;
while (i < argc && argv[i][0] == '-') {
int param;
if (!strcmp("-m", argv[i])) {
if (i + 1 < argc) {
param = atoi(argv[++i]);
debug( "play Macro %02X", param);
dumpMacro(*player, param);
player->doMacro(0x1B, param);
hasCmd = true;
}
} else if (!strcmp("-s", argv[i])) {
if (i + 1 < argc) {
param = atoi(argv[++i]);
debug( "play Song %02X", param);
dumpTrackstepsBySong(*player, param);
player->doSong(param);
hasCmd = true;
}
} else if (!strcmp("-c", argv[i])) {
if (i + 1 < argc) {
param = atoi(argv[++i]);
debug( "play custom %02X", param);
if (player->getSongIndex() < 0)
player->doSong(0x18);
player->doSfx(param);
hasCmd = true;
}
} else if (!strcmp("-flac", argv[i])) {
playflag = 2;
} else if (!strcmp("-hack-patternstop", argv[i]))
player->_playerCtx.stopWithLastPattern = true;
++i;
}
if (!hasCmd) {
player->doSong(4);
dumpTrackstepsBySong(*player, 4);
}
#if 0
int16 buf[2 * 1024];
while( true)
player->readBuffer(buf, ARRAYSIZE(buf));
#endif
int maxsecs = 10 * 60;
if (playflag == 1) {
// get Mixer, assume this never fails
Audio::Mixer *mixer = g_system->getMixer();
Audio::SoundHandle soundH;
mixer->playInputStream(Audio::Mixer::kMusicSoundType, &soundH, player);
while (mixer->isSoundHandleActive(soundH) && --maxsecs)
g_system->delayMillis(1000);
// player->AllOff();
// while (mixer->isSoundHandleActive(soundH));
mixer->stopHandle(soundH);
player = 0;
}
if (playflag == 2) {
Common::FSNode file("out.raw");
WriteStream *wav = file.createWriteStream();
int16 buf[2 * 1024];
int32 maxsamples = (maxsecs <= 0) ? 0 : maxsecs * 44100;
while (!player->endOfData() && maxsamples > 0) {
int read = player->readBuffer(buf, ARRAYSIZE(buf));
wav->write(buf, read * 2);
maxsamples -= read/2;
}
delete wav;
runFlac(2, 16, 44100, "out.raw");
}
#ifdef _MSC_VER
printf("\npress a key");
getc(stdin);
#endif
delete player;
}
void runFlac( int chan, int bits, int sr, const char *fileName) {
const char *format = "flac --endian="
#ifdef SCUMM_BIG_ENDIAN
"big"
#else
"little"
#endif
" --channels=%d -f --bps=%d --sample-rate=%d --sign=signed --force-raw-format %s";
char cmd[1024];
sprintf(cmd, format, chan, bits, sr, fileName);
debug(cmd);
system(cmd);
}