mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2024-12-11 21:31:18 +00:00
1cdeebef37
While `fopen` (used through the macro `FLUID_FOPEN`) uses UTF-8 on *nix, it's restricted to ANSI on Windows. A change to enable using paths containing non-ANSI characters was suggested before in issue #128 but was rejected due to requiring large parts of both the public API and private implementation to be modified to accommodate Windows. This PR instead changes the macro definition for `FLUID_FOPEN` from `fopen` to a new wrapper, `fluid_fopen`. This wrapper is defined in `fluidsynth_priv.h` and defined in `fluid_sys.c` (following the pattern of `fluid_alloc`). Under Windows, it converts the `const char*` UTF-8 parameters to Unicode `wchar_t*` strings using the Windows API function `MultiByteToWideChar` and opens the file using the Windows API-specific `_wfopen`. On all other platforms, it simply calls `fopen`. The public API is unchanged. This solution will require Windows users of the API to convert UTF-16 strings to UTF-8 (which then get converted back into UTF-16 anyway), but that's still an improvement over only being able to use ANSI paths. This PR also adds a new test, `test_utf8_open`, which tests `FLUID_FOPEN` directly and through `fluid_is_soundfont` and `fluid_synth_sfload` using a new soundfont file, `sf2/â– VintageDreamsWaves-v2â– .sf2`, which is just a copy of `VintageDreamsWaves-v2.sf2` with Unicode characters in the filename.
38 lines
925 B
C
38 lines
925 B
C
|
|
#include "test.h"
|
|
#include "fluidsynth.h"
|
|
#include "utils/fluid_sys.h"
|
|
|
|
|
|
// this tests utf-8 file handling by loading the test .sf2 file
|
|
// manually and through the soundfont-related APIs
|
|
int main(void)
|
|
{
|
|
int id;
|
|
fluid_settings_t *settings;
|
|
fluid_synth_t *synth;
|
|
|
|
FILE *sfont_file;
|
|
sfont_file = FLUID_FOPEN(TEST_SOUNDFONT_UTF8, "rb");
|
|
TEST_ASSERT(sfont_file != NULL);
|
|
TEST_ASSERT(FLUID_FCLOSE(sfont_file) == 0);
|
|
|
|
settings = new_fluid_settings();
|
|
synth = new_fluid_synth(settings);
|
|
|
|
TEST_ASSERT(settings != NULL);
|
|
TEST_ASSERT(synth != NULL);
|
|
|
|
// no sfont loaded
|
|
TEST_ASSERT(fluid_synth_sfcount(synth) == 0);
|
|
|
|
TEST_ASSERT(fluid_is_soundfont(TEST_SOUNDFONT_UTF8) == TRUE);
|
|
|
|
// load a sfont to synth
|
|
TEST_SUCCESS(id = fluid_synth_sfload(synth, TEST_SOUNDFONT_UTF8, 1));
|
|
|
|
delete_fluid_synth(synth);
|
|
delete_fluid_settings(settings);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|