aboutsummaryrefslogtreecommitdiff
path: root/utils/midiplay/adlmidiplay.cpp
diff options
context:
space:
mode:
authorVitaly Novichkov <Wohlstand@users.noreply.github.com>2018-07-10 21:13:05 +0300
committerGitHub <noreply@github.com>2018-07-10 21:13:05 +0300
commit988a55880c0634020b01c8c7942b2aa29b732196 (patch)
treee67bfd2f7a2c8d746c6e6051da8dc7bcc67d920e /utils/midiplay/adlmidiplay.cpp
parentb1b27f8af15196a1f14aefdc961e3aa664c8b7b0 (diff)
parent9fbf6b6240def0a0b6d5320f8e9e6a9a15945fe4 (diff)
downloadlibADLMIDI-988a55880c0634020b01c8c7942b2aa29b732196.tar.gz
libADLMIDI-988a55880c0634020b01c8c7942b2aa29b732196.tar.bz2
libADLMIDI-988a55880c0634020b01c8c7942b2aa29b732196.zip
Merge pull request #135 from jpcima/midiplay-only
midiplay: add argument --only
Diffstat (limited to 'utils/midiplay/adlmidiplay.cpp')
-rw-r--r--utils/midiplay/adlmidiplay.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp
index 8f499df..16a9dde 100644
--- a/utils/midiplay/adlmidiplay.cpp
+++ b/utils/midiplay/adlmidiplay.cpp
@@ -6,6 +6,7 @@
#include <cstring>
#include <cstdarg>
#include <deque>
+#include <vector>
#include <algorithm>
#include <signal.h>
@@ -243,6 +244,8 @@ int main(int argc, char **argv)
" -nl Quit without looping\n"
" -w Write WAV file rather than playing\n"
" -mb Run the test of multibank over embedded. 62, 14, 68, and 74'th banks will be combined into one\n"
+ " --solo <track> Selects a solo track to play\n"
+ " --only <track1,...,trackN> Selects a subset of tracks to play\n"
#ifndef HARDWARE_OPL3
" --emu-nuked Uses Nuked OPL3 v 1.8 emulator\n"
" --emu-nuked7 Uses Nuked OPL3 v 1.7.4 emulator\n"
@@ -343,6 +346,7 @@ int main(int argc, char **argv)
#endif
size_t soloTrack = ~(size_t)0;
+ std::vector<size_t> onlyTracks;
#if !defined(HARDWARE_OPL3) && !defined(OUTPUT_WAVE_ONLY)
g_audioFormat.type = ADLMIDI_SampleType_S16;
@@ -417,6 +421,31 @@ int main(int argc, char **argv)
soloTrack = std::strtoul(argv[3], NULL, 0);
had_option = true;
}
+ else if(!std::strcmp("--only", argv[2]))
+ {
+ if(argc <= 3)
+ {
+ printError("The option --only requires an argument!\n");
+ return 1;
+ }
+
+ const char *strp = argv[3];
+ unsigned long value;
+ unsigned size;
+ bool err = std::sscanf(strp, "%lu%n", &value, &size) != 1;
+ while(!err && *(strp += size))
+ {
+ onlyTracks.push_back(value);
+ err = std::sscanf(strp, ",%lu%n", &value, &size) != 1;
+ }
+ if(err)
+ {
+ printError("Invalid argument to --only!\n");
+ return 1;
+ }
+ onlyTracks.push_back(value);
+ had_option = true;
+ }
else break;
@@ -608,6 +637,21 @@ int main(int argc, char **argv)
adl_setTrackOptions(myDevice, soloTrack, ADLMIDI_TrackOption_Solo);
}
+ if(!onlyTracks.empty())
+ {
+ size_t count = adl_trackCount(myDevice);
+ for(size_t track = 0; track < count; ++track)
+ adl_setTrackOptions(myDevice, track, ADLMIDI_TrackOption_Off);
+ std::fprintf(stdout, " - Only tracks:");
+ for(size_t i = 0, n = onlyTracks.size(); i < n; ++i)
+ {
+ size_t track = onlyTracks[i];
+ adl_setTrackOptions(myDevice, track, ADLMIDI_TrackOption_On);
+ std::fprintf(stdout, " %lu", (unsigned long)track);
+ }
+ std::fprintf(stdout, "\n");
+ }
+
std::fprintf(stdout, " - File [%s] opened!\n", musPath.c_str());
flushout(stdout);