mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-03-02 07:21:58 +00:00
Merge branch 'master' into cmake-modernization
This commit is contained in:
commit
90da8af70f
8 changed files with 159 additions and 36 deletions
|
@ -152,6 +152,12 @@ jobs:
|
|||
gtk-bundle: $(gtk-bundle-x64)
|
||||
libsndfile-url: $(libsndfile-url-x64)
|
||||
mingw-url: $(mingw-url-x64)
|
||||
x64-static:
|
||||
CMAKE_FLAGS: '-DBUILD_SHARED_LIBS=0'
|
||||
platform: x64
|
||||
gtk-bundle: $(gtk-bundle-x64)
|
||||
libsndfile-url: $(libsndfile-url-x64)
|
||||
mingw-url: $(mingw-url-x64)
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
|
|
|
@ -41,7 +41,7 @@ set ( PACKAGE "fluidsynth" )
|
|||
# FluidSynth package version
|
||||
set ( FLUIDSYNTH_VERSION_MAJOR 2 )
|
||||
set ( FLUIDSYNTH_VERSION_MINOR 2 )
|
||||
set ( FLUIDSYNTH_VERSION_MICRO 2 )
|
||||
set ( FLUIDSYNTH_VERSION_MICRO 3 )
|
||||
set ( VERSION "${FLUIDSYNTH_VERSION_MAJOR}.${FLUIDSYNTH_VERSION_MINOR}.${FLUIDSYNTH_VERSION_MICRO}" )
|
||||
set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
|
||||
|
||||
|
@ -56,7 +56,7 @@ set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
|
|||
# This is not exactly the same algorithm as the libtool one, but the results are the same.
|
||||
set ( LIB_VERSION_CURRENT 3 )
|
||||
set ( LIB_VERSION_AGE 0 )
|
||||
set ( LIB_VERSION_REVISION 2 )
|
||||
set ( LIB_VERSION_REVISION 3 )
|
||||
set ( LIB_VERSION_INFO
|
||||
"${LIB_VERSION_CURRENT}.${LIB_VERSION_AGE}.${LIB_VERSION_REVISION}" )
|
||||
|
||||
|
@ -93,6 +93,7 @@ option ( enable-pkgconfig "use pkg-config to locate fluidsynth's (mostly optiona
|
|||
option ( enable-pulseaudio "compile PulseAudio support (if it is available)" on )
|
||||
option ( enable-readline "compile readline lib line editing (if it is available)" on )
|
||||
option ( enable-threads "enable multi-threading support (such as parallel voice synthesis)" on )
|
||||
option ( enable-openmp "enable OpenMP support (parallelization of soundfont decoding, vectorization of voice mixing, etc.)" on )
|
||||
|
||||
# Platform specific options
|
||||
if ( CMAKE_SYSTEM MATCHES "Linux|FreeBSD|DragonFly" )
|
||||
|
@ -322,6 +323,10 @@ if ( WIN32 )
|
|||
if ( MINGW )
|
||||
set ( MINGW32 1 )
|
||||
add_compile_options ( -mms-bitfields )
|
||||
# mman-win32
|
||||
if ( HAVE_SYS_MMAN_H )
|
||||
set ( WINDOWS_LIBS "${WINDOWS_LIBS};mman" )
|
||||
endif ()
|
||||
endif ( MINGW )
|
||||
else ( WIN32 )
|
||||
# Check PThreads, but not in Windows
|
||||
|
@ -507,6 +512,7 @@ else(NOT enable-pkgconfig)
|
|||
|
||||
# Mandatory libraries: glib and gthread
|
||||
pkg_check_modules ( GLIB REQUIRED glib-2.0>=2.6.5 gthread-2.0>=2.6.5 IMPORTED_TARGET )
|
||||
list( APPEND PC_REQUIRES_PRIV "glib-2.0" "gthread-2.0")
|
||||
|
||||
if ( GLIB_glib-2.0_VERSION AND GLIB_glib-2.0_VERSION VERSION_LESS "2.26.0" )
|
||||
message ( WARNING "Your version of glib is very old. This may cause problems with fluidsynth's sample cache on Windows. Consider updating to glib 2.26 or newer!" )
|
||||
|
@ -526,6 +532,7 @@ else(NOT enable-pkgconfig)
|
|||
LIBSNDFILE_STATIC_LINK_LIBRARIES
|
||||
LIBSNDFILE_STATIC_LDFLAGS
|
||||
LIBSNDFILE_STATIC_LDFLAGS_OTHER ) ]]
|
||||
list( APPEND PC_REQUIRES_PRIV "sndfile")
|
||||
if ( LIBSNDFILE_STATIC_LIBRARIES MATCHES "vorbis" OR
|
||||
LIBSNDFILE_STATIC_LDFLAGS MATCHES "vorbis" OR
|
||||
LIBSNDFILE_STATIC_LDFLAGS_OTHER MATCHES "vorbis" )
|
||||
|
@ -550,6 +557,9 @@ else(NOT enable-pkgconfig)
|
|||
if ( enable-pulseaudio )
|
||||
pkg_check_modules ( PULSE libpulse-simple>=0.9.8 IMPORTED_TARGET )
|
||||
set ( PULSE_SUPPORT ${PULSE_FOUND} )
|
||||
if ( PULSE_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "libpulse-simple")
|
||||
endif ( PULSE_SUPPORT )
|
||||
else ( enable-pulseaudio )
|
||||
unset_pkg_config ( PULSE )
|
||||
endif ( enable-pulseaudio )
|
||||
|
@ -558,6 +568,9 @@ else(NOT enable-pkgconfig)
|
|||
if ( enable-alsa )
|
||||
pkg_check_modules ( ALSA alsa>=0.9.1 IMPORTED_TARGET )
|
||||
set ( ALSA_SUPPORT ${ALSA_FOUND} )
|
||||
if ( ALSA_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "alsa")
|
||||
endif ( ALSA_SUPPORT )
|
||||
else ( enable-alsa )
|
||||
unset_pkg_config ( ALSA )
|
||||
endif ( enable-alsa )
|
||||
|
@ -566,9 +579,9 @@ else(NOT enable-pkgconfig)
|
|||
if ( enable-portaudio )
|
||||
pkg_check_modules ( PORTAUDIO portaudio-2.0>=19 IMPORTED_TARGET )
|
||||
set ( PORTAUDIO_SUPPORT ${PORTAUDIO_FOUND} )
|
||||
if (PORTAUDIO_SUPPORT)
|
||||
sanitize_target_dirs(PkgConfig::PORTAUDIO)
|
||||
endif()
|
||||
if ( PORTAUDIO_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "portaudio-2.0")
|
||||
endif ()
|
||||
else ( enable-portaudio )
|
||||
unset_pkg_config ( PORTAUDIO )
|
||||
endif ( enable-portaudio )
|
||||
|
@ -579,6 +592,7 @@ else(NOT enable-pkgconfig)
|
|||
set ( JACK_SUPPORT ${JACK_FOUND} )
|
||||
if (JACK_SUPPORT)
|
||||
sanitize_target_dirs(PkgConfig::JACK)
|
||||
list( APPEND PC_REQUIRES_PRIV "jack")
|
||||
endif()
|
||||
else ( enable-jack )
|
||||
unset_pkg_config ( JACK )
|
||||
|
@ -591,6 +605,7 @@ else(NOT enable-pkgconfig)
|
|||
set ( LASH_SUPPORT 1 )
|
||||
add_definitions ( -DHAVE_LASH )
|
||||
sanitize_target_dirs(PkgConfig::LASH)
|
||||
list( APPEND PC_REQUIRES_PRIV "lash-1.0")
|
||||
endif ( LASH_FOUND )
|
||||
else ( enable-lash )
|
||||
unset_pkg_config ( LASH )
|
||||
|
@ -601,32 +616,40 @@ else(NOT enable-pkgconfig)
|
|||
if ( enable-systemd )
|
||||
pkg_check_modules ( SYSTEMD libsystemd IMPORTED_TARGET )
|
||||
set ( SYSTEMD_SUPPORT ${SYSTEMD_FOUND} )
|
||||
if ( SYSTEMD_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "libsystemd")
|
||||
endif ( SYSTEMD_SUPPORT )
|
||||
else ( enable-systemd )
|
||||
unset_pkg_config ( SYSTEMD )
|
||||
endif ( enable-systemd )
|
||||
|
||||
unset ( DBUS_SUPPORT CACHE )
|
||||
if ( enable-dbus )
|
||||
pkg_check_modules ( DBUS dbus-1>=1.0.0 IMPORTED_TARGET )
|
||||
set ( DBUS_SUPPORT ${DBUS_FOUND} )
|
||||
pkg_check_modules ( DBUS dbus-1>=1.0.0 IMPORTED_TARGET )
|
||||
set ( DBUS_SUPPORT ${DBUS_FOUND} )
|
||||
if ( DBUS_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "dbus-1")
|
||||
endif ()
|
||||
else ( enable-dbus )
|
||||
unset_pkg_config ( DBUS )
|
||||
endif ( enable-dbus )
|
||||
|
||||
unset ( LADSPA_SUPPORT CACHE )
|
||||
if ( enable-ladspa )
|
||||
check_include_file ( ladspa.h LADSPA_SUPPORT )
|
||||
if ( LADSPA_SUPPORT )
|
||||
pkg_check_modules ( GMODULE REQUIRED gmodule-2.0>=2.6.5 IMPORTED_TARGET )
|
||||
set ( LADSPA 1 )
|
||||
endif ( LADSPA_SUPPORT )
|
||||
check_include_file ( ladspa.h LADSPA_SUPPORT )
|
||||
if ( LADSPA_SUPPORT )
|
||||
pkg_check_modules ( GMODULE REQUIRED gmodule-2.0>=2.6.5 IMPORTED_TARGET )
|
||||
set ( LADSPA 1 )
|
||||
list( APPEND PC_REQUIRES_PRIV "gmodule-2.0")
|
||||
endif ( LADSPA_SUPPORT )
|
||||
endif ( enable-ladspa )
|
||||
|
||||
unset ( LIBINSTPATCH_SUPPORT CACHE )
|
||||
if ( enable-libinstpatch )
|
||||
pkg_check_modules ( LIBINSTPATCH libinstpatch-1.0>=1.1.0 IMPORTED_TARGET )
|
||||
set ( LIBINSTPATCH_SUPPORT ${LIBINSTPATCH_FOUND} )
|
||||
if (LIBINSTPATCH_SUPPORT)
|
||||
if ( LIBINSTPATCH_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "libinstpatch-1.0")
|
||||
#[[ cmake_print_properties( TARGETS PkgConfig::LIBINSTPATCH
|
||||
PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS
|
||||
|
@ -635,41 +658,45 @@ else(NOT enable-pkgconfig)
|
|||
INTERFACE_LINK_OPTIONS
|
||||
INTERFACE_LINK_LIBRARIES ) ]]
|
||||
sanitize_target_dirs(PkgConfig::LIBINSTPATCH)
|
||||
endif()
|
||||
endif (LIBINSTPATCH_SUPPORT )
|
||||
endif ( enable-libinstpatch )
|
||||
|
||||
unset ( SDL2_SUPPORT CACHE )
|
||||
if ( enable-sdl2 )
|
||||
pkg_check_modules ( SDL2 sdl2 IMPORTED_TARGET )
|
||||
set ( SDL2_SUPPORT ${SDL2_FOUND} )
|
||||
if ( SDL2_SUPPORT )
|
||||
list( APPEND PC_REQUIRES_PRIV "sdl2")
|
||||
endif ( SDL2_SUPPORT )
|
||||
else ( enable-sdl2 )
|
||||
unset_pkg_config ( SDL2 )
|
||||
endif ( enable-sdl2 )
|
||||
|
||||
unset ( OBOE_SUPPORT CACHE )
|
||||
unset ( OBOE_LIBS CACHE )
|
||||
if ( enable-oboe )
|
||||
pkg_check_modules ( OBOE oboe-1.0 IMPORTED_TARGET )
|
||||
if ( OBOE_FOUND )
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set ( OBOE_SUPPORT 1 )
|
||||
set ( OBOE_LIBS ${OBOE_LIBRARIES} )
|
||||
list( APPEND PC_REQUIRES_PRIV "oboe-1.0")
|
||||
endif ( OBOE_FOUND )
|
||||
endif ( enable-oboe )
|
||||
|
||||
unset ( WITH_READLINE CACHE )
|
||||
unset ( READLINE_LIBS CACHE )
|
||||
if ( enable-readline )
|
||||
pkg_check_modules ( READLINE readline QUIET IMPORTED_TARGET )
|
||||
if ( NOT READLINE_FOUND )
|
||||
find_package ( READLINE )
|
||||
set ( READLINE_FOUND ${HAVE_READLINE} )
|
||||
endif ( NOT READLINE_FOUND )
|
||||
if ( READLINE_FOUND )
|
||||
set ( WITH_READLINE 1 )
|
||||
set ( READLINE_LIBS ${READLINE_LIBRARIES} )
|
||||
endif ( READLINE_FOUND )
|
||||
pkg_check_modules ( READLINE readline QUIET IMPORTED_TARGET )
|
||||
if ( READLINE_FOUND )
|
||||
list( APPEND PC_REQUIRES_PRIV "readline")
|
||||
else ( READLINE_FOUND )
|
||||
find_package ( READLINE )
|
||||
set ( READLINE_FOUND ${HAVE_READLINE} )
|
||||
endif ( READLINE_FOUND )
|
||||
if ( READLINE_FOUND )
|
||||
set ( WITH_READLINE 1 )
|
||||
set ( READLINE_LIBS ${READLINE_LIBRARIES} )
|
||||
endif ( READLINE_FOUND )
|
||||
endif ( enable-readline )
|
||||
|
||||
endif(NOT enable-pkgconfig)
|
||||
|
@ -833,6 +860,11 @@ else ()
|
|||
endif ()
|
||||
|
||||
generate_pkgconfig_spec(fluidsynth.pc.in ${CMAKE_BINARY_DIR}/fluidsynth.pc libfluidsynth-OBJ)
|
||||
|
||||
list ( JOIN PC_REQUIRES_PRIV " " PC_REQUIRES_PRIV_JOINED )
|
||||
|
||||
configure_file ( fluidsynth.pc.in
|
||||
${CMAKE_BINARY_DIR}/fluidsynth.pc IMMEDIATE @ONLY )
|
||||
install ( FILES ${CMAKE_BINARY_DIR}/fluidsynth.pc
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig )
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
\author David Henningsson
|
||||
\author Tom Moebert
|
||||
\author Copyright © 2003-2021 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert
|
||||
\version Revision 2.2.2
|
||||
\date 2021-07-09
|
||||
\version Revision 2.2.3
|
||||
\date 2021-09-11
|
||||
|
||||
All the source code examples in this document are in the public domain; you can use them as you please. This document is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/3.0/ . The FluidSynth library is distributed under the GNU Lesser General Public License. A copy of the GNU Lesser General Public License is contained in the FluidSynth package; if not, visit https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ includedir=@includedir@
|
|||
Name: FluidSynth
|
||||
Description: Software SoundFont synth
|
||||
Version: @VERSION@
|
||||
Requires.private: @PC_REQUIRES_PRIV_JOINED@
|
||||
Libs: -L${libdir} -lfluidsynth
|
||||
Libs.private: @LIBS_PRIVATE_JOINED@ @LIBS_PRIVATE_WITH_PATH_JOINED@
|
||||
Cflags: -I${includedir}
|
||||
|
|
|
@ -788,9 +788,9 @@ static void fluid_wasapi_register_callback(IMMDevice *dev, void *data)
|
|||
int nsz;
|
||||
char *name;
|
||||
|
||||
nsz = WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, 0, 0, 0, 0);
|
||||
nsz = WideCharToMultiByte(CP_ACP, 0, var.pwszVal, -1, 0, 0, 0, 0);
|
||||
name = FLUID_ARRAY(char, nsz + 1);
|
||||
WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, name, nsz, 0, 0);
|
||||
WideCharToMultiByte(CP_ACP, 0, var.pwszVal, -1, name, nsz, 0, 0);
|
||||
fluid_settings_add_option(settings, "audio.wasapi.device", name);
|
||||
FLUID_FREE(name);
|
||||
}
|
||||
|
@ -827,9 +827,9 @@ static void fluid_wasapi_finddev_callback(IMMDevice *dev, void *data)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
nsz = WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, 0, 0, 0, 0);
|
||||
nsz = WideCharToMultiByte(CP_ACP, 0, var.pwszVal, -1, 0, 0, 0, 0);
|
||||
name = FLUID_ARRAY(char, nsz + 1);
|
||||
WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, name, nsz, 0, 0);
|
||||
WideCharToMultiByte(CP_ACP, 0, var.pwszVal, -1, name, nsz, 0, 0);
|
||||
|
||||
if(!FLUID_STRCASECMP(name, d->name))
|
||||
{
|
||||
|
|
|
@ -156,6 +156,45 @@ print_pretty_int(int i)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
/* Function using win32 api to convert ANSI encoding string to UTF8 encoding string */
|
||||
static char*
|
||||
win32_ansi_to_utf8(const char* ansi_null_terminated_string)
|
||||
{
|
||||
LPWSTR u16_buf = NULL;
|
||||
char *u8_buf = NULL;
|
||||
fluid_return_val_if_fail(ansi_null_terminated_string != NULL, NULL);
|
||||
do
|
||||
{
|
||||
int u16_count, u8_byte_count;
|
||||
u16_count = MultiByteToWideChar(CP_ACP, 0, ansi_null_terminated_string, -1, NULL, 0);
|
||||
if (u16_count == 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to convert ANSI string to wide char string\n");
|
||||
break;
|
||||
}
|
||||
u16_buf = malloc(u16_count * sizeof(WCHAR));
|
||||
if (u16_buf == NULL)
|
||||
{
|
||||
fprintf(stderr, "Out of memory\n");
|
||||
break;
|
||||
}
|
||||
u16_count = MultiByteToWideChar(CP_ACP, 0, ansi_null_terminated_string, -1, u16_buf, u16_count);
|
||||
u8_byte_count = WideCharToMultiByte(CP_UTF8, 0, u16_buf, u16_count, NULL, 0, NULL, NULL);
|
||||
|
||||
u8_buf = malloc(u8_byte_count);
|
||||
if (u8_buf == NULL)
|
||||
{
|
||||
fprintf(stderr, "Out of memory\n");
|
||||
break;
|
||||
}
|
||||
WideCharToMultiByte(CP_UTF8, 0, u16_buf, u16_count, u8_buf, u8_byte_count, NULL, NULL);
|
||||
} while (0);
|
||||
free(u16_buf);
|
||||
return u8_buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int count; /* Total count of options */
|
||||
|
@ -896,14 +935,25 @@ int main(int argc, char **argv)
|
|||
/* load the soundfonts (check that all non options are SoundFont or MIDI files) */
|
||||
for(i = arg1; i < argc; i++)
|
||||
{
|
||||
if(fluid_is_midifile(argv[i]))
|
||||
const char *u8_path = argv[i];
|
||||
#if defined(WIN32)
|
||||
/* try to convert ANSI encoding path to UTF8 encoding path */
|
||||
char *u8_buf = win32_ansi_to_utf8(argv[i]);
|
||||
if (u8_buf == NULL)
|
||||
{
|
||||
// error msg. already printed
|
||||
goto cleanup;
|
||||
}
|
||||
u8_path = u8_buf;
|
||||
#endif
|
||||
if(fluid_is_midifile(u8_path))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(fluid_is_soundfont(argv[i]))
|
||||
if(fluid_is_soundfont(u8_path))
|
||||
{
|
||||
if(fluid_synth_sfload(synth, argv[i], 1) == -1)
|
||||
if(fluid_synth_sfload(synth, u8_path, 1) == -1)
|
||||
{
|
||||
fprintf(stderr, "Failed to load the SoundFont %s\n", argv[i]);
|
||||
}
|
||||
|
@ -912,6 +962,9 @@ int main(int argc, char **argv)
|
|||
{
|
||||
fprintf(stderr, "Parameter '%s' not a SoundFont or MIDI file or error occurred identifying it.\n", argv[i]);
|
||||
}
|
||||
#if defined(WIN32)
|
||||
free(u8_buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Try to load the default soundfont, if no soundfont specified */
|
||||
|
|
|
@ -1604,6 +1604,10 @@ fluid_track_send_events(fluid_track_t *track,
|
|||
if(player->playback_callback)
|
||||
{
|
||||
player->playback_callback(player->playback_userdata, event);
|
||||
if(event->type == NOTE_ON && event->param2 != 0 && !player->channel_isplaying[event->channel])
|
||||
{
|
||||
player->channel_isplaying[event->channel] = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1787,6 +1791,11 @@ fluid_player_reset(fluid_player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < MAX_NUMBER_OF_CHANNELS; i++)
|
||||
{
|
||||
player->channel_isplaying[i] = FALSE;
|
||||
}
|
||||
|
||||
/* player->current_file = NULL; */
|
||||
/* player->status = FLUID_PLAYER_READY; */
|
||||
/* player->loop = 1; */
|
||||
|
@ -2080,18 +2089,30 @@ fluid_player_callback(void *data, unsigned int msec)
|
|||
int i;
|
||||
int loadnextfile;
|
||||
int status = FLUID_PLAYER_DONE;
|
||||
fluid_midi_event_t mute_event;
|
||||
fluid_player_t *player;
|
||||
fluid_synth_t *synth;
|
||||
player = (fluid_player_t *) data;
|
||||
synth = player->synth;
|
||||
|
||||
loadnextfile = player->currentfile == NULL ? 1 : 0;
|
||||
|
||||
fluid_midi_event_set_type(&mute_event, CONTROL_CHANGE);
|
||||
mute_event.param1 = ALL_SOUND_OFF;
|
||||
mute_event.param2 = 1;
|
||||
|
||||
if(fluid_player_get_status(player) != FLUID_PLAYER_PLAYING)
|
||||
{
|
||||
if(fluid_atomic_int_get(&player->stopping))
|
||||
{
|
||||
fluid_synth_all_notes_off(synth, -1);
|
||||
for(i = 0; i < synth->midi_channels; i++)
|
||||
{
|
||||
if(player->channel_isplaying[i])
|
||||
{
|
||||
fluid_midi_event_set_channel(&mute_event, i);
|
||||
player->playback_callback(player->playback_userdata, &mute_event);
|
||||
}
|
||||
}
|
||||
fluid_atomic_int_set(&player->stopping, 0);
|
||||
}
|
||||
return 1;
|
||||
|
@ -2121,7 +2142,14 @@ fluid_player_callback(void *data, unsigned int msec)
|
|||
seek_ticks = fluid_atomic_int_get(&player->seek_ticks);
|
||||
if(seek_ticks >= 0)
|
||||
{
|
||||
fluid_synth_all_sounds_off(synth, -1); /* avoid hanging notes */
|
||||
for(i = 0; i < synth->midi_channels; i++)
|
||||
{
|
||||
if(player->channel_isplaying[i])
|
||||
{
|
||||
fluid_midi_event_set_channel(&mute_event, i);
|
||||
player->playback_callback(player->playback_userdata, &mute_event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < player->ntracks; i++)
|
||||
|
|
|
@ -39,6 +39,7 @@ fluid_midi_event_t *fluid_midi_parser_parse(fluid_midi_parser_t *parser, unsigne
|
|||
|
||||
|
||||
#define MAX_NUMBER_OF_TRACKS 128
|
||||
#define MAX_NUMBER_OF_CHANNELS 16
|
||||
|
||||
enum fluid_midi_event_type
|
||||
{
|
||||
|
@ -325,6 +326,8 @@ struct _fluid_player_t
|
|||
void *playback_userdata; /* pointer to user-defined data passed to playback_callback function */
|
||||
handle_midi_tick_func_t tick_callback; /* function fired on each tick change */
|
||||
void *tick_userdata; /* pointer to user-defined data passed to tick_callback function */
|
||||
|
||||
int channel_isplaying[MAX_NUMBER_OF_CHANNELS]; /* flags indicating channels on which notes have played */
|
||||
};
|
||||
|
||||
void fluid_player_settings(fluid_settings_t *settings);
|
||||
|
|
Loading…
Reference in a new issue