aboutsummaryrefslogtreecommitdiff
path: root/tfmx/tfmxplayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tfmx/tfmxplayer.cpp')
-rw-r--r--tfmx/tfmxplayer.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp
new file mode 100644
index 0000000000..16b71c5496
--- /dev/null
+++ b/tfmx/tfmxplayer.cpp
@@ -0,0 +1,171 @@
+#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/tfmx.h"
+
+#if defined(TFMX_CMDLINE_TOOL)
+
+#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", mdatName);
+ return 0;
+ }
+
+ SeekableReadStream *sampleIn = sampleNode.createReadStream();
+ if (0 == sampleIn) {
+ debug("Couldnt load file %s", sampleName);
+ 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 modcmdmain(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);
+}
+
+#endif // #if defined(TFMX_CMDLINE_TOOL)