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
170 lines
3.8 KiB
C++
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);
|
|
}
|
|
|
|
|