aboutsummaryrefslogtreecommitdiff
path: root/utils/midiplay
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2022-10-25 04:58:04 +0300
committerWohlstand <admin@wohlnet.ru>2022-10-25 04:58:04 +0300
commitfd46308b2771da575387c5b7e87f3c917e65a695 (patch)
treebc4a888618bbf5bc733d0b6967853498fdc8f57f /utils/midiplay
parent24855412cd0a5e2dcf4ac8b62888d115cd20b3f0 (diff)
downloadlibADLMIDI-fd46308b2771da575387c5b7e87f3c917e65a695.tar.gz
libADLMIDI-fd46308b2771da575387c5b7e87f3c917e65a695.tar.bz2
libADLMIDI-fd46308b2771da575387c5b7e87f3c917e65a695.zip
midiplay: Added Linux-only song switch for debug purposes
Diffstat (limited to 'utils/midiplay')
-rw-r--r--utils/midiplay/CMakeLists.txt6
-rw-r--r--utils/midiplay/adlmidiplay.cpp92
2 files changed, 97 insertions, 1 deletions
diff --git a/utils/midiplay/CMakeLists.txt b/utils/midiplay/CMakeLists.txt
index 98f888a..52d0128 100644
--- a/utils/midiplay/CMakeLists.txt
+++ b/utils/midiplay/CMakeLists.txt
@@ -24,6 +24,8 @@ if(WIN32 AND NOT USE_SDL2_AUDIO)
)
endif()
+option(DEBUG_SONG_SWITCHING "Enable song switching by left and right keys (Linux only)" OFF)
+
add_executable(adlmidiplay ${ADLMIDI_PLAY_SRC})
if(USE_SDL2_AUDIO)
@@ -34,6 +36,10 @@ endif()
set_nopie(adlmidiplay)
+if(DEBUG_SONG_SWITCHING)
+ target_compile_definitions(adlmidiplay PRIVATE DEBUG_SONG_SWITCHING)
+endif()
+
if(MIDIPLAY_WAVE_ONLY)
target_compile_definitions(adlmidiplay PUBLIC OUTPUT_WAVE_ONLY)
message("Demo tool will only output WAVE file, no playing support.")
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp
index 8620446..ce3a2d3 100644
--- a/utils/midiplay/adlmidiplay.cpp
+++ b/utils/midiplay/adlmidiplay.cpp
@@ -35,6 +35,52 @@
#include <signal.h>
#include <stdint.h>
+#ifdef DEBUG_SONG_SWITCHING
+#include <unistd.h>
+#include <sys/select.h>
+#include <termios.h>
+
+struct termios orig_termios;
+
+void reset_terminal_mode()
+{
+ tcsetattr(0, TCSANOW, &orig_termios);
+}
+
+void set_conio_terminal_mode()
+{
+ struct termios new_termios;
+
+ /* take two copies - one for now, one for later */
+ tcgetattr(0, &orig_termios);
+ memcpy(&new_termios, &orig_termios, sizeof(new_termios));
+
+ /* register cleanup handler, and set the new terminal mode */
+ atexit(reset_terminal_mode);
+ cfmakeraw(&new_termios);
+ tcsetattr(0, TCSANOW, &new_termios);
+}
+
+int kbhit()
+{
+ struct timeval tv = { 0L, 0L };
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(0, &fds);
+ return select(1, &fds, NULL, NULL, &tv) > 0;
+}
+
+int getch()
+{
+ int r;
+ unsigned char c;
+ if ((r = read(0, &c, sizeof(c))) < 0)
+ return r;
+ else
+ return c;
+}
+#endif
+
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
@@ -887,6 +933,12 @@ int main(int argc, char **argv)
if(songNumLoad >= 0)
adl_selectSongNum(myDevice, songNumLoad);
+#ifdef DEBUG_SONG_SWITCHING
+ set_conio_terminal_mode();
+ if(songNumLoad < 0)
+ songNumLoad = 0;
+#endif
+
std::string musPath = argv[1];
//Open MIDI file to play
if(adl_openFile(myDevice, musPath.c_str()) != 0)
@@ -900,8 +952,12 @@ int main(int argc, char **argv)
std::fprintf(stdout, " - Track count: %lu\n", static_cast<unsigned long>(adl_trackCount(myDevice)));
std::fprintf(stdout, " - Volume model: %s\n", volume_model_to_str(adl_getVolumeRangeModel(myDevice)));
std::fprintf(stdout, " - Channel allocation mode: %s\n", chanalloc_to_str(adl_getChannelAllocMode(myDevice)));
+
+ int songsCount = adl_getSongsCount(myDevice);
if(songNumLoad >= 0)
- std::fprintf(stdout, " - Attempt to load song number: %d\n", songNumLoad);
+ std::fprintf(stdout, " - Attempt to load song number: %d / %d\n", songNumLoad, songsCount);
+ else if(songsCount > 0)
+ std::fprintf(stdout, " - File contains %d song(s)\n", songsCount);
if(soloTrack != ~static_cast<size_t>(0))
{
@@ -1069,6 +1125,40 @@ int main(int argc, char **argv)
audio_delay(1);
}
+# ifdef DEBUG_SONG_SWITCHING
+ if(kbhit())
+ {
+ int code = getch();
+ if(code == '\033' && kbhit())
+ {
+ getch();
+ switch(getch())
+ {
+ case 'C':
+ // code for arrow right
+ songNumLoad++;
+ if(songNumLoad >= songsCount)
+ songNumLoad = songsCount;
+ adl_selectSongNum(myDevice, songNumLoad);
+ std::fprintf(stdout, "\rSwitching song to %d/%d... \r\n", songNumLoad, songsCount);
+ flushout(stdout);
+ break;
+ case 'D':
+ // code for arrow left
+ songNumLoad--;
+ if(songNumLoad < 0)
+ songNumLoad = 0;
+ adl_selectSongNum(myDevice, songNumLoad);
+ std::fprintf(stdout, "\rSwitching song to %d/%d... \r\n", songNumLoad, songsCount);
+ flushout(stdout);
+ break;
+ }
+ }
+ else if(code == 27) // Quit by ESC key
+ stop = 1;
+ }
+# endif
+
# ifdef DEBUG_SEEKING_TEST
if(delayBeforeSeek-- <= 0)
{