1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <windows.h>
5 #include <mmsystem.h>
6 #include "org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem.h"
7 
8 typedef struct handle{
9 	HMIDIOUT* out;
10 }midi_handle_t;
11 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_malloc(JNIEnv * env,jobject obj)12 JNIEXPORT jlong JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_malloc(JNIEnv* env, jobject obj)
13 {
14 	jlong ptr = 0;
15 
16 	midi_handle_t *handle = (midi_handle_t *) malloc( sizeof(midi_handle_t) );
17 	handle->out = NULL;
18 
19 	memcpy(&ptr, &handle, sizeof( handle ));
20 
21 	return ptr;
22 }
23 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_free(JNIEnv * env,jobject obj,jlong ptr)24 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_free(JNIEnv* env, jobject obj, jlong ptr)
25 {
26 	midi_handle_t *handle = NULL;
27 	memcpy(&handle, &ptr, sizeof(handle));
28 	if(handle != NULL){
29 		free( handle );
30 	}
31 }
32 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_findPorts(JNIEnv * env,jobject obj,jlong ptr)33 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_findPorts(JNIEnv* env, jobject obj, jlong ptr)
34 {
35 	midi_handle_t *handle = NULL;
36 	memcpy(&handle, &ptr, sizeof(handle));
37 	if(handle != NULL){
38 		MIDIOUTCAPSW moc;
39 		UINT count, i;
40 		count = midiOutGetNumDevs();
41 		for (i = 0; i < count; i++){
42 			if (midiOutGetDevCapsW(i, &moc, sizeof(MIDIOUTCAPSW)) == MMSYSERR_NOERROR){
43 				//Add a new MidiDevice to the java class
44 				jint device  = i;
45 				jstring name =  (*env)->NewString( env, (jchar*)moc.szPname , wcslen( moc.szPname ) );
46 				jclass cl = (*env)->GetObjectClass(env, obj);
47 				jmethodID mid = (*env)->GetMethodID(env, cl, "addPort", "(Ljava/lang/String;I)V");
48 				if (mid != 0){
49 					(*env)->CallVoidMethod(env, obj, mid, name, device);
50 				}
51 			}
52 		}
53 	}
54 }
55 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_openPort(JNIEnv * env,jobject obj,jlong ptr,jint device)56 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_openPort(JNIEnv* env, jobject obj, jlong ptr, jint device)
57 {
58 	midi_handle_t *handle = NULL;
59 	memcpy(&handle, &ptr, sizeof(handle));
60 	if(handle != NULL && handle->out == NULL){
61 		handle->out = (HMIDIOUT *)malloc( sizeof(HMIDIOUT) );
62 		if ( midiOutOpen(handle->out, (UINT)device, 0, 0, CALLBACK_WINDOW) != MMSYSERR_NOERROR ){
63 			free( handle->out );
64 			handle->out = NULL;
65 		}
66 	}
67 }
68 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_closePort(JNIEnv * env,jobject obj,jlong ptr)69 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_closePort(JNIEnv* env, jobject obj, jlong ptr)
70 {
71 	midi_handle_t *handle = NULL;
72 	memcpy(&handle, &ptr, sizeof(handle));
73 	if(handle != NULL && handle->out != NULL){
74 		midiOutClose(*handle->out);
75 		free( handle->out );
76 		handle->out = NULL;
77 	}
78 }
79 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_noteOn(JNIEnv * env,jobject obj,jlong ptr,jint channel,jint note,jint velocity)80 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_noteOn(JNIEnv* env, jobject obj, jlong ptr, jint channel, jint note, jint velocity)
81 {
82 	midi_handle_t *handle = NULL;
83 	memcpy(&handle, &ptr, sizeof(handle));
84 	if(handle != NULL && handle->out != NULL){
85 		midiOutShortMsg(*handle->out, ( ( 0x90 | channel ) | ( note << 8) | ( velocity << 16) ) );
86 	}
87 }
88 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_noteOff(JNIEnv * env,jobject obj,jlong ptr,jint channel,jint note,jint velocity)89 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_noteOff(JNIEnv* env, jobject obj, jlong ptr, jint channel, jint note, jint velocity)
90 {
91 	midi_handle_t *handle = NULL;
92 	memcpy(&handle, &ptr, sizeof(handle));
93 	if(handle != NULL && handle->out != NULL){
94 		midiOutShortMsg(*handle->out, ( ( 0x80 | channel ) | ( note << 8) | ( velocity << 16) ) );
95 	}
96 }
97 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_programChange(JNIEnv * env,jobject obj,jlong ptr,jint channel,jint program)98 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_programChange(JNIEnv* env, jobject obj, jlong ptr, jint channel, jint program)
99 {
100 	midi_handle_t *handle = NULL;
101 	memcpy(&handle, &ptr, sizeof(handle));
102 	if(handle != NULL && handle->out != NULL){
103 		midiOutShortMsg(*handle->out, ( ( 0xC0 | channel ) | ( program << 8) ) );
104 	}
105 }
106 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_controlChange(JNIEnv * env,jobject obj,jlong ptr,jint channel,jint control,jint value)107 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_controlChange(JNIEnv* env, jobject obj, jlong ptr, jint channel, jint control, jint value)
108 {
109 	midi_handle_t *handle = NULL;
110 	memcpy(&handle, &ptr, sizeof(handle));
111 	if(handle != NULL && handle->out != NULL){
112 		midiOutShortMsg(*handle->out, ( ( 0xB0 | channel ) | ( control << 8) | ( value << 16) ) );
113 	}
114 }
115 
Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_pitchBend(JNIEnv * env,jobject obj,jlong ptr,jint channel,jint value)116 JNIEXPORT void JNICALL Java_org_herac_tuxguitar_player_impl_midiport_winmm_MidiSystem_pitchBend(JNIEnv* env, jobject obj, jlong ptr, jint channel, jint value)
117 {
118 	midi_handle_t *handle = NULL;
119 	memcpy(&handle, &ptr, sizeof(handle));
120 	if(handle != NULL && handle->out != NULL){
121 		midiOutShortMsg(*handle->out, ( ( 0xE0 | channel ) | ( (value * 128 * 2) << 8 ) ) );
122 	}
123 }
124