aboutsummaryrefslogtreecommitdiff
path: root/tfmx/tfmxplayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tfmx/tfmxplayer.cpp')
-rw-r--r--tfmx/tfmxplayer.cpp201
1 files changed, 201 insertions, 0 deletions
diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp
new file mode 100644
index 0000000000..dce7d6180c
--- /dev/null
+++ b/tfmx/tfmxplayer.cpp
@@ -0,0 +1,201 @@
+#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;
+
+void simplePlaybacktest(int argc, const char *const argv[]) {
+ const char *modFilename = "mod.protracker";
+ if (argc == 2)
+ modFilename = argv[1];
+
+
+ // get Mixer, assume this never fails
+ Audio::Mixer *mixer = g_system->getMixer();
+
+ FSNode fileDir(FILEDIR);
+ debug( "searching for Files in Directory: %s", fileDir.getPath().c_str());
+
+ FSNode musicFile = fileDir.getChild(modFilename);
+
+ SeekableReadStream *fileIn = musicFile.createReadStream();
+ if (0 == fileIn) {
+ debug( "cant open File %s", musicFile.getName().c_str());
+ return;
+ }
+
+ Audio::AudioStream *stream = Audio::makeProtrackerStream(fileIn);
+ delete fileIn;
+ if (0 == stream) {
+ debug( "cant open File %s as Protacker-Stream", musicFile.getName().c_str());
+ return;
+ }
+
+ Audio::SoundHandle soundH;
+
+ mixer->playInputStream(Audio::Mixer::kMusicSoundType, &soundH, stream);
+ while (mixer->isSoundHandleActive(soundH))
+ g_system->delayMillis(1000);
+
+
+ //mixer->stopAll();
+}
+
+#define MUSICFILE "mdat.monkey"
+#define SAMPLEFILE "smpl.monkey"
+
+//#define MUSICFILE "mdat.tworld_1"
+//#define SAMPLEFILE "smpl.tworld_1"
+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 = 0;
+
+
+ if (i < argc && argv[i][0] == '-' && strlen(argv[i]) == 2) {
+ int param;
+ switch (argv[i++][1]) {
+ case 'm':
+ if (i < argc) {
+ param = atoi(argv[i]);
+ debug( "play Macro %02X", param);
+ dumpMacro(*player, 0x11);
+ playflag = 1;
+ player->doMacro(param,0x40);
+ ++i;
+ }
+ break;
+ case 's':
+ if (i < argc) {
+ param = atoi(argv[i]);
+ debug( "play Song %02X", param);
+ dumpTrackstepsBySong(*player, param);
+ playflag = 1;
+ player->doSong(param);
+ ++i;
+ }
+ }
+ }
+
+ if (!playflag) {
+ playflag = 1;
+ //player->doMacro(20,0x40);
+ player->doSong(4);
+ dumpTrackstepsBySong(*player, 4);
+ }
+
+
+
+
+#if 0
+ int16 buf[2 * 1024];
+
+ while( true)
+ player->readBuffer(buf, ARRAYSIZE(buf));
+#endif
+ int maxsecs = 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);
+}
+
+