From cfe89ef6e66c2334e111208ed1de47a3a79cf182 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 28 Sep 2019 18:32:25 +0200 Subject: [PATCH] - created a new zmusic library which will eventually contain all the music playback code. Currently all it contains are the MIDI sources and the MIDI devices, the rest needs to be reworked first. --- CMakeLists.txt | 2 + libraries/oplsynth/oplsynth/oplio.h | 1 + libraries/zmusic/CMakeLists.txt | 58 ++++ .../utility => libraries/zmusic}/i_module.cpp | 0 {src/utility => libraries/zmusic}/i_module.h | 0 .../zmusic}/mididevices/mididevice.h | 21 +- .../mididevices/music_adlmidi_mididevice.cpp | 0 .../mididevices/music_base_mididevice.cpp | 0 .../music_fluidsynth_mididevice.cpp | 8 +- .../mididevices/music_opl_mididevice.cpp | 2 +- .../mididevices/music_opnmidi_mididevice.cpp | 0 .../music_softsynth_mididevice.cpp | 2 + .../mididevices/music_timidity_mididevice.cpp | 8 +- .../music_timiditypp_mididevice.cpp | 0 .../music_wavewriter_mididevice.cpp | 4 +- .../mididevices/music_wildmidi_mididevice.cpp | 0 .../mididevices/music_win_mididevice.cpp | 4 +- .../zmusic}/midisources/midisource.cpp | 0 .../zmusic}/midisources/midisource.h | 4 +- .../zmusic}/midisources/midisource_hmi.cpp | 3 +- .../zmusic}/midisources/midisource_mus.cpp | 3 +- .../zmusic}/midisources/midisource_smf.cpp | 0 .../zmusic}/midisources/midisource_xmi.cpp | 2 +- libraries/zmusic/zmusic/m_swap.h | 255 ++++++++++++++++++ .../zmusic/zmusic}/midiconfig.h | 4 +- .../zmusic/zmusic}/mididefs.h | 15 ++ .../zmusic/zmusic}/mus2midi.h | 0 src/CMakeLists.txt | 26 +- src/sound/backend/oalsound.cpp | 1 - src/sound/music/i_music.cpp | 2 +- src/sound/music/i_music.h | 3 +- src/sound/music/i_musicinterns.h | 18 +- src/sound/music/i_soundfont.cpp | 2 +- src/sound/music/i_soundfont.h | 6 +- .../{mididevices => music}/midi_cvars.cpp | 19 +- src/sound/musicformats/music_midistream.cpp | 9 + src/sound/musicformats/music_opl.cpp | 3 +- src/sound/s_music.cpp | 2 +- src/win32/i_main.cpp | 10 - src/win32/i_specialpaths.cpp | 2 - src/win32/i_system.cpp | 2 - src/win32/optwin32.h | 18 -- 42 files changed, 397 insertions(+), 122 deletions(-) create mode 100644 libraries/zmusic/CMakeLists.txt rename {src/utility => libraries/zmusic}/i_module.cpp (100%) rename {src/utility => libraries/zmusic}/i_module.h (100%) rename {src/sound => libraries/zmusic}/mididevices/mididevice.h (95%) rename {src/sound => libraries/zmusic}/mididevices/music_adlmidi_mididevice.cpp (100%) rename {src/sound => libraries/zmusic}/mididevices/music_base_mididevice.cpp (100%) rename {src/sound => libraries/zmusic}/mididevices/music_fluidsynth_mididevice.cpp (99%) rename {src/sound => libraries/zmusic}/mididevices/music_opl_mididevice.cpp (99%) rename {src/sound => libraries/zmusic}/mididevices/music_opnmidi_mididevice.cpp (100%) rename {src/sound => libraries/zmusic}/mididevices/music_softsynth_mididevice.cpp (99%) rename {src/sound => libraries/zmusic}/mididevices/music_timidity_mididevice.cpp (97%) rename {src/sound => libraries/zmusic}/mididevices/music_timiditypp_mididevice.cpp (100%) rename {src/sound => libraries/zmusic}/mididevices/music_wavewriter_mididevice.cpp (99%) rename {src/sound => libraries/zmusic}/mididevices/music_wildmidi_mididevice.cpp (100%) rename {src/sound => libraries/zmusic}/mididevices/music_win_mididevice.cpp (99%) rename {src/sound => libraries/zmusic}/midisources/midisource.cpp (100%) rename {src/sound => libraries/zmusic}/midisources/midisource.h (98%) rename {src/sound => libraries/zmusic}/midisources/midisource_hmi.cpp (99%) rename {src/sound => libraries/zmusic}/midisources/midisource_mus.cpp (99%) rename {src/sound => libraries/zmusic}/midisources/midisource_smf.cpp (100%) rename {src/sound => libraries/zmusic}/midisources/midisource_xmi.cpp (99%) create mode 100644 libraries/zmusic/zmusic/m_swap.h rename {src/sound/mididevices => libraries/zmusic/zmusic}/midiconfig.h (95%) rename {src/sound/mididevices => libraries/zmusic/zmusic}/mididefs.h (74%) rename {src/sound/mididevices => libraries/zmusic/zmusic}/mus2midi.h (100%) rename src/sound/{mididevices => music}/midi_cvars.cpp (97%) delete mode 100644 src/win32/optwin32.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cf7f6b3e0..94b21aa917 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -389,6 +389,7 @@ set( TIMIDITYPP_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/timidityplus" set( TIMIDITY_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/timidity" ) set( WILDMIDI_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/wildmidi" ) set( OPLSYNTH_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/oplsynth" ) +set( ZMUSIC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zmusic" ) if( NOT CMAKE_CROSSCOMPILING ) if( NOT CROSS_EXPORTS ) @@ -416,6 +417,7 @@ add_subdirectory( libraries/timidity ) add_subdirectory( libraries/timidityplus ) add_subdirectory( libraries/wildmidi ) add_subdirectory( libraries/oplsynth ) +add_subdirectory( libraries/zmusic ) add_subdirectory( wadsrc ) add_subdirectory( wadsrc_bm ) add_subdirectory( wadsrc_lights ) diff --git a/libraries/oplsynth/oplsynth/oplio.h b/libraries/oplsynth/oplsynth/oplio.h index 604c6422fe..92be980cb7 100644 --- a/libraries/oplsynth/oplsynth/oplio.h +++ b/libraries/oplsynth/oplsynth/oplio.h @@ -55,6 +55,7 @@ enum }; struct GenMidiVoice; +struct genmidi_op_t; struct OPLio { diff --git a/libraries/zmusic/CMakeLists.txt b/libraries/zmusic/CMakeLists.txt new file mode 100644 index 0000000000..d57e48cc7c --- /dev/null +++ b/libraries/zmusic/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required( VERSION 2.8.7 ) + +if( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter -fomit-frame-pointer" ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" ) +endif() + +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ZD_FASTMATH_FLAG}") + +include( CheckFunctionExists ) + +option( DYN_FLUIDSYNTH "Dynamically load fluidsynth" ON ) + +CHECK_FUNCTION_EXISTS( stricmp STRICMP_EXISTS ) +if( NOT STRICMP_EXISTS ) + add_definitions( -Dstricmp=strcasecmp ) +endif() + +CHECK_FUNCTION_EXISTS( strnicmp STRNICMP_EXISTS ) +if( NOT STRNICMP_EXISTS ) + add_definitions( -Dstrnicmp=strncasecmp ) +endif() + +include_directories( "${ADL_INCLUDE_DIR}" "${OPN_INCLUDE_DIR}" "${TIMIDITYPP_INCLUDE_DIR}" "${TIMIDITY_INCLUDE_DIR}" "${WILDMIDI_INCLUDE_DIR}" "${OPLSYNTH_INCLUDE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" ) + +if (WIN32) +set( PLAT_WIN32_SOURCES + mididevices/music_win_mididevice.cpp) +endif() + +file( GLOB HEADER_FILES + zmusic/*.h + ) +add_library( zmusic STATIC + i_module.cpp + mididevices/music_base_mididevice.cpp + mididevices/music_adlmidi_mididevice.cpp + mididevices/music_opl_mididevice.cpp + mididevices/music_opnmidi_mididevice.cpp + mididevices/music_timiditypp_mididevice.cpp + mididevices/music_fluidsynth_mididevice.cpp + mididevices/music_softsynth_mididevice.cpp + mididevices/music_timidity_mididevice.cpp + mididevices/music_wildmidi_mididevice.cpp + mididevices/music_wavewriter_mididevice.cpp + midisources/midisource.cpp + midisources/midisource_mus.cpp + midisources/midisource_smf.cpp + midisources/midisource_hmi.cpp + midisources/midisource_xmi.cpp + ${PLAT_WIN32_SOURCES} + ) +target_link_libraries( zmusic ) + + +source_group("MIDI Devices" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/mididevices/.+") +source_group("MIDI Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/midisources/.+") +source_group("MIDI Headers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/zmusic/.+") diff --git a/src/utility/i_module.cpp b/libraries/zmusic/i_module.cpp similarity index 100% rename from src/utility/i_module.cpp rename to libraries/zmusic/i_module.cpp diff --git a/src/utility/i_module.h b/libraries/zmusic/i_module.h similarity index 100% rename from src/utility/i_module.h rename to libraries/zmusic/i_module.h diff --git a/src/sound/mididevices/mididevice.h b/libraries/zmusic/mididevices/mididevice.h similarity index 95% rename from src/sound/mididevices/mididevice.h rename to libraries/zmusic/mididevices/mididevice.h index 4923f755ec..209321c2f1 100644 --- a/src/sound/mididevices/mididevice.h +++ b/libraries/zmusic/mididevices/mididevice.h @@ -1,29 +1,16 @@ #pragma once #include -#include "midiconfig.h" -#include "mididefs.h" +#include "zmusic/midiconfig.h" +#include "zmusic/mididefs.h" + +#include "mididevices/mididevice.h" void TimidityPP_Shutdown(); typedef void(*MidiCallback)(void *); // A device that provides a WinMM-like MIDI streaming interface ------------- -enum EMidiDevice -{ - MDEV_DEFAULT = -1, - MDEV_MMAPI = 0, - MDEV_OPL = 1, - MDEV_SNDSYS = 2, - MDEV_TIMIDITY = 3, - MDEV_FLUIDSYNTH = 4, - MDEV_GUS = 5, - MDEV_WILDMIDI = 6, - MDEV_ADL = 7, - MDEV_OPN = 8, - - MDEV_COUNT -}; struct MidiHeader { diff --git a/src/sound/mididevices/music_adlmidi_mididevice.cpp b/libraries/zmusic/mididevices/music_adlmidi_mididevice.cpp similarity index 100% rename from src/sound/mididevices/music_adlmidi_mididevice.cpp rename to libraries/zmusic/mididevices/music_adlmidi_mididevice.cpp diff --git a/src/sound/mididevices/music_base_mididevice.cpp b/libraries/zmusic/mididevices/music_base_mididevice.cpp similarity index 100% rename from src/sound/mididevices/music_base_mididevice.cpp rename to libraries/zmusic/mididevices/music_base_mididevice.cpp diff --git a/src/sound/mididevices/music_fluidsynth_mididevice.cpp b/libraries/zmusic/mididevices/music_fluidsynth_mididevice.cpp similarity index 99% rename from src/sound/mididevices/music_fluidsynth_mididevice.cpp rename to libraries/zmusic/mididevices/music_fluidsynth_mididevice.cpp index cc491d3194..d8962d69f3 100644 --- a/src/sound/mididevices/music_fluidsynth_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_fluidsynth_mididevice.cpp @@ -37,11 +37,15 @@ #include #include #include "mididevice.h" -#include "mus2midi.h" +#include "zmusic/mus2midi.h" // FluidSynth implementation of a MIDI device ------------------------------- -#ifndef DYN_FLUIDSYNTH +#if !defined DYN_FLUIDSYNTH && defined _WIN32 +#define DYN_FLUIDSYNTH 1 // On Windows this is the only supported way to link to FluidSynth. +#endif + +#if !defined DYN_FLUIDSYNTH #include #else #include "i_module.h" diff --git a/src/sound/mididevices/music_opl_mididevice.cpp b/libraries/zmusic/mididevices/music_opl_mididevice.cpp similarity index 99% rename from src/sound/mididevices/music_opl_mididevice.cpp rename to libraries/zmusic/mididevices/music_opl_mididevice.cpp index bc6bdad656..fa78434abe 100644 --- a/src/sound/mididevices/music_opl_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_opl_mididevice.cpp @@ -36,7 +36,7 @@ // HEADER FILES ------------------------------------------------------------ #include "mididevice.h" -#include "mus2midi.h" +#include "zmusic/mus2midi.h" #include "oplsynth/opl.h" #include "oplsynth/opl_mus_player.h" diff --git a/src/sound/mididevices/music_opnmidi_mididevice.cpp b/libraries/zmusic/mididevices/music_opnmidi_mididevice.cpp similarity index 100% rename from src/sound/mididevices/music_opnmidi_mididevice.cpp rename to libraries/zmusic/mididevices/music_opnmidi_mididevice.cpp diff --git a/src/sound/mididevices/music_softsynth_mididevice.cpp b/libraries/zmusic/mididevices/music_softsynth_mididevice.cpp similarity index 99% rename from src/sound/mididevices/music_softsynth_mididevice.cpp rename to libraries/zmusic/mididevices/music_softsynth_mididevice.cpp index cc178ae34d..1ae91d9413 100644 --- a/src/sound/mididevices/music_softsynth_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_softsynth_mididevice.cpp @@ -35,6 +35,8 @@ // HEADER FILES ------------------------------------------------------------ #include +#include +#include #include "mididevice.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/mididevices/music_timidity_mididevice.cpp b/libraries/zmusic/mididevices/music_timidity_mididevice.cpp similarity index 97% rename from src/sound/mididevices/music_timidity_mididevice.cpp rename to libraries/zmusic/mididevices/music_timidity_mididevice.cpp index 56321262bb..7d718f8c61 100644 --- a/src/sound/mididevices/music_timidity_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_timidity_mididevice.cpp @@ -93,16 +93,16 @@ void TimidityMIDIDevice::LoadInstruments(GUSConfig *config) if (config->dmxgus.size()) { // Check if we got some GUS data before using it. - FString ultradir = getenv("ULTRADIR"); - if (ultradir.IsNotEmpty() || config->gus_patchdir.length() != 0) + std::string ultradir = getenv("ULTRADIR"); + if (ultradir.length() || config->gus_patchdir.length() != 0) { auto psreader = new Timidity::BaseSoundFontReader; // The GUS put its patches in %ULTRADIR%/MIDI so we can try that - if (ultradir.IsNotEmpty()) + if (ultradir.length()) { ultradir += "/midi"; - psreader->timidity_add_path(ultradir); + psreader->timidity_add_path(ultradir.c_str()); } // Load DMXGUS lump and patches from gus_patchdir if (config->gus_patchdir.length() != 0) psreader->timidity_add_path(config->gus_patchdir.c_str()); diff --git a/src/sound/mididevices/music_timiditypp_mididevice.cpp b/libraries/zmusic/mididevices/music_timiditypp_mididevice.cpp similarity index 100% rename from src/sound/mididevices/music_timiditypp_mididevice.cpp rename to libraries/zmusic/mididevices/music_timiditypp_mididevice.cpp diff --git a/src/sound/mididevices/music_wavewriter_mididevice.cpp b/libraries/zmusic/mididevices/music_wavewriter_mididevice.cpp similarity index 99% rename from src/sound/mididevices/music_wavewriter_mididevice.cpp rename to libraries/zmusic/mididevices/music_wavewriter_mididevice.cpp index 1c360c5b39..17066cbce4 100644 --- a/src/sound/mididevices/music_wavewriter_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_wavewriter_mididevice.cpp @@ -36,7 +36,7 @@ // HEADER FILES ------------------------------------------------------------ #include "mididevice.h" -#include "m_swap.h" +#include "zmusic/m_swap.h" #include // MACROS ------------------------------------------------------------------ @@ -184,8 +184,8 @@ bool MIDIWaveWriter::CloseFile() } fclose(File); File = nullptr; - return false; } + return false; } //========================================================================== diff --git a/src/sound/mididevices/music_wildmidi_mididevice.cpp b/libraries/zmusic/mididevices/music_wildmidi_mididevice.cpp similarity index 100% rename from src/sound/mididevices/music_wildmidi_mididevice.cpp rename to libraries/zmusic/mididevices/music_wildmidi_mididevice.cpp diff --git a/src/sound/mididevices/music_win_mididevice.cpp b/libraries/zmusic/mididevices/music_win_mididevice.cpp similarity index 99% rename from src/sound/mididevices/music_win_mididevice.cpp rename to libraries/zmusic/mididevices/music_win_mididevice.cpp index 6ef9bfc816..11b6fc7012 100644 --- a/src/sound/mididevices/music_win_mididevice.cpp +++ b/libraries/zmusic/mididevices/music_win_mididevice.cpp @@ -44,8 +44,8 @@ // HEADER FILES ------------------------------------------------------------ #include "mididevice.h" -#include "m_swap.h" -#include "mus2midi.h" +#include "zmusic/m_swap.h" +#include "zmusic/mus2midi.h" #ifndef __GNUC__ #include diff --git a/src/sound/midisources/midisource.cpp b/libraries/zmusic/midisources/midisource.cpp similarity index 100% rename from src/sound/midisources/midisource.cpp rename to libraries/zmusic/midisources/midisource.cpp diff --git a/src/sound/midisources/midisource.h b/libraries/zmusic/midisources/midisource.h similarity index 98% rename from src/sound/midisources/midisource.h rename to libraries/zmusic/midisources/midisource.h index 41b3942045..42f7690d83 100644 --- a/src/sound/midisources/midisource.h +++ b/libraries/zmusic/midisources/midisource.h @@ -11,8 +11,8 @@ #include #include #include -#include "mididevices/mus2midi.h" -#include "mididevices/mididefs.h" +#include "zmusic/mus2midi.h" +#include "zmusic/mididefs.h" extern char MIDI_EventLengths[7]; extern char MIDI_CommonLengths[15]; diff --git a/src/sound/midisources/midisource_hmi.cpp b/libraries/zmusic/midisources/midisource_hmi.cpp similarity index 99% rename from src/sound/midisources/midisource_hmi.cpp rename to libraries/zmusic/midisources/midisource_hmi.cpp index 65852ac4ed..96fba013e1 100644 --- a/src/sound/midisources/midisource_hmi.cpp +++ b/libraries/zmusic/midisources/midisource_hmi.cpp @@ -35,8 +35,9 @@ // HEADER FILES ------------------------------------------------------------ #include +#include #include "midisource.h" -#include "m_swap.h" +#include "zmusic/m_swap.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/midisources/midisource_mus.cpp b/libraries/zmusic/midisources/midisource_mus.cpp similarity index 99% rename from src/sound/midisources/midisource_mus.cpp rename to libraries/zmusic/midisources/midisource_mus.cpp index 350a253569..b5c2dfc8c2 100644 --- a/src/sound/midisources/midisource_mus.cpp +++ b/libraries/zmusic/midisources/midisource_mus.cpp @@ -33,8 +33,9 @@ // HEADER FILES ------------------------------------------------------------ +#include #include "midisource.h" -#include "m_swap.h" +#include "zmusic/m_swap.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/midisources/midisource_smf.cpp b/libraries/zmusic/midisources/midisource_smf.cpp similarity index 100% rename from src/sound/midisources/midisource_smf.cpp rename to libraries/zmusic/midisources/midisource_smf.cpp diff --git a/src/sound/midisources/midisource_xmi.cpp b/libraries/zmusic/midisources/midisource_xmi.cpp similarity index 99% rename from src/sound/midisources/midisource_xmi.cpp rename to libraries/zmusic/midisources/midisource_xmi.cpp index faedb944f0..bbb254f881 100644 --- a/src/sound/midisources/midisource_xmi.cpp +++ b/libraries/zmusic/midisources/midisource_xmi.cpp @@ -35,7 +35,7 @@ // HEADER FILES ------------------------------------------------------------ #include "midisource.h" -#include "m_swap.h" +#include "zmusic/m_swap.h" // MACROS ------------------------------------------------------------------ diff --git a/libraries/zmusic/zmusic/m_swap.h b/libraries/zmusic/zmusic/m_swap.h new file mode 100644 index 0000000000..de9b7780a9 --- /dev/null +++ b/libraries/zmusic/zmusic/m_swap.h @@ -0,0 +1,255 @@ +// +// DESCRIPTION: +// Endianess handling, swapping 16bit and 32bit. +// +//----------------------------------------------------------------------------- + + +#ifndef __M_SWAP_H__ +#define __M_SWAP_H__ + +#include + +// Endianess handling. +// WAD files are stored little endian. + +#ifdef __APPLE__ +#include + +inline short LittleShort(short x) +{ + return (short)OSSwapLittleToHostInt16((uint16_t)x); +} + +inline unsigned short LittleShort(unsigned short x) +{ + return OSSwapLittleToHostInt16(x); +} + +inline short LittleShort(int x) +{ + return OSSwapLittleToHostInt16((uint16_t)x); +} + +inline unsigned short LittleShort(unsigned int x) +{ + return OSSwapLittleToHostInt16((uint16_t)x); +} + +inline int LittleLong(int x) +{ + return OSSwapLittleToHostInt32((uint32_t)x); +} + +inline unsigned int LittleLong(unsigned int x) +{ + return OSSwapLittleToHostInt32(x); +} + +inline short BigShort(short x) +{ + return (short)OSSwapBigToHostInt16((uint16_t)x); +} + +inline unsigned short BigShort(unsigned short x) +{ + return OSSwapBigToHostInt16(x); +} + +inline int BigLong(int x) +{ + return OSSwapBigToHostInt32((uint32_t)x); +} + +inline unsigned int BigLong(unsigned int x) +{ + return OSSwapBigToHostInt32(x); +} + +#elif defined __BIG_ENDIAN__ + +// Swap 16bit, that is, MSB and LSB byte. +// No masking with 0xFF should be necessary. +inline short LittleShort (short x) +{ + return (short)((((unsigned short)x)>>8) | (((unsigned short)x)<<8)); +} + +inline unsigned short LittleShort (unsigned short x) +{ + return (unsigned short)((x>>8) | (x<<8)); +} + +inline short LittleShort (int x) +{ + return LittleShort((short)x); +} + +inline unsigned short LittleShort (unsigned int x) +{ + return LittleShort((unsigned short)x); +} + +// Swapping 32bit. +inline unsigned int LittleLong (unsigned int x) +{ + return (unsigned int)( + (x>>24) + | ((x>>8) & 0xff00) + | ((x<<8) & 0xff0000) + | (x<<24)); +} + +inline int LittleLong (int x) +{ + return (int)( + (((unsigned int)x)>>24) + | ((((unsigned int)x)>>8) & 0xff00) + | ((((unsigned int)x)<<8) & 0xff0000) + | (((unsigned int)x)<<24)); +} + +inline short BigShort(short x) +{ + return x; +} + +inline unsigned short BigShort(unsigned short x) +{ + return x; +} + +inline unsigned int BigLong(unsigned int x) +{ + return x; +} + +inline int BigLong(int x) +{ + return x; +} + +#else + +inline short LittleShort(short x) +{ + return x; +} + +inline unsigned short LittleShort(unsigned short x) +{ + return x; +} + +inline unsigned int LittleLong(unsigned int x) +{ + return x; +} + +inline int LittleLong(int x) +{ + return x; +} + +#ifdef _MSC_VER + +inline short BigShort(short x) +{ + return (short)_byteswap_ushort((unsigned short)x); +} + +inline unsigned short BigShort(unsigned short x) +{ + return _byteswap_ushort(x); +} + +inline int BigLong(int x) +{ + return (int)_byteswap_ulong((unsigned long)x); +} + +inline unsigned int BigLong(unsigned int x) +{ + return (unsigned int)_byteswap_ulong((unsigned long)x); +} +#pragma warning (default: 4035) + +#else + +inline short BigShort (short x) +{ + return (short)((((unsigned short)x)>>8) | (((unsigned short)x)<<8)); +} + +inline unsigned short BigShort (unsigned short x) +{ + return (unsigned short)((x>>8) | (x<<8)); +} + +inline unsigned int BigLong (unsigned int x) +{ + return (unsigned int)( + (x>>24) + | ((x>>8) & 0xff00) + | ((x<<8) & 0xff0000) + | (x<<24)); +} + +inline int BigLong (int x) +{ + return (int)( + (((unsigned int)x)>>24) + | ((((unsigned int)x)>>8) & 0xff00) + | ((((unsigned int)x)<<8) & 0xff0000) + | (((unsigned int)x)<<24)); +} + +#endif + +#endif // __BIG_ENDIAN__ + +// These may be destructive so they should create errors +unsigned long BigLong(unsigned long) = delete; +long BigLong(long) = delete; +unsigned long LittleLong(unsigned long) = delete; +long LittleLong(long) = delete; + + +// Data accessors, since some data is highly likely to be unaligned. +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__x86_64__) +inline int GetShort(const unsigned char *foo) +{ + return *(const short *)foo; +} +inline int GetInt(const unsigned char *foo) +{ + return *(const int *)foo; +} +#else +inline int GetShort(const unsigned char *foo) +{ + return short(foo[0] | (foo[1] << 8)); +} +inline int GetInt(const unsigned char *foo) +{ + return int(foo[0] | (foo[1] << 8) | (foo[2] << 16) | (foo[3] << 24)); +} +#endif +inline int GetBigInt(const unsigned char *foo) +{ + return int((foo[0] << 24) | (foo[1] << 16) | (foo[2] << 8) | foo[3]); +} + +#ifdef __BIG_ENDIAN__ +inline int GetNativeInt(const unsigned char *foo) +{ + return GetBigInt(foo); +} +#else +inline int GetNativeInt(const unsigned char *foo) +{ + return GetInt(foo); +} +#endif + +#endif // __M_SWAP_H__ diff --git a/src/sound/mididevices/midiconfig.h b/libraries/zmusic/zmusic/midiconfig.h similarity index 95% rename from src/sound/mididevices/midiconfig.h rename to libraries/zmusic/zmusic/midiconfig.h index 2398da0a92..2f61c7bafa 100644 --- a/src/sound/mididevices/midiconfig.h +++ b/libraries/zmusic/zmusic/midiconfig.h @@ -37,14 +37,12 @@ struct FluidConfig float fluid_chorus_depth = 8; }; -#include "oplsynth/genmidi.h" - struct OPLMidiConfig { int numchips = 2; int core = 0; bool fullpan = true; - struct GenMidiInstrument OPLinstruments[GENMIDI_NUM_TOTAL]; + uint8_t OPLinstruments[36 * 175]; // it really is 'struct GenMidiInstrument OPLinstruments[GENMIDI_NUM_TOTAL]'; but since this is a public header it cannot pull in a dependency from oplsynth. }; struct OpnConfig diff --git a/src/sound/mididevices/mididefs.h b/libraries/zmusic/zmusic/mididefs.h similarity index 74% rename from src/sound/mididevices/mididefs.h rename to libraries/zmusic/zmusic/mididefs.h index f55ce794e4..3b56e67a8c 100644 --- a/src/sound/mididevices/mididefs.h +++ b/libraries/zmusic/zmusic/mididefs.h @@ -29,3 +29,18 @@ enum : uint8_t MEVENT_LONGMSG = 128, }; +enum EMidiDevice +{ + MDEV_DEFAULT = -1, + MDEV_MMAPI = 0, + MDEV_OPL = 1, + MDEV_SNDSYS = 2, + MDEV_TIMIDITY = 3, + MDEV_FLUIDSYNTH = 4, + MDEV_GUS = 5, + MDEV_WILDMIDI = 6, + MDEV_ADL = 7, + MDEV_OPN = 8, + + MDEV_COUNT +}; diff --git a/src/sound/mididevices/mus2midi.h b/libraries/zmusic/zmusic/mus2midi.h similarity index 100% rename from src/sound/mididevices/mus2midi.h rename to libraries/zmusic/zmusic/mus2midi.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 428ee7d3e2..9563e58a02 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,7 +23,6 @@ if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) endif() endif() -option( DYN_FLUIDSYNTH "Dynamically load fluidsynth" ON ) option( DYN_OPENAL "Dynamically load OpenAL" ON ) option( DYN_SNDFILE "Dynamically load libsndfile" ON ) option( DYN_MPG123 "Dynamically load libmpg123" ON ) @@ -468,7 +467,7 @@ set( ZDOOM_LIBS ${ZDOOM_LIBS} "${ZLIB_LIBRARIES}" "${JPEG_LIBRARIES}" "${BZIP2_L if (HAVE_VULKAN) set( ZDOOM_LIBS ${ZDOOM_LIBS} "glslang" "SPIRV" "OGLCompiler") endif() -include_directories( "${ZLIB_INCLUDE_DIR}" "${BZIP2_INCLUDE_DIR}" "${LZMA_INCLUDE_DIR}" "${JPEG_INCLUDE_DIR}" "${GME_INCLUDE_DIR}" "${ADL_INCLUDE_DIR}" "${OPN_INCLUDE_DIR}" "${TIMIDITYPP_INCLUDE_DIR}" "${TIMIDITY_INCLUDE_DIR}" "${WILDMIDI_INCLUDE_DIR}" "${OPLSYNTH_INCLUDE_DIR}" ) +include_directories( "${ZLIB_INCLUDE_DIR}" "${BZIP2_INCLUDE_DIR}" "${LZMA_INCLUDE_DIR}" "${JPEG_INCLUDE_DIR}" "${GME_INCLUDE_DIR}" "${ZMUSIC_INCLUDE_DIR}" ) if( ${HAVE_VM_JIT} ) add_definitions( -DHAVE_VM_JIT ) @@ -493,7 +492,6 @@ endif() # Start defining source files for ZDoom set( PLAT_WIN32_SOURCES - sound/mididevices/music_win_mididevice.cpp win32/hardware.cpp win32/helperthread.cpp win32/i_cd.cpp @@ -1185,22 +1183,7 @@ set (PCH_SOURCES sound/music/i_music.cpp sound/music/i_soundfont.cpp sound/backend/i_sound.cpp - sound/mididevices/midi_cvars.cpp - sound/mididevices/music_base_mididevice.cpp - sound/mididevices/music_adlmidi_mididevice.cpp - sound/mididevices/music_opl_mididevice.cpp - sound/mididevices/music_opnmidi_mididevice.cpp - sound/mididevices/music_timiditypp_mididevice.cpp - sound/mididevices/music_fluidsynth_mididevice.cpp - sound/mididevices/music_softsynth_mididevice.cpp - sound/mididevices/music_timidity_mididevice.cpp - sound/mididevices/music_wildmidi_mididevice.cpp - sound/mididevices/music_wavewriter_mididevice.cpp - sound/midisources/midisource.cpp - sound/midisources/midisource_mus.cpp - sound/midisources/midisource_smf.cpp - sound/midisources/midisource_hmi.cpp - sound/midisources/midisource_xmi.cpp + sound/music/midi_cvars.cpp sound/musicformats/music_cd.cpp sound/musicformats/music_dumb.cpp sound/musicformats/music_gme.cpp @@ -1231,7 +1214,6 @@ set (PCH_SOURCES utility/atterm.cpp utility/cmdlib.cpp utility/configfile.cpp - utility/i_module.cpp utility/i_time.cpp utility/m_alloc.cpp utility/m_argv.cpp @@ -1305,7 +1287,7 @@ if( UNIX ) endif() endif() -target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma adl opn timidity timidityplus wildmidi oplsynth ) +target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma adl opn timidity timidityplus wildmidi oplsynth zmusic ) include_directories( . g_statusbar @@ -1431,8 +1413,6 @@ install(TARGETS zdoom source_group("Audio Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/.+") source_group("Audio Files\\Backend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/backend/.+") -source_group("Audio Files\\MIDI Devices" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/mididevices/.+") -source_group("Audio Files\\MIDI Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/midisources/.+") source_group("Audio Files\\Music formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/musicformats/.+") source_group("Audio Files\\Third-party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/thirdparty/.+") source_group("Game Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/.+") diff --git a/src/sound/backend/oalsound.cpp b/src/sound/backend/oalsound.cpp index 543be26371..b9893c33d6 100644 --- a/src/sound/backend/oalsound.cpp +++ b/src/sound/backend/oalsound.cpp @@ -42,7 +42,6 @@ #include "v_text.h" #include "i_module.h" #include "i_music.h" -#include "i_musicinterns.h" #include "cmdlib.h" #include "menu/menu.h" diff --git a/src/sound/music/i_music.cpp b/src/sound/music/i_music.cpp index a343331235..e57ceebbca 100644 --- a/src/sound/music/i_music.cpp +++ b/src/sound/music/i_music.cpp @@ -45,9 +45,9 @@ #include "c_dispatch.h" #include "templates.h" #include "stats.h" -#include "timidity/timidity.h" #include "vm.h" #include "s_music.h" +#include "..//libraries/zmusic/midisources/midisource.h" diff --git a/src/sound/music/i_music.h b/src/sound/music/i_music.h index 00898adbac..6376c5cd70 100644 --- a/src/sound/music/i_music.h +++ b/src/sound/music/i_music.h @@ -35,6 +35,7 @@ #define __I_MUSIC_H__ #include "doomdef.h" +#include "zmusic/mididefs.h" #include "i_soundinternal.h" class FileReader; @@ -75,7 +76,7 @@ public: virtual bool SetPosition (unsigned int ms); virtual bool SetSubsong (int subsong); virtual void Update(); - virtual int GetDeviceType() const { return -1; } // MDEV_DEFAULT stands in for anything that cannot change playback parameters which needs a restart. + virtual int GetDeviceType() const { return MDEV_DEFAULT; } // MDEV_DEFAULT stands in for anything that cannot change playback parameters which needs a restart. virtual FString GetStats(); virtual MusInfo *GetOPLDumper(const char *filename); virtual MusInfo *GetWaveDumper(const char *filename, int rate); diff --git a/src/sound/music/i_musicinterns.h b/src/sound/music/i_musicinterns.h index 369261843e..2dc41a5388 100644 --- a/src/sound/music/i_musicinterns.h +++ b/src/sound/music/i_musicinterns.h @@ -1,21 +1,22 @@ #include #include -#include "oplsynth/opl_mus_player.h" #include "c_cvars.h" -#include "mididevices/mus2midi.h" #include "i_sound.h" #include "i_music.h" #include "s_sound.h" #include "files.h" -#include "wildmidi/wildmidi_lib.h" -#include "midisources/midisource.h" -#include "mididevices/mididevice.h" +#include "zmusic/midiconfig.h" +#include "zmusic/mididefs.h" + +#include "zmusic/..//mididevices/mididevice.h" // this is still needed... void I_InitMusicWin32 (); extern float relative_volume; class MIDISource; +class MIDIDevice; +class OPLmusicFile; extern ADLConfig adlConfig; @@ -55,12 +56,7 @@ public: int ServiceEvent(); void SetMIDISource(MIDISource *_source); - int GetDeviceType() const override - { - return nullptr == MIDI - ? MusInfo::GetDeviceType() - : MIDI->GetDeviceType(); - } + int GetDeviceType() const override; bool DumpWave(const char *filename, int subsong, int samplerate); static bool FillStream(SoundStream* stream, void* buff, int len, void* userdata); diff --git a/src/sound/music/i_soundfont.cpp b/src/sound/music/i_soundfont.cpp index 40e3b003d2..d6b4ac0653 100644 --- a/src/sound/music/i_soundfont.cpp +++ b/src/sound/music/i_soundfont.cpp @@ -40,7 +40,7 @@ #include "i_system.h" #include "gameconfigfile.h" #include "resourcefiles/resourcefile.h" -#include "timiditypp/common.h" +#include "../libraries/timidityplus/timiditypp/common.h" //========================================================================== // diff --git a/src/sound/music/i_soundfont.h b/src/sound/music/i_soundfont.h index 40d9a0b8d6..a214801d1f 100644 --- a/src/sound/music/i_soundfont.h +++ b/src/sound/music/i_soundfont.h @@ -3,9 +3,9 @@ #include "doomtype.h" #include "w_wad.h" #include "files.h" -#include "timiditypp/timidity_file.h" -#include "timidity/timidity_file.h" -#include "wildmidi/wildmidi_file.h" +#include "../libraries/timidityplus/timiditypp/timidity_file.h" +#include "../libraries/timidity/timidity/timidity_file.h" +#include "../libraries/wildmidi/wildmidi/wildmidi_file.h" enum { diff --git a/src/sound/mididevices/midi_cvars.cpp b/src/sound/music/midi_cvars.cpp similarity index 97% rename from src/sound/mididevices/midi_cvars.cpp rename to src/sound/music/midi_cvars.cpp index 15a3bdcc60..8b67aaa376 100644 --- a/src/sound/mididevices/midi_cvars.cpp +++ b/src/sound/music/midi_cvars.cpp @@ -35,18 +35,15 @@ */ #include "i_musicinterns.h" #include "i_soundfont.h" -#include "adlmidi.h" #include "cmdlib.h" #include "doomerrors.h" -#include "timidity/timidity.h" -#include "timidity/playmidi.h" -#include "timidity/instrum.h" -#include "timiditypp/controls.h" -#include "timiditypp/timidity.h" -#include "timiditypp/instrum.h" #include "v_text.h" #include "c_console.h" +#include "../libraries/timidity/timidity/timidity.h" +#include "../libraries/timidityplus/timiditypp/timidity.h" +#include "../libraries/oplsynth/oplsynth/oplio.h" + #ifdef _WIN32 // do this without including windows.h for this one single prototype extern "C" unsigned __stdcall GetSystemDirectoryA(char* lpBuffer, unsigned uSize); @@ -138,7 +135,7 @@ void ADL_SetupConfig(ADLConfig *config, const char *Args) } -CUSTOM_CVAR(Int, adl_volume_model, ADLMIDI_VolumeModel_DMX, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Int, adl_volume_model, 3/*ADLMIDI_VolumeModel_DMX*/, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { adlConfig.adl_volume_model = self; CheckRestart(MDEV_ADL); @@ -503,7 +500,7 @@ void OPL_SetupConfig(OPLMidiConfig *config, const char *args) uint8_t filehdr[8]; data.Read(filehdr, 8); if (memcmp(filehdr, "#OPL_II#", 8)) throw std::runtime_error("Corrupt GENMIDI lump"); - data.Read(oplMidiConfig.OPLinstruments, sizeof(GenMidiInstrument) * GENMIDI_NUM_TOTAL); + data.Read(oplMidiConfig.OPLinstruments, 175 * 36); config->core = opl_core; if (args != NULL && *args >= '0' && *args < '4') config->core = *args - '0'; @@ -877,14 +874,14 @@ CUSTOM_CVAR(String, wildmidi_config, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CUSTOM_CVAR(Bool, wildmidi_reverb, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { if (currSong != NULL) - currSong->ChangeSettingInt("wildmidi.reverb", self ? WildMidi::WM_MO_REVERB : 0); + currSong->ChangeSettingInt("wildmidi.reverb", *self); wildMidiConfig.reverb = self; } CUSTOM_CVAR(Bool, wildmidi_enhanced_resampling, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { if (currSong != NULL) - currSong->ChangeSettingInt("wildmidi.resampling", self ? WildMidi::WM_MO_ENHANCED_RESAMPLING : 0); + currSong->ChangeSettingInt("wildmidi.resampling", *self); wildMidiConfig.enhanced_resampling = self; } diff --git a/src/sound/musicformats/music_midistream.cpp b/src/sound/musicformats/music_midistream.cpp index f2494b9b25..7a8f5b1e4e 100644 --- a/src/sound/musicformats/music_midistream.cpp +++ b/src/sound/musicformats/music_midistream.cpp @@ -40,6 +40,9 @@ #include "doomerrors.h" #include "v_text.h" +#include "mididevices/mididevice.h" +#include "midisources/midisource.h" + // MACROS ------------------------------------------------------------------ #define MAX_TIME (1000000/10) // Send out 1/10 of a sec of events at a time. @@ -885,6 +888,12 @@ void MIDIStreamer::SetMIDISource(MIDISource *_source) source->setTempoCallback([=](int tempo) { return !!MIDI->SetTempo(tempo); } ); } +int MIDIStreamer::GetDeviceType() const +{ + return nullptr == MIDI + ? MusInfo::GetDeviceType() + : MIDI->GetDeviceType(); +} //========================================================================== // diff --git a/src/sound/musicformats/music_opl.cpp b/src/sound/musicformats/music_opl.cpp index 065fc1c8c9..8cf2edcebc 100644 --- a/src/sound/musicformats/music_opl.cpp +++ b/src/sound/musicformats/music_opl.cpp @@ -32,7 +32,8 @@ */ #include "i_musicinterns.h" -#include "oplsynth/opl.h" +#include "../libraries/oplsynth/oplsynth/opl.h" +#include "../libraries/oplsynth/oplsynth/opl_mus_player.h" static bool OPL_Active; diff --git a/src/sound/s_music.cpp b/src/sound/s_music.cpp index 1a1f46b9f1..b5309b9169 100644 --- a/src/sound/s_music.cpp +++ b/src/sound/s_music.cpp @@ -587,7 +587,7 @@ void S_StopMusic (bool force) mus_playing.name = ""; } } - catch (const std::runtime_error& err) + catch (const std::runtime_error& ) { //Printf("Unable to stop %s: %s\n", mus_playing.name.GetChars(), err.what()); if (mus_playing.handle != nullptr) diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 482ff170fe..f79722668c 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -79,8 +79,6 @@ #include "stats.h" #include "st_start.h" -#include "optwin32.h" - // MACROS ------------------------------------------------------------------ // The main window's title. @@ -142,14 +140,6 @@ FModule Kernel32Module{"Kernel32"}; FModule Shell32Module{"Shell32"}; FModule User32Module{"User32"}; -namespace OptWin32 { -#define DYN_WIN32_SYM(x) decltype(x) x{#x} - -DYN_WIN32_SYM(SHGetKnownFolderPath); - -#undef DYN_WIN32_SYM -} // namespace OptWin32 - // PRIVATE DATA DEFINITIONS ------------------------------------------------ static const WCHAR WinClassName[] = WGAMENAME "MainWindow"; diff --git a/src/win32/i_specialpaths.cpp b/src/win32/i_specialpaths.cpp index d7e0103608..6d0ea884dc 100644 --- a/src/win32/i_specialpaths.cpp +++ b/src/win32/i_specialpaths.cpp @@ -42,8 +42,6 @@ #include "m_misc.h" #include "version.h" // for GAMENAME -#include "optwin32.h" - // Vanilla MinGW does not have folder ids #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) static const GUID FOLDERID_LocalAppData = { 0xf1b32785, 0x6fba, 0x4fcf, 0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91 }; diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 8250ee3d42..a004ddd43b 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -86,8 +86,6 @@ #include "textures/bitmap.h" #include "atterm.h" -#include "optwin32.h" - // MACROS ------------------------------------------------------------------ #ifdef _MSC_VER diff --git a/src/win32/optwin32.h b/src/win32/optwin32.h deleted file mode 100644 index 2a54e8e5d7..0000000000 --- a/src/win32/optwin32.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -// Forward declarations for optional Win32 API procedures -// implemented in i_main.cpp - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include "i_module.h" - -extern FModule Shell32Module; - -namespace OptWin32 { - -extern TOptProc SHGetKnownFolderPath; - -} // namespace OptWin32