Commit graph

721 commits

Author SHA1 Message Date
Christoph Oelckers
26e948357e - added an abstract FileReader wrapper.
The idea here is to decouple the actual reader creation from the code using them so that, for example, the Open function can decide if it wants to open the file regularly or memory mapped and return different readers as deemed useful. For that to work the exposed object needs to be an abstract wrapper so that this can be done without having to use pointers and all the drawbacks coming from that.
So far put to use in a few parts of the music code so the general functionality could be tested.
2018-03-10 13:46:35 +01:00
alexey.lysiuk
7f17121df8 Fixed crash in MIDI to wave writer 2018-03-08 11:38:02 +02:00
alexey.lysiuk
cea64ea092 Moved old Nuked and Java OPL3 to own namespaces
This helps to avoid clashing of OPL3 classes
2018-03-08 10:18:49 +02:00
alexey.lysiuk
114e56b334 Moved old NukedOPL to own namespace
This fixes linking issues on non-MSVC targets and improves code navigation
2018-03-08 09:51:37 +02:00
Christoph Oelckers
2d2d44baad - integrated ADL as a proper device in the MIDI device list.
- resorted the MIDI device menu option by device types (i.e. all SW synths first, FM synths second)
- allow setting the ADL bank.
2018-03-07 21:20:25 +01:00
Christoph Oelckers
fd801b8b94 Merge branch 'adlMIDI'
# Conflicts:
#	src/sound/musicformats/music_midistream.cpp
2018-03-07 20:31:32 +01:00
Christoph Oelckers
9b61ee9618 - fixed: The MIDI wave writer set the sample rate to save at too late.
This was done after the players had already been created. To ensure that everything gets set properly it is necessary to pass the desired sample rate to the device's constructor and let it make sure that a proper sample rate gets set.
2018-03-06 22:41:27 +01:00
Christoph Oelckers
4d4edcfbfb - fixed setup for Timidity++ playback frequency. 2018-03-06 19:52:29 +01:00
alexey.lysiuk
77e1a1d289 Replaced usages of fluid_settings_getstr() function
This function is deprecated since FluidSynth 1.1.9 and removed in upcoming 2.x
2018-03-05 12:31:50 +02:00
alexey.lysiuk
d0ec6ef1d4 TiMidity++ now loads SF2 soundfont with spaces in path 2018-03-04 13:09:29 +02:00
alexey.lysiuk
8145b52037 Added explicit fallback to default soundfont
With no soundfonts found the game crashed on startup
Local UNIX build had the same issue because $PROGDIR/soundfonts is not in search path
2018-03-03 15:17:30 +02:00
Christoph Oelckers
e1bb14803e - print an error message if the requested MIDI device cannot be started.
This will only be done the first time a given setup fails. Repeated messages will be muted.
2018-03-03 08:52:25 +01:00
Christoph Oelckers
4c0f68bcd4 Merge branch 'master' into timidity++
# Conflicts:
#	src/sound/musicformats/music_midistream.cpp
2018-03-02 00:08:12 +01:00
Christoph Oelckers
4ccbc4ea9e - Send a GM reset SYSEX event when music playback is started. 2018-02-28 09:46:28 +01:00
Christoph Oelckers
eb124f6160 - made the sound font loading a bit more error resistant.
- implemented a fallback both for sound font lookup and for MIDI device selection so that if some non-working combination is set up, the player will fall back to something that works.
2018-02-26 16:36:30 +01:00
alexey.lysiuk
6bc2be1ca4 Fixed GCC 6+ compilation error
In file included from /usr/include/c++/6/math.h:36:0,
                 from src/vectors.h:43,
                 from src/sound/i_soundinternal.h:7,
                 from src/sound/i_sound.h:39,
                 from src/sound/i_musicinterns.h:5,
                 from src/sound/timidity/timidity.cpp:36:
/usr/include/c++/6/cmath:407:11: error: ‘::pow’ has not been declared
2018-02-26 14:46:24 +02:00
alexey.lysiuk
22819e640a Fixed GCC 4.9 compilation error
src/sound/timiditypp/instrum.cpp:45:26: error: array used as initializer
2018-02-26 14:00:29 +02:00
alexey.lysiuk
4fdf488960 Fixed MSVC compilation warning
VC\include\type_traits(1468): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
src\sound\musicformats\music_midistream.cpp(832): note: see reference to function template instantiation 'std::function<bool (int)>::function<MIDIStreamer::SetMIDISource::<lambda_...>,int,void>(_Fx)' being compiled
2018-02-26 13:22:36 +02:00
alexey.lysiuk
14802c0547 Fixed GCC compilation error
src/sound/timiditypp/reverb.h:467:6: error: declaration of ‘TimidityPlus::lfo TimidityPlus::<anonymous struct>::lfo’ [-fpermissive]
src/sound/timiditypp/reverb.h:61:8: error: changes meaning of ‘lfo’ from ‘struct TimidityPlus::lfo’ [-fpermissive]
2018-02-26 13:10:32 +02:00
Christoph Oelckers
f405d630df - Redid CVar synchronization for Timidity++. 2018-02-26 09:55:04 +01:00
Christoph Oelckers
47dbbeb65a Revert "- don't let the Timidity++ player directly access the CVARs."
This reverts commit 8f7a503561.

# Conflicts:
#	src/sound/timiditypp/playmidi.cpp

Something in here wasn't working as intended, and since it needs better synchronization let's redo it entirely.
2018-02-26 09:19:10 +01:00
Christoph Oelckers
36e8358763 - use submenus for soundfont selection both for better overview and avoiding a music restart for each selection change. 2018-02-26 08:52:40 +01:00
Christoph Oelckers
67a6ec01e1 - added a separate section for soundfont search paths. 2018-02-25 09:32:05 +01:00
Christoph Oelckers
2ac101fa51 - removed tmpfileplus, which was only used by the old Timidity++ player. 2018-02-24 23:01:55 +01:00
Christoph Oelckers
8f7a503561 - don't let the Timidity++ player directly access the CVARs.
This may cause problems because the player runs in a different thread than the input code.
Instead the play thread will now copy their values to local variables when it starts generating output.
2018-02-24 19:36:09 +01:00
Christoph Oelckers
27f9330c81 - reimplemented thr OPL dumoer for MIDI. 2018-02-24 18:55:42 +01:00
Christoph Oelckers
a5316c211d - Moved the MIDI WAVE writer device to its own source file. 2018-02-24 18:25:04 +01:00
Christoph Oelckers
2202a52840 - made the MIDI to WAVE dumper functional again, including the option of choosing the MIDI synth and sound font with which it should be rendered. 2018-02-24 18:19:27 +01:00
Christoph Oelckers
786f1b34be - did not save everything. 2018-02-24 13:33:28 +01:00
Christoph Oelckers
6e913bb032 - Timidity CVAR cleanup and removal of the more obscure options. 2018-02-24 13:06:17 +01:00
Christoph Oelckers
b1313d533a - changing reverb mode must reallocate the buffers because they are mode-dependent. 2018-02-24 12:41:16 +01:00
Christoph Oelckers
fa8cfa65c0 - fixed incomplete initialization of the chorus data. 2018-02-24 12:30:19 +01:00
Christoph Oelckers
88328b056d - removed 'register' keyword from reverb.cpp. 2018-02-23 22:01:00 +01:00
Christoph Oelckers
7a851fd3f1 libADL MIDI test. It sounds awful so obviously there's still something wrong here. Definitely not usable yet. 2018-02-23 21:56:34 +01:00
Christoph Oelckers
39f26028aa - reworked the advanced sound menu to take advantage of the new soundfont handling.
The text input field for the configs have been removed. Instead it will now present a list of soundfonts that are found in specific locations.
For that it will look in the 'soundfont' directories of the FileSearch.Directories entry of the config.
Acceptable file formats here are SF2 and zipped GUS patch sets. These zipped patch sets need to have a timidity.cfg at the root and refer to all containing data by relative path. References to outside files are not allowed here.
It is still possible to refer to sound fonts elsewhere on the hard drive by manually entering a path at the console - but these won't show in the menu and will get lost if one cycles through the list of available options.
Of the available softsynths, FluidSynth will only list SF", Wildmidi will only list GUS patch sets and Timidity++ and GUS will list both.

Please note that although the GUS synth can read SF2, the output appears to be broken die to some old bug.
2018-02-23 19:23:39 +01:00
Christoph Oelckers
5da1433c57 - fixed a memory leak and removed debug output. 2018-02-23 18:57:30 +01:00
Christoph Oelckers
88f9f0982c - fixed Timidity++ playback. 2018-02-23 18:33:54 +01:00
Christoph Oelckers
4a179954b1 - removed Timidity_mastervolume CVAR. The reason why this was added got addressed at a lower level with the new code (i.e. the EXE's output was far too loud) and if there need to be adjustments to evening out the volume of the different MIDI synths it should be done in the data generation step, not as an added factor to the system volume of the track. 2018-02-23 17:27:36 +01:00
Christoph Oelckers
d25cc1baa0 - Fixed today's work now that I'm able to hear some sound again. Also some reorganization 2018-02-23 17:01:17 +01:00
Christoph Oelckers
ddedcd9fc2 Removed all conditional checks on HAVE_FLUIDSYNTH
With the current setup it makes zero sense to exclude it. This was all a remnant of its introduction when it couldn't be taken for granted.
2018-02-23 14:36:26 +01:00
Christoph Oelckers
adebd644f2 Rewroter 'writemidi' CCMD to work independently of the currently playing song's data.
The first benefit of separating the MIDI data sources from the playback classes. :)
2018-02-23 14:26:29 +01:00
Christoph Oelckers
16f17deb0f We no longer have a sound system that can handle music playback, so the code for it can go away. 2018-02-23 13:23:03 +01:00
Christoph Oelckers
9a1479ab08 Separate MIDI streamer and source creation in the high level code. 2018-02-23 13:20:07 +01:00
Christoph Oelckers
9aa1199902 Split the different MIDI format implementations into a separate 'Source' class.
This is necessary to write a universal, device independent wave dumper for MIDIs.
With each format inheriting from the main player class it is not possible to create a generic dumper player.
2018-02-23 12:40:43 +01:00
Christoph Oelckers
8734511e80 Removed PathExpander and PseudoMidiDevice which are no longer being used
PathExpander has been integrated into the sound font manager and PseudoMidiDevice was only used as the base class for the old Timidity++ device with the external executable.
2018-02-23 09:21:42 +01:00
Christoph Oelckers
aae832386f Fixed warnings in Timidity++ code emitted by XCode, except one which cannot be eliminatet without compromising the code. 2018-02-23 09:07:42 +01:00
Christoph Oelckers
6618656e7c Adjusted Timidity++ to soundfint manager 2018-02-23 08:54:01 +01:00
Christoph Oelckers
f9893a700a - fixed some warnings. 2018-02-23 01:01:18 +01:00
Christoph Oelckers
d6fe1fb39f - simplified the sound font manager a bit.
- allow the GUS to change sound fonts at run time.
- implemented sound font manager support in the GUS synth. This works but also made me realize that the SF2 support of this synth has been rather broken, apparently forever.
2018-02-23 00:48:03 +01:00
Christoph Oelckers
c12c068355 - WildMidi now uses the soundfont manager.
- added the missing handler for reading Timidity configs from the lump directory.
- fixed incomplete init of the GUS synth when no soundfont can be located.
- fixed bad initialization of WildMidi sampling frequency. It would default to 11.025 kHz if no valid rate was set. Now it will use the sound device's native frequency.
2018-02-22 22:35:49 +01:00
Christoph Oelckers
1361956072 - Soundfont manager works for FluidSynth. 2018-02-22 18:03:22 +01:00
Christoph Oelckers
8b8a7e5e45 - sfmanager gets initialized 2018-02-22 14:30:43 +01:00
Christoph Oelckers
504d68e2f8 All compile errors on Mac fixed. 2018-02-22 13:50:41 +01:00
Christoph Oelckers
04344505c0 Soundfont header 2018-02-22 13:42:12 +01:00
Christoph Oelckers
a6fa906764 Framework for context independent sounffont management
Not tested yet!
2018-02-22 12:51:45 +01:00
Christoph Oelckers
542d3431ff - Start of soundfont refactoring. This does not compile yet! 2018-02-22 07:21:19 +01:00
Christoph Oelckers
0688d53ea8 - allow reloading the sound font for the GUS device. 2018-02-21 23:38:04 +01:00
Christoph Oelckers
e84ec2978a - plugged the pending memory leaks. 2018-02-21 21:33:56 +01:00
Christoph Oelckers
5219916de5 - there's no need to drag the event time around, this really was just an artifact of Timidity's original implementation which is no longer in use.
- plugged a few memory leaks.
2018-02-21 21:11:31 +01:00
Christoph Oelckers
af705d1c59 - silenced a few pointless console messages generated by Timidity++. 2018-02-21 20:44:51 +01:00
Christoph Oelckers
af1de8ddc9 - removed volume testing output.
- final tweak to volume adjustment: Do this upon extraction for better results.

If this is done via the synth's parameters it will affect channel balance.
The given factor of 5 is necessary to roughly match the output of FluidSynth.
2018-02-21 20:12:37 +01:00
Christoph Oelckers
59352af486 - Volume tweaking. 2018-02-21 19:05:14 +01:00
Christoph Oelckers
e6bae25423 - Timidity++ is now fully integrated into the softsynth interface.
The only thing left to do is tweaking the volume of the output to match the one from the EXE.
2018-02-21 17:35:44 +01:00
Christoph Oelckers
445e9451cb - Added the long event handler for Timidity++.
This will be hard to test because there's basically no material out there using the features this implements.
2018-02-21 02:02:29 +01:00
Christoph Oelckers
4813eeeb85 - Timidity++ now plays ZDoom's event stream, although still through the Windows output module.
This also means that readmidi.cpp is no longer needed.
2018-02-21 01:29:39 +01:00
Christoph Oelckers
57967a1033 - safety commit. 2018-02-20 23:36:59 +01:00
Christoph Oelckers
cbcfea99cb - use the intended interface to pass some data to the player. 2018-02-20 21:52:45 +01:00
Christoph Oelckers
a8283ffdd6 - something can be heard.
This doesn't pipe the audio through OpenAL yet but the fundamentals for further progress are done.
2018-02-20 20:50:01 +01:00
Christoph Oelckers
5ce3b00b90 - commented out the noisy debug messages in Timidity++ so that they do not waste execution time and memory for nothing - there are almost 300 of them. 2018-02-20 19:45:37 +01:00
alexey.lysiuk
ff897997d6 Fixed hang when TiMidity++ executable failed to launch
https://forum.zdoom.org/viewtopic.php?t=59539
2018-02-20 12:20:18 +02:00
Christoph Oelckers
d72b87f469 - skeleton of new player class for Timidity++ - not tested yet. 2018-02-20 01:23:56 +01:00
Christoph Oelckers
803369fb8d - make CMake happy 2018-02-19 23:33:42 +01:00
Christoph Oelckers
06a1730b8a - hooking in the PathExpander. 2018-02-19 22:48:13 +01:00
Christoph Oelckers
576932c47f - Timidity++ sources added. This compiles but isn't hooked into the engine yet.
This source has been heavily edited to remove the deep integration with the provided UI modules and to eliminate use of global variables and puts everything into a small number of C++ classes.
2018-02-19 22:14:22 +01:00
alexey.lysiuk
05538f2de8 Fixed compilation warnings reported by MSVC
src\sound\musicformats\music_libsndfile.cpp(119): warning C4267: 'argument': conversion from 'size_t' to 'long', possible loss of data
src\sound\musicformats\music_libsndfile.cpp(139): warning C4267: 'argument': conversion from 'size_t' to 'long', possible loss of data
src\sound\musicformats\music_libsndfile.cpp(145): warning C4267: 'argument': conversion from 'size_t' to 'long', possible loss of data
src\sound\musicformats\music_libsndfile.cpp(167): warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
src\sound\musicformats\music_libsndfile.cpp(178): warning C4267: 'argument': conversion from 'size_t' to 'long', possible loss of data
src\sound\musicformats\music_libsndfile.cpp(240): warning C4267: 'argument': conversion from 'size_t' to 'long', possible loss of data
2018-02-19 12:28:24 +02:00
Chris Robinson
e566cb9184 Properly parse FLAC and Ogg Vorbis files for their comments 2018-02-12 17:33:20 +01:00
Christoph Oelckers
93686638b0 - let fluid_reverb and fluid_chorus default to 'off'. 2018-01-29 18:54:06 +01:00
Christoph Oelckers
2720e36a2c - marked a few more CCMDs unsafe. 2018-01-20 09:11:28 +01:00
Christoph Oelckers
13c4e58c3d - simplified IgnoreMIDIVolume.
The XP related check had already been deactivated but not removed.
2018-01-14 10:48:26 +01:00
Christoph Oelckers
7cbcbe66c0 - sanitization of temporary file stuff for Timidity++.
* do not use the global temp directory. Instead create one in the AppData folder.
* removed lots of unneeded code from tmpfileplus.
* use C++ strings in there.
2017-12-02 17:33:43 +01:00
Christoph Oelckers
8d26760671 - use FileWriter for 'writemidi' CCMD. 2017-12-02 12:33:58 +01:00
Christoph Oelckers
1af42b3d50 - use FileWriter for the OPL dumper. 2017-12-02 12:31:21 +01:00
Christoph Oelckers
5e7dfa7cce - use FileWriter for the Timidity MIDI dumper 2017-12-02 12:01:19 +01:00
Christoph Oelckers
87816f811f - removed windows.h include from a few files which do not need it anymore. 2017-11-25 10:58:33 +01:00
alexey.lysiuk
0e706bfecf Use tmpfileplus() instead of tempnam()
Finally get rid of security or deprecated warnings cause by tempnam() function usage
2017-11-07 11:50:07 +02:00
David Carlier
b871b1898d OpenBSD build fix.
- No timidity user defined parameters supported.
- Shared libraries versioning policy differs on OpenBSD.
2017-10-21 14:49:41 -04:00
Chris Robinson
bbaec90f61 Fix speed of sound and unit scale 2017-10-01 07:39:26 +02:00
Chris Robinson
666198dec8 Don't allow Timidity++ pipes less than 20ms
This prevents Timidity++ from playing externally, so it now always goes through
the sound system. Aside from the issues relating to controlling playback, that
functionality has been busted for who knows how long anyway since Open() always
tries to create a pipe and sound stream regardless of the calculated size.
2017-09-10 07:25:29 -04:00
Chris Robinson
49df5a7f16 Add a cvar for the timidity++ config file 2017-09-10 07:25:29 -04:00
Chris Robinson
8f8c2ef2ef Build Timidity++ args separately on non-Windows
Rather than building a command line that's going to be manually split into
individual arguments passed to execvp, build the individual arguments directly.
2017-09-10 07:25:29 -04:00
Chris Robinson
5b3fbfde6d Read all data from the Timidity++ pipe
For non-Windows systems, read() may be non-blocking and can return less than
the requested amount if the timidity process hasn't written enough audio yet.
2017-09-10 07:25:29 -04:00
David Carlier
8d8c353465 Attempty to free memory leaks. 2017-08-16 16:31:23 -04:00
alexey.lysiuk
eb52088487 Fixed compilation warnings reported by Clang
src/gl/scene/gl_sprite.cpp:685:34: warning: '&&' within '||' [-Wlogical-op-parentheses]
src/polyrenderer/scene/poly_sprite.cpp:297:34: warning: '&&' within '||' [-Wlogical-op-parentheses]
src/swrenderer/scene/r_opaque_pass.cpp:975:35: warning: '&&' within '||' [-Wlogical-op-parentheses]
src/sound/mididevices/music_timiditypp_mididevice.cpp:548:30: warning: comparison of integers of different signs: 'int' and 'size_t' (aka 'unsigned long') [-Wsign-compare]
2017-08-13 16:42:08 +03:00
Kevin Caccamo
7ff0040f30 Add a null pointer at the end of TimidityArgs
This actually got the execvp call working consistently for me; now I can listen to MIDI music in GZDoom again.
2017-07-31 11:05:28 -04:00
Kevin Caccamo
a4370a3529 Null-terminate strings 2017-07-31 11:05:28 -04:00
Kevin Caccamo
ff35620a09 Fix freeze when timidity_exe is not set to timidity's absolute path 2017-07-31 11:05:28 -04:00
Kevin Caccamo
18e76c978c Fix code style, and make some minor changes
Assume timidity is in the user's PATH if not the specified location
Also, get the error message for the execvp failure if it does fail
2017-07-31 11:05:28 -04:00
Kevin Caccamo
233fce7ef6 Initial attempt to make timidity work on Linux again
Add code to find the timidity executable, and split the command line into separate arguments by spaces.
For some reason, this doesn't work, although reverting 64e96c5f makes timidity work again.
2017-07-31 11:05:28 -04:00
David Carlier
64e96c5f46 OpenBSD support 2017-07-25 07:56:19 -04:00
alexey.lysiuk
afe1199b69 Fixed sound looping when stream length is a multiply of buffer size
https://forum.zdoom.org/viewtopic.php?t=57164
2017-07-09 13:28:16 +03:00