Ported changes done in previous source to make portmidi compile (nw)

This commit is contained in:
Miodrag Milanovic 2015-01-10 17:42:41 +01:00
parent 1273e97e73
commit 2412275296
18 changed files with 248 additions and 137 deletions

View File

@ -8,7 +8,7 @@
#include "pmutil.h" #include "pmutil.h"
#include "pminternal.h" #include "pminternal.h"
#ifdef WIN32 #if defined(WIN32) || defined(_MSC_VER)
#define bzero(addr, siz) memset(addr, 0, siz) #define bzero(addr, siz) memset(addr, 0, siz)
#endif #endif

View File

@ -144,7 +144,7 @@ int pm_find_default_device(char *pattern, int is_input)
int id = pmNoDevice; int id = pmNoDevice;
int i; int i;
/* first parse pattern into name, interf parts */ /* first parse pattern into name, interf parts */
char *interf_pref = ""; /* initially assume it is not there */ char *interf_pref = (char *)""; /* initially assume it is not there */
char *name_pref = strstr(pattern, ", "); char *name_pref = strstr(pattern, ", ");
if (name_pref) { /* found separator, adjust the pointer */ if (name_pref) { /* found separator, adjust the pointer */

View File

@ -106,11 +106,11 @@ typedef unsigned int uint32_t;
#endif #endif
#endif #endif
#ifdef _WINDLL //#ifdef _WINDLL
#define PMEXPORT __declspec(dllexport) //#define PMEXPORT __declspec(dllexport)
#else //#else
#define PMEXPORT #define PMEXPORT
#endif //#endif
#ifndef FALSE #ifndef FALSE
#define FALSE 0 #define FALSE 0

View File

@ -5,8 +5,11 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <ctype.h>
#include "portmidi.h" #include "portmidi.h"
extern int pm_find_default_device(char *pattern, int is_input);
#define STRING_MAX 256 #define STRING_MAX 256
/* skip over spaces, return first non-space */ /* skip over spaces, return first non-space */
@ -36,8 +39,8 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
returns matching device id if found, otherwise id returns matching device id if found, otherwise id
*/ */
{ {
static char *pref_2 = "/.java/.userPrefs/"; static char *pref_2 = (char *)"/.java/.userPrefs/";
static char *pref_3 = "prefs.xml"; static char *pref_3 = (char *)"prefs.xml";
char *pref_1 = getenv("HOME"); char *pref_1 = getenv("HOME");
char *full_name, *path_ptr; char *full_name, *path_ptr;
FILE *inf; FILE *inf;
@ -61,6 +64,7 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
} }
strcat(full_name, pref_3); strcat(full_name, pref_3);
inf = fopen(full_name, "r"); inf = fopen(full_name, "r");
free(full_name);
if (!inf) goto nopref; // cannot open preference file if (!inf) goto nopref; // cannot open preference file
// We're not going to build or link in a full XML parser. // We're not going to build or link in a full XML parser.
// Instead, find the path string and quoute. Then, look for // Instead, find the path string and quoute. Then, look for
@ -71,16 +75,16 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
// look for quote string quote // look for quote string quote
if (!match_string(inf, path_ptr)) continue; // path not found if (!match_string(inf, path_ptr)) continue; // path not found
if (getc(inf) != '"') continue; // path not found, keep scanning if (getc(inf) != '"') continue; // path not found, keep scanning
if (!match_string(inf, "value")) goto nopref; // value not found if (!match_string(inf, (char *)"value")) goto nopref; // value not found
if (!match_string(inf, "=")) goto nopref; // = not found if (!match_string(inf, (char *)"=")) goto nopref; // = not found
if (!match_string(inf, "\"")) goto nopref; // quote not found if (!match_string(inf, (char *)"\"")) goto nopref; // quote not found
// now read the value up to the close quote // now read the value up to the close quote
for (i = 0; i < STRING_MAX; i++) { for (i = 0; i < STRING_MAX; i++) {
if ((c = getc(inf)) == '"') break; if ((c = getc(inf)) == '"') break;
pref_str[i] = c; pref_str[i] = c;
} }
if (i == STRING_MAX) continue; // value too long, ignore if (i == STRING_MAX) continue; // value too long, ignore
pref_str[i] == 0; pref_str[i] = 0;
i = pm_find_default_device(pref_str, input); i = pm_find_default_device(pref_str, input);
if (i != pmNoDevice) { if (i != pmNoDevice) {
id = i; id = i;

View File

@ -26,6 +26,8 @@
PmDeviceID pm_default_input_device_id = -1; PmDeviceID pm_default_input_device_id = -1;
PmDeviceID pm_default_output_device_id = -1; PmDeviceID pm_default_output_device_id = -1;
extern PmDeviceID find_default_device(char *path, int input, PmDeviceID id);
void pm_init() void pm_init()
{ {
/* Note: it is not an error for PMALSA to fail to initialize. /* Note: it is not an error for PMALSA to fail to initialize.
@ -43,10 +45,10 @@ void pm_init()
// now in order to (successfully) call Pm_CountDevices() // now in order to (successfully) call Pm_CountDevices()
pm_initialized = TRUE; pm_initialized = TRUE;
pm_default_input_device_id = find_default_device( pm_default_input_device_id = find_default_device(
"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE, (char *)"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
pm_default_input_device_id); pm_default_input_device_id);
pm_default_output_device_id = find_default_device( pm_default_output_device_id = find_default_device(
"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE, (char *)"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
pm_default_output_device_id); pm_default_output_device_id);
} }

View File

@ -15,6 +15,7 @@
#include "string.h" #include "string.h"
#include "porttime.h" #include "porttime.h"
#include "pmlinux.h" #include "pmlinux.h"
#include "osdcomm.h"
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
@ -32,9 +33,10 @@
#endif #endif
/* to store client/port in the device descriptor */ /* to store client/port in the device descriptor */
#define MAKE_DESCRIPTOR(client, port) ((void*)(((client) << 8) | (port)))
#define GET_DESCRIPTOR_CLIENT(info) ((((int)(info)) >> 8) & 0xff) #define MAKE_DESCRIPTOR(client, port) ((void*)(FPTR)(((client) << 8) | (port)))
#define GET_DESCRIPTOR_PORT(info) (((int)(info)) & 0xff) #define GET_DESCRIPTOR_CLIENT(info) ((((int)(FPTR)(info)) >> 8) & 0xff)
#define GET_DESCRIPTOR_PORT(info) (((int)(FPTR)(info)) & 0xff)
#define BYTE unsigned char #define BYTE unsigned char
@ -201,7 +203,7 @@ static PmError alsa_write_byte(PmInternal *midi, unsigned char byte,
/* compute relative time of event = timestamp - now + latency */ /* compute relative time of event = timestamp - now + latency */
PmTimestamp now = (midi->time_proc ? PmTimestamp now = (midi->time_proc ?
midi->time_proc(midi->time_info) : midi->time_proc(midi->time_info) :
Pt_Time(NULL)); Pt_Time());
int when = timestamp; int when = timestamp;
/* if timestamp is zero, send immediately */ /* if timestamp is zero, send immediately */
/* otherwise compute time delay and use delay if positive */ /* otherwise compute time delay and use delay if positive */
@ -242,8 +244,8 @@ static PmError alsa_out_close(PmInternal *midi)
alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor; alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
if (!desc) return pmBadPtr; if (!desc) return pmBadPtr;
if (pm_hosterror = snd_seq_disconnect_to(seq, desc->this_port, if ((pm_hosterror = snd_seq_disconnect_to(seq, desc->this_port,
desc->client, desc->port)) { desc->client, desc->port))) {
// if there's an error, try to delete the port anyway, but don't // if there's an error, try to delete the port anyway, but don't
// change the pm_hosterror value so we retain the first error // change the pm_hosterror value so we retain the first error
snd_seq_delete_port(seq, desc->this_port); snd_seq_delete_port(seq, desc->this_port);
@ -332,8 +334,8 @@ static PmError alsa_in_close(PmInternal *midi)
{ {
alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor; alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
if (!desc) return pmBadPtr; if (!desc) return pmBadPtr;
if (pm_hosterror = snd_seq_disconnect_from(seq, desc->this_port, if ((pm_hosterror = snd_seq_disconnect_from(seq, desc->this_port,
desc->client, desc->port)) { desc->client, desc->port))) {
snd_seq_delete_port(seq, desc->this_port); /* try to close port */ snd_seq_delete_port(seq, desc->this_port); /* try to close port */
} else { } else {
pm_hosterror = snd_seq_delete_port(seq, desc->this_port); pm_hosterror = snd_seq_delete_port(seq, desc->this_port);
@ -433,7 +435,7 @@ static PmError alsa_write(PmInternal *midi, PmEvent *buffer, int32_t length)
static PmError alsa_write_flush(PmInternal *midi, PmTimestamp timestamp) static PmError alsa_write_flush(PmInternal *midi, PmTimestamp timestamp)
{ {
alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor; alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int) seq); VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int)(FPTR) seq);
desc->error = snd_seq_drain_output(seq); desc->error = snd_seq_drain_output(seq);
if (desc->error < 0) return pmHostError; if (desc->error < 0) return pmHostError;
@ -744,7 +746,8 @@ PmError pm_linuxalsa_init( void )
if (caps & SND_SEQ_PORT_CAP_SUBS_WRITE) { if (caps & SND_SEQ_PORT_CAP_SUBS_WRITE) {
if (pm_default_output_device_id == -1) if (pm_default_output_device_id == -1)
pm_default_output_device_id = pm_descriptor_index; pm_default_output_device_id = pm_descriptor_index;
pm_add_device("ALSA", // FIXME: pm_strdup() result is leaked
pm_add_device((char *)"ALSA",
pm_strdup(snd_seq_port_info_get_name(pinfo)), pm_strdup(snd_seq_port_info_get_name(pinfo)),
FALSE, FALSE,
MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo), MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
@ -754,7 +757,8 @@ PmError pm_linuxalsa_init( void )
if (caps & SND_SEQ_PORT_CAP_SUBS_READ) { if (caps & SND_SEQ_PORT_CAP_SUBS_READ) {
if (pm_default_input_device_id == -1) if (pm_default_input_device_id == -1)
pm_default_input_device_id = pm_descriptor_index; pm_default_input_device_id = pm_descriptor_index;
pm_add_device("ALSA", // FIXME: pm_strdup() result is leaked
pm_add_device((char *)"ALSA",
pm_strdup(snd_seq_port_info_get_name(pinfo)), pm_strdup(snd_seq_port_info_get_name(pinfo)),
TRUE, TRUE,
MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo), MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),

View File

@ -24,7 +24,7 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
returns matching device id if found, otherwise id returns matching device id if found, otherwise id
*/ */
{ {
static char *pref_file = "com.apple.java.util.prefs.plist"; static char *pref_file = (char *)"com.apple.java.util.prefs.plist";
char *pref_str = NULL; char *pref_str = NULL;
// read device preferences // read device preferences
value_ptr prefs = bplist_read_user_pref(pref_file); value_ptr prefs = bplist_read_user_pref(pref_file);

18
3rdparty/portmidi/pm_mac/osxsupport.h vendored Normal file
View File

@ -0,0 +1,18 @@
/*
osxsupport.h - Cocoa glue to emulated deprecated old Carbon path finder functions
*/
#ifndef _OSXSUPPORT_H_
#define _OSXSUPPORT_H_
#ifdef __cplusplus
extern "C" {
#endif
char *FindPrefsDir(void);
#ifdef __cplusplus
}
#endif
#endif

32
3rdparty/portmidi/pm_mac/osxsupport.m vendored Normal file
View File

@ -0,0 +1,32 @@
/*
osxsupport.m - Cocoa glue to emulated deprecated old Carbon path finder functions
*/
#import <Cocoa/Cocoa.h>
#import <AvailabilityMacros.h>
#include "osxsupport.h"
// convert an NSString to a C string
#ifndef OSX_PPC
static char *StringToChar(NSString *str)
{
const char *charstr = [str UTF8String];
char *resstr = (char *)malloc(strlen(charstr)+1);
strcpy(resstr, charstr);
return resstr;
}
char *FindPrefsDir(void)
{
char *resstr = NULL;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES);
if ([paths count] > 0)
{
resstr = StringToChar([paths objectAtIndex:0]) ;
}
return resstr;
}
#endif

View File

@ -26,10 +26,10 @@ void pm_init()
pm_initialized = TRUE; pm_initialized = TRUE;
if (!err) { if (!err) {
pm_default_input_device_id = find_default_device( pm_default_input_device_id = find_default_device(
"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE, (char *)"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
pm_default_input_device_id); pm_default_input_device_id);
pm_default_output_device_id = find_default_device( pm_default_output_device_id = find_default_device(
"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE, (char *)"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
pm_default_output_device_id); pm_default_output_device_id);
} }
} }

View File

@ -941,7 +941,7 @@ PmError pm_macosxcm_init(void)
/* Initialize the client handle */ /* Initialize the client handle */
macHostError = MIDIClientCreate(CFSTR("PortMidi"), NULL, NULL, &client); macHostError = MIDIClientCreate(CFSTR("PortMidi"), NULL, NULL, &client);
if (macHostError != noErr) { if (macHostError != noErr) {
error_text = "MIDIClientCreate() in pm_macosxcm_init()"; error_text = (char *)"MIDIClientCreate() in pm_macosxcm_init()";
goto error_return; goto error_return;
} }
@ -949,14 +949,14 @@ PmError pm_macosxcm_init(void)
macHostError = MIDIInputPortCreate(client, CFSTR("Input port"), readProc, macHostError = MIDIInputPortCreate(client, CFSTR("Input port"), readProc,
NULL, &portIn); NULL, &portIn);
if (macHostError != noErr) { if (macHostError != noErr) {
error_text = "MIDIInputPortCreate() in pm_macosxcm_init()"; error_text = (char *)"MIDIInputPortCreate() in pm_macosxcm_init()";
goto error_return; goto error_return;
} }
/* Create the output port */ /* Create the output port */
macHostError = MIDIOutputPortCreate(client, CFSTR("Output port"), &portOut); macHostError = MIDIOutputPortCreate(client, CFSTR("Output port"), &portOut);
if (macHostError != noErr) { if (macHostError != noErr) {
error_text = "MIDIOutputPortCreate() in pm_macosxcm_init()"; error_text = (char *)"MIDIOutputPortCreate() in pm_macosxcm_init()";
goto error_return; goto error_return;
} }
@ -972,7 +972,7 @@ PmError pm_macosxcm_init(void)
pm_default_input_device_id = pm_descriptor_index; pm_default_input_device_id = pm_descriptor_index;
/* Register this device with PortMidi */ /* Register this device with PortMidi */
pm_add_device("CoreMIDI", cm_get_full_endpoint_name(endpoint), pm_add_device((char *)"CoreMIDI", cm_get_full_endpoint_name(endpoint),
TRUE, (void *) (long) endpoint, &pm_macosx_in_dictionary); TRUE, (void *) (long) endpoint, &pm_macosx_in_dictionary);
} }
@ -988,7 +988,7 @@ PmError pm_macosxcm_init(void)
pm_default_output_device_id = pm_descriptor_index; pm_default_output_device_id = pm_descriptor_index;
/* Register this device with PortMidi */ /* Register this device with PortMidi */
pm_add_device("CoreMIDI", cm_get_full_endpoint_name(endpoint), pm_add_device((char *)"CoreMIDI", cm_get_full_endpoint_name(endpoint),
FALSE, (void *) (long) endpoint, FALSE, (void *) (long) endpoint,
&pm_macosx_out_dictionary); &pm_macosx_out_dictionary);
} }

View File

@ -72,19 +72,21 @@ memory requested or calls longjmp, so callers don't have to check.
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "readbinaryplist.h" #include "readbinaryplist.h"
#include "osxsupport.h"
#include <Carbon/Carbon.h> #include <Carbon/Carbon.h>
#define NO 0 #define NO 0
#define YES 1 #define YES 1
#define BOOL int #define BOOL int
#define MAXPATHLEN 256 //#define MAXPATHLEN 256
/* there are 2 levels of error logging/printing: /* there are 2 levels of error logging/printing:
* BPLIST_LOG and BPLIST_LOG_VERBOSE * BPLIST_LOG and BPLIST_LOG_VERBOSE
@ -97,7 +99,8 @@ memory requested or calls longjmp, so callers don't have to check.
* parameters like printf but might be a no-op. * parameters like printf but might be a no-op.
*/ */
/* #define BPLIST_LOG_VERBOSE 1 */ #define BPLIST_LOG_VERBOSE 0
#define BPLIST_LOG 0
#if BPLIST_LOG_VERBOSE #if BPLIST_LOG_VERBOSE
#ifndef BPLIST_LOG #ifndef BPLIST_LOG
@ -222,7 +225,7 @@ static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset); static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset);
value_ptr value_create() value_ptr value_create(void)
{ {
value_ptr value = (value_ptr) allocate(sizeof(value_node)); value_ptr value = (value_ptr) allocate(sizeof(value_node));
return value; return value;
@ -377,7 +380,8 @@ value_ptr bplist_read_file(char *filename)
return value; return value;
} }
// use old Carbon method on PPC
#ifdef OSX_PPC
value_ptr bplist_read_pref(char *filename, OSType folder_type) value_ptr bplist_read_pref(char *filename, OSType folder_type)
{ {
FSRef prefdir; FSRef prefdir;
@ -398,7 +402,41 @@ value_ptr bplist_read_pref(char *filename, OSType folder_type)
strlcat(cstr, filename, MAXPATHLEN); strlcat(cstr, filename, MAXPATHLEN);
return bplist_read_file(cstr); return bplist_read_file(cstr);
} }
#else
value_ptr bplist_read_pref(char *filename, OSType folder_type)
{
char cstr[MAXPATHLEN];
char *foundstr;
memset(cstr, 0, MAXPATHLEN);
// for later OS X, the user preferences folder (~/Library/Preferences) is not available directly from Cocoa,
// Apple documentation suggests just using POSIX APIs like so.
if (folder_type == kPreferencesFolderType)
{
strlcpy(cstr, getenv("HOME"), MAXPATHLEN);
strlcat(cstr, "/Library/Preferences", MAXPATHLEN);
}
else // the system preferences folder (~/Library/PreferencePanes) is accessible from Cocoa however
{
foundstr = FindPrefsDir();
if (!foundstr) {
bplist_log("Error finding preferences folder\n");
return NULL;
}
strlcat(cstr, foundstr, MAXPATHLEN);
free(foundstr);
foundstr = NULL;
}
strlcat(cstr, "/", MAXPATHLEN);
strlcat(cstr, filename, MAXPATHLEN);
return bplist_read_file(cstr);
}
#endif
value_ptr bplist_read_system_pref(char *filename) { value_ptr bplist_read_system_pref(char *filename) {
return bplist_read_pref(filename, kSystemPreferencesFolderType); return bplist_read_pref(filename, kSystemPreferencesFolderType);
@ -776,7 +814,7 @@ static value_ptr extract_data(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length); assert(bplist->data_bytes != NULL && offset < bplist->length);
if ((size = bplist_get_a_size(bplist, &offset, "data")) == UINT64_MAX) if ((size = bplist_get_a_size(bplist, &offset, (char *)"data")) == UINT64_MAX)
return NULL; return NULL;
value = value_create(); value = value_create();
@ -793,7 +831,7 @@ static value_ptr extract_ascii_string(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length); assert(bplist->data_bytes != NULL && offset < bplist->length);
if ((size = bplist_get_a_size(bplist, &offset, "ascii string")) == if ((size = bplist_get_a_size(bplist, &offset, (char *)"ascii string")) ==
UINT64_MAX) UINT64_MAX)
return NULL; return NULL;
@ -812,7 +850,7 @@ static value_ptr extract_unicode_string(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length); assert(bplist->data_bytes != NULL && offset < bplist->length);
if ((size = bplist_get_a_size(bplist, &offset, "unicode string")) == if ((size = bplist_get_a_size(bplist, &offset, (char *)"unicode string")) ==
UINT64_MAX) UINT64_MAX)
return NULL; return NULL;
@ -873,7 +911,7 @@ static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length); assert(bplist->data_bytes != NULL && offset < bplist->length);
if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX) if ((count = bplist_get_a_size(bplist, &offset, (char *)"array")) == UINT64_MAX)
return NULL; return NULL;
if (count > UINT64_MAX / bplist->object_ref_size - offset) { if (count > UINT64_MAX / bplist->object_ref_size - offset) {
@ -935,7 +973,7 @@ static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length); assert(bplist->data_bytes != NULL && offset < bplist->length);
if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX) if ((count = bplist_get_a_size(bplist, &offset, (char *)"array")) == UINT64_MAX)
return NULL; return NULL;
if (count > UINT64_MAX / (bplist->object_ref_size * 2) - offset) { if (count > UINT64_MAX / (bplist->object_ref_size * 2) - offset) {

View File

@ -20,6 +20,7 @@
#ifdef DEBUG #ifdef DEBUG
#include "stdio.h" #include "stdio.h"
#endif #endif
#undef UNICODE
#include <windows.h> #include <windows.h>
/* pm_exit is called when the program exits. /* pm_exit is called when the program exits.
@ -62,7 +63,7 @@ static PmDeviceID pm_get_default_device_id(int is_input, char *key) {
HKEY hkey; HKEY hkey;
#define PATTERN_MAX 256 #define PATTERN_MAX 256
char pattern[PATTERN_MAX]; char pattern[PATTERN_MAX];
long pattern_max = PATTERN_MAX; DWORD pattern_max = PATTERN_MAX;
DWORD dwType; DWORD dwType;
/* Find first input or device -- this is the default. */ /* Find first input or device -- this is the default. */
PmDeviceID id = pmNoDevice; PmDeviceID id = pmNoDevice;
@ -75,23 +76,23 @@ static PmDeviceID pm_get_default_device_id(int is_input, char *key) {
} }
} }
/* Look in registry for a default device name pattern. */ /* Look in registry for a default device name pattern. */
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) != if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) { ERROR_SUCCESS) {
return id; return id;
} }
if (RegOpenKeyEx(hkey, "JavaSoft", 0, KEY_READ, &hkey) != if (RegOpenKeyExA(hkey, "JavaSoft", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) { ERROR_SUCCESS) {
return id; return id;
} }
if (RegOpenKeyEx(hkey, "Prefs", 0, KEY_READ, &hkey) != if (RegOpenKeyExA(hkey, "Prefs", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) { ERROR_SUCCESS) {
return id; return id;
} }
if (RegOpenKeyEx(hkey, "/Port/Midi", 0, KEY_READ, &hkey) != if (RegOpenKeyExA(hkey, "/Port/Midi", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) { ERROR_SUCCESS) {
return id; return id;
} }
if (RegQueryValueEx(hkey, key, NULL, &dwType, pattern, &pattern_max) != if (RegQueryValueExA(hkey, key, NULL, &dwType, (BYTE *)pattern, &pattern_max) !=
ERROR_SUCCESS) { ERROR_SUCCESS) {
return id; return id;
} }
@ -119,13 +120,13 @@ static PmDeviceID pm_get_default_device_id(int is_input, char *key) {
PmDeviceID Pm_GetDefaultInputDeviceID() { PmDeviceID Pm_GetDefaultInputDeviceID() {
return pm_get_default_device_id(TRUE, return pm_get_default_device_id(TRUE,
"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/I/N/P/U/T_/D/E/V/I/C/E"); (char *)"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/I/N/P/U/T_/D/E/V/I/C/E");
} }
PmDeviceID Pm_GetDefaultOutputDeviceID() { PmDeviceID Pm_GetDefaultOutputDeviceID() {
return pm_get_default_device_id(FALSE, return pm_get_default_device_id(FALSE,
"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/O/U/T/P/U/T_/D/E/V/I/C/E"); (char *)"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/O/U/T/P/U/T_/D/E/V/I/C/E");
} }

View File

@ -10,7 +10,7 @@
*/ */
#define _WIN32_WINNT 0x0500 #define _WIN32_WINNT 0x0500
#endif #endif
#undef UNICODE
#include "windows.h" #include "windows.h"
#include "mmsystem.h" #include "mmsystem.h"
#include "portmidi.h" #include "portmidi.h"
@ -19,6 +19,7 @@
#include "pmwinmm.h" #include "pmwinmm.h"
#include <string.h> #include <string.h>
#include "porttime.h" #include "porttime.h"
#include "osdcomm.h"
/* asserts used to verify portMidi code logic is sound; later may want /* asserts used to verify portMidi code logic is sound; later may want
something more graceful */ something more graceful */
@ -159,7 +160,7 @@ typedef struct midiwinmm_struct {
general MIDI device queries general MIDI device queries
============================================================================= =============================================================================
*/ */
static void pm_winmm_general_inputs() static void pm_winmm_general_inputs(void)
{ {
UINT i; UINT i;
WORD wRtn; WORD wRtn;
@ -180,14 +181,15 @@ static void pm_winmm_general_inputs()
if (wRtn == MMSYSERR_NOERROR) { if (wRtn == MMSYSERR_NOERROR) {
/* ignore errors here -- if pm_descriptor_max is exceeded, some /* ignore errors here -- if pm_descriptor_max is exceeded, some
devices will not be accessible. */ devices will not be accessible. */
pm_add_device("MMSystem", midi_in_caps[i].szPname, TRUE, pm_add_device((char *)"MMSystem", midi_in_caps[i].szPname, TRUE,
(void *) i, &pm_winmm_in_dictionary); (void *)(FPTR)i,
&pm_winmm_in_dictionary);
} }
} }
} }
static void pm_winmm_mapper_input() static void pm_winmm_mapper_input(void)
{ {
WORD wRtn; WORD wRtn;
/* Note: if MIDIMAPPER opened as input (documentation implies you /* Note: if MIDIMAPPER opened as input (documentation implies you
@ -198,13 +200,13 @@ static void pm_winmm_mapper_input()
(LPMIDIINCAPS) & midi_in_mapper_caps, (LPMIDIINCAPS) & midi_in_mapper_caps,
sizeof(MIDIINCAPS)); sizeof(MIDIINCAPS));
if (wRtn == MMSYSERR_NOERROR) { if (wRtn == MMSYSERR_NOERROR) {
pm_add_device("MMSystem", midi_in_mapper_caps.szPname, TRUE, pm_add_device((char *)"MMSystem", midi_in_mapper_caps.szPname, TRUE,
(void *) MIDIMAPPER, &pm_winmm_in_dictionary); (void *)(FPTR)MIDIMAPPER, &pm_winmm_in_dictionary);
} }
} }
static void pm_winmm_general_outputs() static void pm_winmm_general_outputs(void)
{ {
UINT i; UINT i;
DWORD wRtn; DWORD wRtn;
@ -220,14 +222,15 @@ static void pm_winmm_general_outputs()
wRtn = midiOutGetDevCaps(i, (LPMIDIOUTCAPS) & midi_out_caps[i], wRtn = midiOutGetDevCaps(i, (LPMIDIOUTCAPS) & midi_out_caps[i],
sizeof(MIDIOUTCAPS)); sizeof(MIDIOUTCAPS));
if (wRtn == MMSYSERR_NOERROR) { if (wRtn == MMSYSERR_NOERROR) {
pm_add_device("MMSystem", midi_out_caps[i].szPname, FALSE, pm_add_device((char *)"MMSystem", midi_out_caps[i].szPname, FALSE,
(void *) i, &pm_winmm_out_dictionary); (void *)(FPTR)i,
&pm_winmm_out_dictionary);
} }
} }
} }
static void pm_winmm_mapper_output() static void pm_winmm_mapper_output(void)
{ {
WORD wRtn; WORD wRtn;
/* Note: if MIDIMAPPER opened as output (pseudo MIDI device /* Note: if MIDIMAPPER opened as output (pseudo MIDI device
@ -236,8 +239,8 @@ static void pm_winmm_mapper_output()
wRtn = midiOutGetDevCaps((UINT) MIDIMAPPER, (LPMIDIOUTCAPS) wRtn = midiOutGetDevCaps((UINT) MIDIMAPPER, (LPMIDIOUTCAPS)
& midi_out_mapper_caps, sizeof(MIDIOUTCAPS)); & midi_out_mapper_caps, sizeof(MIDIOUTCAPS));
if (wRtn == MMSYSERR_NOERROR) { if (wRtn == MMSYSERR_NOERROR) {
pm_add_device("MMSystem", midi_out_mapper_caps.szPname, FALSE, pm_add_device((char *)"MMSystem", midi_out_mapper_caps.szPname, FALSE,
(void *) MIDIMAPPER, &pm_winmm_out_dictionary); (void *)(FPTR)MIDIMAPPER, &pm_winmm_out_dictionary);
} }
} }
@ -271,8 +274,8 @@ static void winmm_get_host_error(PmInternal * midi, char * msg, UINT len)
{ {
/* precondition: midi != NULL */ /* precondition: midi != NULL */
midiwinmm_node * m = (midiwinmm_node *) midi->descriptor; midiwinmm_node * m = (midiwinmm_node *) midi->descriptor;
char *hdr1 = "Host error: "; char *hdr1 = (char *)"Host error: ";
char *hdr2 = "Host callback error: "; //char *hdr2 = (char *)"Host callback error: ";
msg[0] = 0; /* initialize result string to empty */ msg[0] = 0; /* initialize result string to empty */
@ -282,8 +285,8 @@ static void winmm_get_host_error(PmInternal * midi, char * msg, UINT len)
if (m->error != MMSYSERR_NOERROR) { if (m->error != MMSYSERR_NOERROR) {
int n = str_copy_len(msg, hdr1, len); int n = str_copy_len(msg, hdr1, len);
/* read and record host error */ /* read and record host error */
int err = midiInGetErrorText(m->error, msg + n, len - n); midiInGetErrorText(m->error, msg + n, len - n);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
m->error = MMSYSERR_NOERROR; m->error = MMSYSERR_NOERROR;
} }
} }
@ -291,8 +294,8 @@ static void winmm_get_host_error(PmInternal * midi, char * msg, UINT len)
if (m) { if (m) {
if (m->error != MMSYSERR_NOERROR) { if (m->error != MMSYSERR_NOERROR) {
int n = str_copy_len(msg, hdr1, len); int n = str_copy_len(msg, hdr1, len);
int err = midiOutGetErrorText(m->error, msg + n, len - n); midiOutGetErrorText(m->error, msg + n, len - n);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
m->error = MMSYSERR_NOERROR; m->error = MMSYSERR_NOERROR;
} }
} }
@ -548,7 +551,7 @@ static PmError winmm_in_open(PmInternal *midi, void *driverInfo)
int num_input_buffers = max_sysex_len / INPUT_SYSEX_LEN; int num_input_buffers = max_sysex_len / INPUT_SYSEX_LEN;
midiwinmm_type m; midiwinmm_type m;
dwDevice = (DWORD) descriptors[i].descriptor; dwDevice = (DWORD)(FPTR)descriptors[i].descriptor;
/* create system dependent device data */ /* create system dependent device data */
m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */ m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */
@ -614,9 +617,9 @@ free_descriptor:
pm_free(m); pm_free(m);
no_memory: no_memory:
if (pm_hosterror) { if (pm_hosterror) {
int err = midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text, midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN); PM_HOST_ERROR_MSG_LEN);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
return pmHostError; return pmHostError;
} }
/* if !pm_hosterror, then the error must be pmInsufficientMemory */ /* if !pm_hosterror, then the error must be pmInsufficientMemory */
@ -642,10 +645,10 @@ static PmError winmm_in_close(PmInternal *midi)
midiwinmm_type m = (midiwinmm_type) midi->descriptor; midiwinmm_type m = (midiwinmm_type) midi->descriptor;
if (!m) return pmBadPtr; if (!m) return pmBadPtr;
/* device to close */ /* device to close */
if (pm_hosterror = midiInStop(m->handle.in)) { if ((pm_hosterror = midiInStop(m->handle.in))) {
midiInReset(m->handle.in); /* try to reset and close port */ midiInReset(m->handle.in); /* try to reset and close port */
midiInClose(m->handle.in); midiInClose(m->handle.in);
} else if (pm_hosterror = midiInReset(m->handle.in)) { } else if ((pm_hosterror = midiInReset(m->handle.in))) {
midiInClose(m->handle.in); /* best effort to close midi port */ midiInClose(m->handle.in); /* best effort to close midi port */
} else { } else {
pm_hosterror = midiInClose(m->handle.in); pm_hosterror = midiInClose(m->handle.in);
@ -654,9 +657,9 @@ static PmError winmm_in_close(PmInternal *midi)
DeleteCriticalSection(&m->lock); DeleteCriticalSection(&m->lock);
pm_free(m); /* delete */ pm_free(m); /* delete */
if (pm_hosterror) { if (pm_hosterror) {
int err = midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text, midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN); PM_HOST_ERROR_MSG_LEN);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
return pmHostError; return pmHostError;
} }
return pmNoError; return pmNoError;
@ -671,8 +674,8 @@ static void FAR PASCAL winmm_in_callback(
DWORD dwParam1, /* MIDI data */ DWORD dwParam1, /* MIDI data */
DWORD dwParam2) /* device timestamp (wrt most recent midiInStart) */ DWORD dwParam2) /* device timestamp (wrt most recent midiInStart) */
{ {
static int entry = 0; //static int entry = 0;
PmInternal *midi = (PmInternal *) dwInstance; PmInternal *midi = (PmInternal *)(FPTR) dwInstance;
midiwinmm_type m = (midiwinmm_type) midi->descriptor; midiwinmm_type m = (midiwinmm_type) midi->descriptor;
/* NOTE: we do not just EnterCriticalSection() here because an /* NOTE: we do not just EnterCriticalSection() here because an
@ -688,7 +691,7 @@ static void FAR PASCAL winmm_in_callback(
* hardware interrupt? -- but I've seen reentrant behavior * hardware interrupt? -- but I've seen reentrant behavior
* using a debugger, so it happens. * using a debugger, so it happens.
*/ */
long new_driver_time; //long new_driver_time;
EnterCriticalSection(&m->lock); EnterCriticalSection(&m->lock);
/* dwParam1 is MIDI data received, packed into DWORD w/ 1st byte of /* dwParam1 is MIDI data received, packed into DWORD w/ 1st byte of
@ -697,7 +700,7 @@ static void FAR PASCAL winmm_in_callback(
in [ms] from when midiInStart called. in [ms] from when midiInStart called.
each message is expanded to include the status byte */ each message is expanded to include the status byte */
new_driver_time = dwParam2; //new_driver_time = dwParam2;
if ((dwParam1 & 0x80) == 0) { if ((dwParam1 & 0x80) == 0) {
/* not a status byte -- ignore it. This happened running the /* not a status byte -- ignore it. This happened running the
@ -717,7 +720,7 @@ static void FAR PASCAL winmm_in_callback(
break; break;
} }
case MIM_LONGDATA: { case MIM_LONGDATA: {
MIDIHDR *lpMidiHdr = (MIDIHDR *) dwParam1; MIDIHDR *lpMidiHdr = (MIDIHDR *)(FPTR)dwParam1;
unsigned char *data = (unsigned char *) lpMidiHdr->lpData; unsigned char *data = (unsigned char *) lpMidiHdr->lpData;
unsigned int processed = 0; unsigned int processed = 0;
int remaining = lpMidiHdr->dwBytesRecorded; int remaining = lpMidiHdr->dwBytesRecorded;
@ -741,20 +744,20 @@ static void FAR PASCAL winmm_in_callback(
case, we do not want to send them back to the interface (if case, we do not want to send them back to the interface (if
we do, the interface will not close, and Windows OS may hang). */ we do, the interface will not close, and Windows OS may hang). */
if (lpMidiHdr->dwBytesRecorded > 0) { if (lpMidiHdr->dwBytesRecorded > 0) {
MMRESULT rslt; //MMRESULT rslt;
lpMidiHdr->dwBytesRecorded = 0; lpMidiHdr->dwBytesRecorded = 0;
lpMidiHdr->dwFlags = 0; lpMidiHdr->dwFlags = 0;
/* note: no error checking -- can this actually fail? */ /* note: no error checking -- can this actually fail? */
rslt = midiInPrepareHeader(hMidiIn, lpMidiHdr, sizeof(MIDIHDR)); midiInPrepareHeader(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
assert(rslt == MMSYSERR_NOERROR); //assert(rslt == MMSYSERR_NOERROR);
/* note: I don't think this can fail except possibly for /* note: I don't think this can fail except possibly for
* MMSYSERR_NOMEM, but the pain of reporting this * MMSYSERR_NOMEM, but the pain of reporting this
* unlikely but probably catastrophic error does not seem * unlikely but probably catastrophic error does not seem
* worth it. * worth it.
*/ */
rslt = midiInAddBuffer(hMidiIn, lpMidiHdr, sizeof(MIDIHDR)); midiInAddBuffer(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
assert(rslt == MMSYSERR_NOERROR); //assert(rslt == MMSYSERR_NOERROR);
LeaveCriticalSection(&m->lock); LeaveCriticalSection(&m->lock);
} else { } else {
midiInUnprepareHeader(hMidiIn,lpMidiHdr,sizeof(MIDIHDR)); midiInUnprepareHeader(hMidiIn,lpMidiHdr,sizeof(MIDIHDR));
@ -806,11 +809,11 @@ static int add_to_buffer(midiwinmm_type m, LPMIDIHDR hdr,
static PmTimestamp pm_time_get(midiwinmm_type m) static PmTimestamp pm_time_get(midiwinmm_type m)
{ {
MMTIME mmtime; MMTIME mmtime;
MMRESULT wRtn; //MMRESULT wRtn;
mmtime.wType = TIME_TICKS; mmtime.wType = TIME_TICKS;
mmtime.u.ticks = 0; mmtime.u.ticks = 0;
wRtn = midiStreamPosition(m->handle.stream, &mmtime, sizeof(mmtime)); midiStreamPosition(m->handle.stream, &mmtime, sizeof(mmtime));
assert(wRtn == MMSYSERR_NOERROR); //assert(wRtn == MMSYSERR_NOERROR);
return mmtime.u.ticks; return mmtime.u.ticks;
} }
@ -828,8 +831,7 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
int max_sysex_len = midi->buffer_len * 4; int max_sysex_len = midi->buffer_len * 4;
int output_buffer_len; int output_buffer_len;
int num_buffers; int num_buffers;
dwDevice = (DWORD) descriptors[i].descriptor; dwDevice = (DWORD)(FPTR) descriptors[i].descriptor;
/* create system dependent device data */ /* create system dependent device data */
m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */ m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */
midi->descriptor = m; midi->descriptor = m;
@ -891,8 +893,17 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
if (output_buffer_len < MIN_SIMPLE_SYSEX_LEN) if (output_buffer_len < MIN_SIMPLE_SYSEX_LEN)
output_buffer_len = MIN_SIMPLE_SYSEX_LEN; output_buffer_len = MIN_SIMPLE_SYSEX_LEN;
} else { } else {
long dur = 0; //long dur = 0;
num_buffers = max(midi->buffer_len, midi->latency / 2); //num_buffers = (int)(double)max((double)midi->buffer_len, (double)midi->latency / 2);
if (midi->buffer_len > (midi->latency / 2))
{
num_buffers = midi->buffer_len;
}
else
{
num_buffers = (midi->latency / 2);
}
if (num_buffers < MIN_STREAM_BUFFERS) if (num_buffers < MIN_STREAM_BUFFERS)
num_buffers = MIN_STREAM_BUFFERS; num_buffers = MIN_STREAM_BUFFERS;
output_buffer_len = STREAM_BUFFER_LEN; output_buffer_len = STREAM_BUFFER_LEN;
@ -930,9 +941,9 @@ free_descriptor:
winmm_out_delete(midi); /* frees buffers and m */ winmm_out_delete(midi); /* frees buffers and m */
no_memory: no_memory:
if (pm_hosterror) { if (pm_hosterror) {
int err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text, midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN); PM_HOST_ERROR_MSG_LEN);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
return pmHostError; return pmHostError;
} }
return pmInsufficientMemory; return pmInsufficientMemory;
@ -985,10 +996,10 @@ static PmError winmm_out_close(PmInternal *midi)
winmm_out_delete(midi); winmm_out_delete(midi);
} }
if (pm_hosterror) { if (pm_hosterror) {
int err = midiOutGetErrorText(pm_hosterror, midiOutGetErrorText(pm_hosterror,
(char *) pm_hosterror_text, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN); PM_HOST_ERROR_MSG_LEN);
assert(err == MMSYSERR_NOERROR); //assert(err == MMSYSERR_NOERROR);
return pmHostError; return pmHostError;
} }
return pmNoError; return pmNoError;
@ -1207,8 +1218,9 @@ static PmError winmm_write_byte(PmInternal *midi, unsigned char byte,
if (!hdr) { if (!hdr) {
m->hdr = hdr = get_free_output_buffer(midi); m->hdr = hdr = get_free_output_buffer(midi);
assert(hdr); assert(hdr);
midi->fill_base = (unsigned char *) m->hdr->lpData; midi->fill_base = (unsigned char *)(FPTR) m->hdr->lpData;
midi->fill_offset_ptr = &(hdr->dwBytesRecorded); midi->fill_offset_ptr = (uint32_t *)&(hdr->dwBytesRecorded);
/* when buffer fills, Pm_WriteSysEx will revert to calling /* when buffer fills, Pm_WriteSysEx will revert to calling
* pmwin_write_byte, which expect to have space, so leave * pmwin_write_byte, which expect to have space, so leave
* one byte free for pmwin_write_byte. Leave another byte * one byte free for pmwin_write_byte. Leave another byte
@ -1330,10 +1342,10 @@ static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg,
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg, static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{ {
PmInternal *midi = (PmInternal *) dwInstance; PmInternal *midi = (PmInternal *)(FPTR) dwInstance;
LPMIDIHDR hdr = (LPMIDIHDR)(FPTR) dwParam1;
midiwinmm_type m = (midiwinmm_type) midi->descriptor; midiwinmm_type m = (midiwinmm_type) midi->descriptor;
LPMIDIHDR hdr = (LPMIDIHDR) dwParam1; //int err;
int err;
/* Even if an error is pending, I think we should unprepare msgs and /* Even if an error is pending, I think we should unprepare msgs and
signal their arrival signal their arrival
@ -1341,13 +1353,13 @@ static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
/* printf("streamout_callback: hdr %x, wMsg %x, MOM_DONE %x\n", /* printf("streamout_callback: hdr %x, wMsg %x, MOM_DONE %x\n",
hdr, wMsg, MOM_DONE); */ hdr, wMsg, MOM_DONE); */
if (wMsg == MOM_DONE) { if (wMsg == MOM_DONE) {
MMRESULT ret = midiOutUnprepareHeader(m->handle.out, hdr, midiOutUnprepareHeader(m->handle.out, hdr,
sizeof(MIDIHDR)); sizeof(MIDIHDR));
assert(ret == MMSYSERR_NOERROR); //assert(ret == MMSYSERR_NOERROR);
} }
/* signal client in case it is blocked waiting for buffer */ /* signal client in case it is blocked waiting for buffer */
err = SetEvent(m->buffer_signal); SetEvent(m->buffer_signal);
assert(err); /* false -> error */ //assert(err); /* false -> error */
} }
@ -1418,9 +1430,7 @@ void pm_winmm_term( void )
int i; int i;
#ifdef DEBUG #ifdef DEBUG
char msg[PM_HOST_ERROR_MSG_LEN]; char msg[PM_HOST_ERROR_MSG_LEN];
#endif
int doneAny = 0; int doneAny = 0;
#ifdef DEBUG
printf("pm_winmm_term called\n"); printf("pm_winmm_term called\n");
#endif #endif
for (i = 0; i < pm_descriptor_index; i++) { for (i = 0; i < pm_descriptor_index; i++) {

View File

@ -25,12 +25,8 @@ extern "C" {
#endif #endif
#ifndef PMEXPORT #ifndef PMEXPORT
#ifdef _WINDLL
#define PMEXPORT __declspec(dllexport)
#else
#define PMEXPORT #define PMEXPORT
#endif #endif
#endif
typedef enum { typedef enum {
ptNoError = 0, /* success */ ptNoError = 0, /* success */
@ -66,17 +62,17 @@ PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData);
return value: return value:
Upon success, returns ptNoError. See PtError for other values. Upon success, returns ptNoError. See PtError for other values.
*/ */
PMEXPORT PtError Pt_Stop(); PMEXPORT PtError Pt_Stop(void);
/* /*
Pt_Started() returns true iff the timer is running. Pt_Started() returns true iff the timer is running.
*/ */
PMEXPORT int Pt_Started(); PMEXPORT int Pt_Started(void);
/* /*
Pt_Time() returns the current time in ms. Pt_Time() returns the current time in ms.
*/ */
PMEXPORT PtTimestamp Pt_Time(); PMEXPORT PtTimestamp Pt_Time(void);
/* /*
Pt_Sleep() pauses, allowing other threads to run. Pt_Sleep() pauses, allowing other threads to run.

View File

@ -14,7 +14,9 @@
#include "sys/time.h" #include "sys/time.h"
#include "pthread.h" #include "pthread.h"
#define NSEC_PER_MSEC 1000000 #if !defined NSEC_PER_MSEC
#define NSEC_PER_MSEC 1000000ull
#endif
#define THREAD_IMPORTANCE 30 #define THREAD_IMPORTANCE 30
static int time_started_flag = FALSE; static int time_started_flag = FALSE;
@ -45,7 +47,7 @@ static void *Pt_CallbackProc(void *p)
(thread_policy_t)&extendedPolicy, (thread_policy_t)&extendedPolicy,
THREAD_EXTENDED_POLICY_COUNT); THREAD_EXTENDED_POLICY_COUNT);
if (error != KERN_SUCCESS) { if (error != KERN_SUCCESS) {
mach_error("Couldn't set thread timeshare policy", error); mach_error((char *)"Couldn't set thread timeshare policy", error);
} }
precedencePolicy.importance = THREAD_IMPORTANCE; precedencePolicy.importance = THREAD_IMPORTANCE;
@ -53,7 +55,7 @@ static void *Pt_CallbackProc(void *p)
(thread_policy_t)&precedencePolicy, (thread_policy_t)&precedencePolicy,
THREAD_PRECEDENCE_POLICY_COUNT); THREAD_PRECEDENCE_POLICY_COUNT);
if (error != KERN_SUCCESS) { if (error != KERN_SUCCESS) {
mach_error("Couldn't set thread precedence policy", error); mach_error((char *)"Couldn't set thread precedence policy", error);
} }

View File

@ -23,6 +23,11 @@ OBJDIRS += \
$(LIBOBJ)/libflac \ $(LIBOBJ)/libflac \
$(LIBOBJ)/lib7z \ $(LIBOBJ)/lib7z \
$(LIBOBJ)/portmidi \ $(LIBOBJ)/portmidi \
$(LIBOBJ)/portmidi/pm_common \
$(LIBOBJ)/portmidi/pm_linux \
$(LIBOBJ)/portmidi/pm_mac \
$(LIBOBJ)/portmidi/pm_win \
$(LIBOBJ)/portmidi/porttime \
$(LIBOBJ)/lua \ $(LIBOBJ)/lua \
$(LIBOBJ)/lua/lsqlite3 \ $(LIBOBJ)/lua/lsqlite3 \
$(LIBOBJ)/mongoose \ $(LIBOBJ)/mongoose \
@ -438,43 +443,42 @@ PMOPTS =
# common objects # common objects
LIBPMOBJS = \ LIBPMOBJS = \
$(LIBOBJ)/portmidi/portmidi.o \ $(LIBOBJ)/portmidi/pm_common/portmidi.o \
$(LIBOBJ)/portmidi/porttime.o \ $(LIBOBJ)/portmidi/pm_common/pmutil.o \
$(LIBOBJ)/portmidi/pmutil.o $(LIBOBJ)/portmidi/porttime/porttime.o \
ifeq ($(TARGETOS),linux) ifeq ($(TARGETOS),linux)
PMOPTS = -DPMALSA=1 PMOPTS = -DPMALSA=1
LIBPMOBJS += \ LIBPMOBJS += \
$(LIBOBJ)/portmidi/pmlinux.o \ $(LIBOBJ)/portmidi/pm_linux/pmlinux.o \
$(LIBOBJ)/portmidi/pmlinuxalsa.o \ $(LIBOBJ)/portmidi/pm_linux/pmlinuxalsa.o \
$(LIBOBJ)/portmidi/finddefaultlinux.o \ $(LIBOBJ)/portmidi/pm_linux/finddefaultlinux.o \
$(LIBOBJ)/portmidi/ptlinux.o $(LIBOBJ)/portmidi/porttime/ptlinux.o
endif endif
ifeq ($(TARGETOS),macosx) ifeq ($(TARGETOS),macosx)
LIBPMOBJS += \ LIBPMOBJS += \
$(LIBOBJ)/portmidi/pmmac.o \ $(LIBOBJ)/portmidi/pm_mac/pmmac.o \
$(LIBOBJ)/portmidi/pmmacosxcm.o \ $(LIBOBJ)/portmidi/pm_mac/pmmacosxcm.o \
$(LIBOBJ)/portmidi/finddefault.o \ $(LIBOBJ)/portmidi/pm_mac/finddefault.o \
$(LIBOBJ)/portmidi/readbinaryplist.o \ $(LIBOBJ)/portmidi/pm_mac/readbinaryplist.o \
$(LIBOBJ)/portmidi/ptmacosx_mach.o \ $(LIBOBJ)/portmidi/pm_mac/osxsupport.o \
$(LIBOBJ)/portmidi/osxsupport.o $(LIBOBJ)/portmidi/porttime/ptmacosx_mach.o
endif endif
ifeq ($(TARGETOS),win32) ifeq ($(TARGETOS),win32)
LIBPMOBJS += \ LIBPMOBJS += \
$(LIBOBJ)/portmidi/pmwin.o \ $(LIBOBJ)/portmidi/pm_win/pmwin.o \
$(LIBOBJ)/portmidi/pmwinmm.o \ $(LIBOBJ)/portmidi/pm_win/pmwinmm.o \
$(LIBOBJ)/portmidi/ptwinmm.o $(LIBOBJ)/portmidi/porttime/ptwinmm.o
endif endif
$(OBJ)/libportmidi.a: $(LIBPMOBJS) $(OBJ)/libportmidi.a: $(LIBPMOBJS)
$(LIBOBJ)/portmidi/%.o: $(3RDPARTY)/portmidi/%.c | $(OSPREBUILD) $(LIBOBJ)/portmidi/%.o: $(3RDPARTY)/portmidi/%.c | $(OSPREBUILD)
@echo Compiling $<... @echo Compiling $<...
$(CC) $(CDEFS) $(PMOPTS) $(CCOMFLAGS) $(CONLYFLAGS) -I$(LIBSRC)/portmidi/ -c $< -o $@ $(CC) $(CDEFS) $(PMOPTS) $(CCOMFLAGS) $(CONLYFLAGS) -I$(3RDPARTY)/portmidi/pm_common -I$(3RDPARTY)/portmidi/porttime -c $< -o $@
#------------------------------------------------- #-------------------------------------------------
# LUA library objects # LUA library objects

View File

@ -6,7 +6,7 @@
*******************************************************************c********/ *******************************************************************c********/
#include "portmidi/portmidi.h" #include "portmidi/pm_common/portmidi.h"
#include "osdcore.h" #include "osdcore.h"
static const int RX_EVENT_BUF_SIZE = 512; static const int RX_EVENT_BUF_SIZE = 512;