diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f1975a8d8..8503fabcf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1138,7 +1138,6 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE
timidity/timidity.cpp
wildmidi/file_io.cpp
wildmidi/gus_pat.cpp
- wildmidi/lock.cpp
wildmidi/reverb.cpp
wildmidi/wildmidi_lib.cpp
wildmidi/wm_error.cpp
diff --git a/src/wildmidi/lock.cpp b/src/wildmidi/lock.cpp
deleted file mode 100644
index c5d3fc7da..000000000
--- a/src/wildmidi/lock.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- lock.c - data locking code for lib
-
- Copyright (C) Chris Ison 2001-2011
- Copyright (C) Bret Curtis 2013-2014
-
- This file is part of WildMIDI.
-
- WildMIDI is free software: you can redistribute and/or modify the player
- under the terms of the GNU General Public License and you can redistribute
- and/or modify the library under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation, either version 3 of
- the licenses, or(at your option) any later version.
-
- WildMIDI is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License and
- the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU General Public License and the
- GNU Lesser General Public License along with WildMIDI. If not, see
- .
- */
-
-//#include "config.h"
-
-#ifndef __DJGPP__
-
-#ifdef _WIN32
-#include
-#else
-#include
-#endif
-
-#include "lock.h"
-#include "common.h"
-
-/*
- _WM_Lock(wmlock)
-
- wmlock = a pointer to a value
-
- returns nothing
-
- Attempts to set a lock on the MDI tree so that
- only 1 library command may access it at any time.
- If lock fails the process retries until successful.
- */
-void _WM_Lock(int * wmlock) {
- LOCK_START:
- /* Check if lock is clear, if so set it */
- if (*wmlock == 0) {
- (*wmlock)++;
- /* Now that the lock is set, make sure we
- * don't have a race condition. If so,
- * decrement the lock by one and retry. */
- if (*wmlock == 1) {
- return; /* Lock cleanly set */
- }
- (*wmlock)--;
- }
-#ifdef _WIN32
- Sleep(10);
-#else
- usleep(500);
-#endif
- goto LOCK_START;
-}
-
-/*
- _WM_Unlock(wmlock)
-
- wmlock = a pointer to a value
-
- returns nothing
-
- Removes a lock previously placed on the MDI tree.
- */
-void _WM_Unlock(int *wmlock) {
- /* We don't want a -1 lock, so just to make sure */
- if ((*wmlock) != 0) {
- (*wmlock)--;
- }
-}
-
-#endif /* __DJGPP__ */
diff --git a/src/wildmidi/lock.h b/src/wildmidi/lock.h
deleted file mode 100644
index 6504bbecf..000000000
--- a/src/wildmidi/lock.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- lock.h - data locking code for lib
-
- Copyright (C) Chris Ison 2001-2011
- Copyright (C) Bret Curtis 2013-2014
-
- This file is part of WildMIDI.
-
- WildMIDI is free software: you can redistribute and/or modify the player
- under the terms of the GNU General Public License and you can redistribute
- and/or modify the library under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation, either version 3 of
- the licenses, or(at your option) any later version.
-
- WildMIDI is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License and
- the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU General Public License and the
- GNU Lesser General Public License along with WildMIDI. If not, see
- .
-*/
-
-#ifndef __LOCK_H
-#define __LOCK_H
-
-extern void _WM_Lock (int * wmlock);
-extern void _WM_Unlock (int *wmlock);
-
-#ifdef __DJGPP__
-#define _WM_Lock(p) do {} while (0)
-#define _WM_Unlock(p) do {} while (0)
-#endif
-
-#endif /* __LOCK_H */
diff --git a/src/wildmidi/wildmidi_lib.cpp b/src/wildmidi/wildmidi_lib.cpp
index 4372f8436..fe97ad7e8 100644
--- a/src/wildmidi/wildmidi_lib.cpp
+++ b/src/wildmidi/wildmidi_lib.cpp
@@ -46,10 +46,10 @@
#include "common.h"
#include "wm_error.h"
#include "file_io.h"
-#include "lock.h"
#include "reverb.h"
#include "gus_pat.h"
#include "wildmidi_lib.h"
+#include "critsec.h"
#define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\')
#ifdef _WIN32
@@ -88,7 +88,7 @@ static int fix_release = 0;
static int auto_amp = 0;
static int auto_amp_with_amp = 0;
-static int patch_lock;
+static FCriticalSection patch_lock;
struct _channel {
unsigned char bank;
@@ -149,7 +149,24 @@ struct _event_data {
};
struct _mdi {
- int lock;
+ _mdi()
+ {
+ samples_to_mix = 0;
+ midi_master_vol = 0;
+ memset(&info, 0, sizeof(info));
+ tmp_info = NULL;
+ memset(&channel, 0, sizeof(channel));
+ note = NULL;
+ memset(note_table, 0, sizeof(note_table));
+ patches = NULL;
+ patch_count = 0;
+ amp = 0;
+ mix_buffer = NULL;
+ mix_buffer_size = NULL;
+ reverb = NULL;
+ }
+
+ FCriticalSection lock;
unsigned long int samples_to_mix;
unsigned short midi_master_vol;
@@ -177,7 +194,7 @@ static double newt_coeffs[58][58]; /* for start/end of samples */
#define MAX_GAUSS_ORDER 34 /* 34 is as high as we can go before errors crop up */
static double *gauss_table = NULL; /* *gauss_table[1<first_sample) {
@@ -535,7 +552,7 @@ static void WM_FreePatches(void) {
patch[i] = tmp_patch;
}
}
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
}
/* wm_strdup -- adds extra space for appending up to 4 chars */
@@ -1273,27 +1290,27 @@ static struct _patch *
get_patch_data(unsigned short patchid) {
struct _patch *search_patch;
- _WM_Lock(&patch_lock);
+ patch_lock.Enter();
search_patch = patch[patchid & 0x007F];
if (search_patch == NULL) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return NULL;
}
while (search_patch) {
if (search_patch->patchid == patchid) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return search_patch;
}
search_patch = search_patch->next;
}
if ((patchid >> 8) != 0) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return (get_patch_data(patchid & 0x00FF));
}
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return NULL;
}
@@ -1312,16 +1329,16 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) {
return;
}
- _WM_Lock(&patch_lock);
+ patch_lock.Enter();
if (!tmp_patch->loaded) {
if (load_sample(tmp_patch) == -1) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return;
}
}
if (tmp_patch->first_sample == NULL) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return;
}
@@ -1330,7 +1347,7 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) {
(sizeof(struct _patch*) * mdi->patch_count));
mdi->patches[mdi->patch_count - 1] = tmp_patch;
tmp_patch->inuse_count++;
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
}
static struct _sample *
@@ -1338,17 +1355,17 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) {
struct _sample *last_sample = NULL;
struct _sample *return_sample = NULL;
- _WM_Lock(&patch_lock);
+ patch_lock.Enter();
if (sample_patch == NULL) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return NULL;
}
if (sample_patch->first_sample == NULL) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return NULL;
}
if (freq == 0) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return sample_patch->first_sample;
}
@@ -1357,7 +1374,7 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) {
while (last_sample) {
if (freq > last_sample->freq_low) {
if (freq < last_sample->freq_high) {
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return last_sample;
} else {
return_sample = last_sample;
@@ -1365,7 +1382,7 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) {
}
last_sample = last_sample->next;
}
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
return return_sample;
}
@@ -2021,8 +2038,7 @@ static struct _mdi *
Init_MDI(void) {
struct _mdi *mdi;
- mdi = (struct _mdi*)malloc(sizeof(struct _mdi));
- memset(mdi, 0, (sizeof(struct _mdi)));
+ mdi = new _mdi;
mdi->info.copyright = NULL;
mdi->info.mixer_options = WM_MixerOptions;
@@ -2044,7 +2060,7 @@ static void freeMDI(struct _mdi *mdi) {
unsigned long int i;
if (mdi->patch_count != 0) {
- _WM_Lock(&patch_lock);
+ patch_lock.Enter();
for (i = 0; i < mdi->patch_count; i++) {
mdi->patches[i]->inuse_count--;
if (mdi->patches[i]->inuse_count == 0) {
@@ -2058,7 +2074,7 @@ static void freeMDI(struct _mdi *mdi) {
mdi->patches[i]->loaded = 0;
}
}
- _WM_Unlock(&patch_lock);
+ patch_lock.Leave();
free(mdi->patches);
}
@@ -2554,7 +2570,6 @@ int *WM_Mix(midi *handle, int *buffer, unsigned long count)
}
}
-
/*
* =========================
* External Functions
@@ -2602,9 +2617,6 @@ WM_SYMBOL int WildMidi_Init(const char * config_file, unsigned short int rate,
return -1;
}
_WM_SampleRate = rate;
-
- gauss_lock = 0;
- patch_lock = 0;
WM_Initialized = 1;
return 0;
@@ -2663,7 +2675,7 @@ WM_SYMBOL int WildMidi_Close(midi * handle) {
0);
return -1;
}
- _WM_Lock(&mdi->lock);
+ mdi->lock.Enter();
if (first_handle->handle == handle) {
tmp_handle = first_handle->next;
free(first_handle);
@@ -2725,17 +2737,17 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options,
}
mdi = (struct _mdi *) handle;
- _WM_Lock(&mdi->lock);
+ mdi->lock.Enter();
if ((!(options & 0x0007)) || (options & 0xFFF8)) {
_WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)",
0);
- _WM_Unlock(&mdi->lock);
+ mdi->lock.Leave();
return -1;
}
if (setting & 0xFFF8) {
_WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG,
"(invalid setting)", 0);
- _WM_Unlock(&mdi->lock);
+ mdi->lock.Leave();
return -1;
}
@@ -2763,7 +2775,7 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options,
_WM_reset_reverb(mdi->reverb);
}
- _WM_Unlock(&mdi->lock);
+ mdi->lock.Leave();
return 0;
}
@@ -2779,12 +2791,12 @@ WildMidi_GetInfo(midi * handle) {
0);
return NULL;
}
- _WM_Lock(&mdi->lock);
+ mdi->lock.Enter();
if (mdi->tmp_info == NULL) {
mdi->tmp_info = (struct _WM_Info*)malloc(sizeof(struct _WM_Info));
if (mdi->tmp_info == NULL) {
_WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to set info", 0);
- _WM_Unlock(&mdi->lock);
+ mdi->lock.Leave();
return NULL;
}
mdi->tmp_info->copyright = NULL;
@@ -2799,7 +2811,7 @@ WildMidi_GetInfo(midi * handle) {
} else {
mdi->tmp_info->copyright = NULL;
}
- _WM_Unlock(&mdi->lock);
+ mdi->lock.Leave();
return mdi->tmp_info;
}
diff --git a/zdoom.vcproj b/zdoom.vcproj
index 2e425f5b4..a2587840f 100644
--- a/zdoom.vcproj
+++ b/zdoom.vcproj
@@ -2819,10 +2819,6 @@
RelativePath=".\src\wildmidi\gus_pat.h"
>
-
-
@@ -2847,10 +2843,6 @@
RelativePath=".\src\wildmidi\gus_pat.cpp"
>
-
-