diff options
author | Norbert Lange | 2009-07-04 16:24:15 +0000 |
---|---|---|
committer | Norbert Lange | 2009-07-04 16:24:15 +0000 |
commit | c0b1d10ba2eeb75d614d24b984333507cba8e20f (patch) | |
tree | b1e0fcf7057718512f45b492f922f029bfde07d4 /tfmx | |
parent | d2003f859b07389e788d03b099b3478282d04320 (diff) | |
download | scummvm-rg350-c0b1d10ba2eeb75d614d24b984333507cba8e20f.tar.gz scummvm-rg350-c0b1d10ba2eeb75d614d24b984333507cba8e20f.tar.bz2 scummvm-rg350-c0b1d10ba2eeb75d614d24b984333507cba8e20f.zip |
Added tons of members to MaxTrax, songs get fully loaded and stored internally
svn-id: r42096
Diffstat (limited to 'tfmx')
-rw-r--r-- | tfmx/mxtxplayer.cpp | 262 | ||||
-rw-r--r-- | tfmx/tfmxplayer.cpp | 4 |
2 files changed, 97 insertions, 169 deletions
diff --git a/tfmx/mxtxplayer.cpp b/tfmx/mxtxplayer.cpp index d8ba6a8fcb..f2cc0ce6bc 100644 --- a/tfmx/mxtxplayer.cpp +++ b/tfmx/mxtxplayer.cpp @@ -11,199 +11,113 @@ #if defined(MXTX_CMDLINE_TOOL) -// #include "tfmx/tfmxdebug.h" - #define FILEDIR "" using namespace Common; #define MUSICFILE "introscr.mx" +#define SAMPLEFILE "introinst.mx" -bool load(Common::SeekableReadStream &musicData) { - bool res = false; - - char buf[2 * 1024]; - uint16 tempo, flags; - uint16 numScores; - - // 0x0000: 4 Bytes Header "MXTX" - // 0x0004: uint16 tempo - // 0x0006: uint16 flags. bit0 = lowpassfilter, bit1 = attackvolume, bit15 = microtonal - musicData.read(buf, 4); - tempo = musicData.readUint16BE(); - flags = musicData.readUint16BE(); - buf[4] = '\0'; - debug("Header: %s %02X %02X", buf, tempo, flags); - - if (flags & (1 << 15)) { - // uint16 microtonal[128] - musicData.skip(128 * 2); - } - - // uint16 number of Scores - numScores = musicData.readUint16BE(); - debug("#Scores: %d", numScores); - int scoresLoaded = 0; - byte *scorePtr; // array of scorestructures - for (int i = 0; i < numScores; ++i) { - uint32 numEvents = musicData.readUint32BE(); - uint32 dataLength = numEvents * 6; - const int scoremax = 128; // some variable which is set upon initialisation of player - if (scoresLoaded < scoremax) { - // allocate dataLength zeroed bytes - // increase _globaldata+glob_TotalScores and _maxtrax+mxtx_TotalScores - // load events data - debug("score %i: %i Events", scoresLoaded, numEvents); - for (int j = 0; j < numEvents; ++j) { - byte command, data; - uint16 startTime, stopTime; - command = musicData.readByte(); - data = musicData.readByte(); - startTime = musicData.readUint16BE(); - stopTime = musicData.readUint16BE(); - debug("cmd, data, start, stop: %02X, %02X, %04X, %04X", command, data, startTime, stopTime); - - } - debug(""); - // store pointer to events and # events in scorePtr, then increase scorePtr by structsize - scoresLoaded++; - } else - musicData.skip(dataLength); +Audio::MaxTrax *loadMtmxfile(const char *mdatName, const char *smplName) { + FSNode fileDir(FILEDIR); + FSNode musicNode = fileDir.getChild(mdatName); + FSNode sampleNode = fileDir.getChild(smplName); + SeekableReadStream *musicIn = musicNode.createReadStream(); + if (0 == musicIn) { + debug("Couldnt load file %s", mdatName); + return 0; } - uint16 numSamples; - // uint16 number of Samples - numSamples = musicData.readUint16BE(); - for (int i = 0; i < numSamples; ++i) { - // load disksample structure - uint16 number = musicData.readUint16BE(); - uint16 tune = musicData.readUint16BE(); - uint16 volume = musicData.readUint16BE(); - uint16 octaves = musicData.readUint16BE(); - uint32 attackLen = musicData.readUint32BE(); - uint32 sustainLen = musicData.readUint32BE(); - uint16 attackCount = musicData.readUint16BE(); - uint16 releaseCount = musicData.readUint16BE(); - - byte *samplePtr = 0; // samplestructure ptrs - samplePtr += number; - - byte *patchPtr = 0; // array of patchstructs - patchPtr += number; - - // Tune and Volume Info - // copy tune, volume to patch_Tune, patch_Volume - - // Attack Segment - int attacksize = attackCount * 4; - // allocate attacksize bytes - // store allocated Ptr in patch_Attack - // store attackCount in patch_AttackCount - - // read attack segment - for (int j = 0; j < attackCount; ++j) { - uint16 envDuration = musicData.readUint16BE(); - uint16 envVolume = musicData.readUint16BE(); - // store into patch_Attack - } + Audio::MaxTrax *mxtxPlay = new Audio::MaxTrax(44100, true); - // Release Segment - int releasesize = releaseCount * 4; - // allocate releasesize bytes - // store allocated Ptr in patch_Release - // store attackCount in patch_ReleaseCount - - // read release segment - for (int j = 0; j < releaseCount; ++j) { - uint16 envDuration = musicData.readUint16BE(); - uint16 envVolume = musicData.readUint16BE(); - // store into patch_Release + if (!strcmp(mdatName, smplName)) { + SeekableReadStream *sampleIn = sampleNode.createReadStream(); + if (0 == sampleIn) { + debug("Couldnt load file %s", smplName); + delete musicIn; + return 0; } + mxtxPlay->load(*musicIn, true, false); + mxtxPlay->load(*sampleIn, false, true); + delete sampleIn; + } else { + mxtxPlay->load(*musicIn, true, true); + } + delete musicIn; + return mxtxPlay; +} +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 malcoms menace & Various Malfunctions"); + debug(""); + Audio::MaxTrax *player = loadMtmxfile(MUSICFILE, SAMPLEFILE); + if (!player) { + debug("couldnt create MXTX-Player"); + return; + } + int i = 1; + int playflag = 1; + bool hasCmd = false; + + + while (i < argc && argv[i][0] == '-') { + int param; + if (!strcmp("-s", argv[i])) { + if (i + 1 < argc) { + param = atoi(argv[++i]); + debug( "play Song %02X", param); + + hasCmd = true; + } + } else if (!strcmp("-flac", argv[i])) { + playflag = 2; + } + ++i; + } + if (!hasCmd) { + } + 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; } - /* - - STRUCTURE PatchData,0 - APTR patch_Sample ; Amiga sample data - APTR patch_Attack ; array of env. segments - APTR patch_Release ; array of env. segments - WORD patch_AttackCount ; number of attack env. - WORD patch_ReleaseCount ; number of release env. - WORD patch_Volume ; sample volume - WORD patch_Tune ; sample tuning - BYTE patch_Number ; self-identifing - BYTE patch_pad - LABEL patch_sizeof - - STRUCTURE DiskSample,0 - WORD dsamp_Number - WORD dsamp_Tune - WORD dsamp_Volume - WORD dsamp_Octaves - LONG dsamp_AttackLength - LONG dsamp_SustainLength - WORD dsamp_AttackCount - WORD dsamp_ReleaseCount - LABEL dsamp_sizeof - - STRUCTURE CookedEvent,0 - BYTE cev_Command - BYTE cev_Data - WORD cev_StartTime - WORD cev_StopTime - LABEL cev_sizeof - - STRUCTURE EnvelopeData,0 - WORD env_Duration ; duration in milliseconds - WORD env_Volume ; volume of envelope - LABEL env_sizeof - - STRUCTURE SampleData,0 - APTR samp_NextSample - APTR samp_Waveform - LONG samp_AttackSize - LONG samp_SustainSize - LABEL samp_sizeof - */ - return res; -} + 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; -void *loadMtmxfile(const char *mdatName) { - FSNode fileDir(FILEDIR); - FSNode musicNode = fileDir.getChild(mdatName); - SeekableReadStream *musicIn = musicNode.createReadStream(); - if (0 == musicIn) { - debug("Couldnt load file %s", mdatName); - return 0; + runFlac(2, 16, 44100, "out.raw"); } - - load(*musicIn); - - - delete musicIn; - - return 0; -} - -void modcmdmain(const int argc, const char *const argv[]) { - debug("Started Scumm&VM"); - debug("Sound celebrating utility for malcoms menace & Various Malfunctions"); - debug(""); - - loadMtmxfile(MUSICFILE); + delete player; #ifdef _MSC_VER printf("\npress a key"); @@ -211,4 +125,18 @@ void modcmdmain(const int argc, const char *const argv[]) { #endif } +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(MXTX_CMDLINE_TOOL)
\ No newline at end of file diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp index 7dddb9fd88..16b71c5496 100644 --- a/tfmx/tfmxplayer.cpp +++ b/tfmx/tfmxplayer.cpp @@ -26,13 +26,13 @@ Audio::Tfmx *loadTfmxfile(const char *mdatName, const char *sampleName) { FSNode sampleNode = fileDir.getChild(sampleName); SeekableReadStream *musicIn = musicNode.createReadStream(); if (0 == musicIn) { - debug("Couldnt load file %s", MUSICFILE); + debug("Couldnt load file %s", mdatName); return 0; } SeekableReadStream *sampleIn = sampleNode.createReadStream(); if (0 == sampleIn) { - debug("Couldnt load file %s", SAMPLEFILE); + debug("Couldnt load file %s", sampleName); delete musicIn; return 0; } |