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