I have identified a pattern of errors in
MixerMiddiChannel.C, but I lack the resources to test
my proposed changes. The errors prevent
programChange() from working. There may well be more errors!
____________________________________________________________________________________
Never miss a thing. Make Yahoo your home page.
http://www.yahoo.com/r/hs
File difference report generated by CSDiff by ComponentSoftware on 1/6/2008
7:31 AM
Base file: C:\Documents and Settings\wpcc37\My Documents\David Welch
114A\OldMixerMidiChannel.txt
Compared file: C:\Documents and Settings\wpcc37\My Documents\David Welch
114A\NewMixerMidiChannel.txt
40c40
< if (tick <= 0) {
---
> if (tick == 0) {
66c66
< if (tick <= 0) {
---
> if (tick == 0) {
69d68
< tick = XGetRealTimeSyncCount();
93c92
< if (tick <= 0) {
---
> if (tick == 0) {
96d94
< tick = XGetRealTimeSyncCount();
132c130
< if (tick <= 0) {
---
> if (tick == 0) {
158c156
< if (tick <= 0) {
---
> if (tick == 0) {
186c184
< if (tick <= 0) {
---
> if (tick == 0) {
227c225
< if (tick <= 0) {
---
> if (tick == 0) {
<--------------------- End of report --------------------->
/*
*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
// STANDARD includes
// JNI includes
#include <jni.h>
// ENGINE includes
#include "engine/X_API.h"
#include "engine/GenSnd.h"
#include "engine/GenPriv.h" // for PV_ResetControlers
#include "engine/X_Formats.h" // for midi structures
// UTILITY includes
#include "Utilities.h"
// MixerMidiChannel includes
#include "com_sun_media_sound_MixerMidiChannel.h"
// MIDI CHANNEL MANIPULATIONS
#include <stdio.h>
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nNoteOn(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jint noteNumber, jint velocity, jlong
tick) {
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nNoteOn.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE4("-> channelNumber: %d, noteNumber: %d, velocity: %d, tick: %lu\n",
channelNumber, noteNumber, velocity, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_NoteOn((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)noteNumber, (INT16)velocity);
}
else
{
/* schedule with the sequencer */
QGM_NoteOn((void *)e, (GM_Song *) (INT_PTR) id, (UINT32)tick,
(INT16)channelNumber, (INT16)noteNumber, (INT16)velocity);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nNoteOn completed.\n");
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nNoteOff(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jint noteNumber, jint velocity, jlong
tick) {
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nNoteOff.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE4("-> channelNumber: %d, noteNumber: %d, velocity: %d, tick: %lu\n",
channelNumber, noteNumber, velocity, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_NoteOff((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)noteNumber, (INT16)velocity);
}
else
{
/* schedule with the sequencer */
QGM_NoteOff((void *)e, (GM_Song *) (INT_PTR) id, (UINT32)tick,
(INT16)channelNumber, (INT16)noteNumber, (INT16)velocity);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nNoteOff completed.\n");
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nControlChange(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jint controller, jint value, jlong tick)
{
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nControlChange.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE4("-> channelNumber: %d, controller: %d, value: %d, tick: %lu\n",
channelNumber, controller, value, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_Controller((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)controller, (INT16)value);
}
else
{
/* schedule with the sequencer */
QGM_Controller((void *)e, (GM_Song *) (INT_PTR) id, (UINT32)tick,
(INT16)channelNumber, (INT16)controller, (INT16)value);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nControlChange
completed.\n");
}
JNIEXPORT jint JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nGetController(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jint controller) {
char c;
int rc;
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nGetController.\n");
c = (GM_GetControllerValue((GM_Song *) (INT_PTR) id, (INT16)channelNumber,
(INT16)controller));
rc = (jint)c;
return rc;
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIJ(JNIEnv* e,
jobject thisObj, jlong id, jint channelNumber, jint program, jlong tick) {
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nProgramChange.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE3("-> channelNumber: %d, program: %d, tick: %lu\n", channelNumber,
program, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_ProgramChange((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)program);
}
else
{
/* schedule with the sequencer */
QGM_ProgramChange((void *)e, (GM_Song *) (INT_PTR) id,
(UINT32)tick, (INT16)channelNumber, (INT16)program);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nProgramChange
completed.\n");
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIIJ(JNIEnv* e,
jobject thisObj, jlong id, jint channelNumber, jint bank, jint program, jlong
tick) {
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nProgramChange.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE4("-> channelNumber: %d, bank: %d, program: %d, tick: %lu\n",
channelNumber, bank, program, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_Controller((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)0, (INT16)bank);
GM_ProgramChange((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (INT16)program);
}
else
{
/* schedule with the sequencer */
QGM_Controller((void *)e, (GM_Song *) (INT_PTR) id, (UINT32)tick,
(INT16)channelNumber, (INT16)0, (INT16)bank);
QGM_ProgramChange((void *)e, (GM_Song *) (INT_PTR) id,
(UINT32)tick, (INT16)channelNumber, (INT16)program);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nProgramChange
completed..\n");
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nSetPitchBend(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jint bendHigh, jint bendLow, jlong tick)
{
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetPitchBend.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE4("-> channelNumber: %d, bendLow: %d, bendHigh: %d, tick: %lu\n",
channelNumber, bendLow, bendHigh, tick);
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_PitchBend((void *)e, (GM_Song *) (INT_PTR) id,
(INT16)channelNumber, (UBYTE)bendHigh, (UBYTE)bendLow);
}
else
{
/* schedule with the sequencer */
QGM_PitchBend((void *)e, (GM_Song *) (INT_PTR) id, (UINT32)tick,
(INT16)channelNumber, (UBYTE)bendHigh, (UBYTE)bendLow);
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetPitchBend
completed.\n");
}
JNIEXPORT jint JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nGetPitchBend(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber) {
unsigned char LSB;
unsigned char MSB;
jint rc;
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nGetPitchBend.\n");
GM_GetPitchBend((GM_Song *) (INT_PTR) id, (INT16)channelNumber, &LSB, &MSB);
rc = (jint)((MSB*128) + LSB);
return rc;
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nAllNotesOff(JNIEnv* e, jobject
thisObj, jlong engineIdentifier, jint channelNumber, jlong tick)
{
GM_Song *pSong = (GM_Song *) (INT_PTR) engineIdentifier;
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nAllNotesOff.\n");
/* adjust for real-time */
if (tick == 0) {
tick = XGetRealTimeSyncCount();
}
if (tick < 0)
{
/* talk directly to the synthesizer */
GM_Controller((void *)e, pSong, (INT16)channelNumber, 123, 0);
// issue a all notes off the queue
}
else
{
/* schedule with the sequencer */
QGM_Controller((void *)e, pSong, (UINT32)tick,
(INT16)channelNumber, 123, 0); // issue a all notes off the queue
}
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nAllNotesOff
completed.\n");
}
JNIEXPORT void JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nResetAllControllers(JNIEnv* e,
jobject thisObj, jlong engineIdentifier, jint channelNumber)
{
GM_Song *pSong = (GM_Song *) (INT_PTR) engineIdentifier;
TRACE1("Java_com_sun_media_sound_MixerMidiChannel_nResetAllControllers:
%d.\n", channelNumber);
// $$kk: 11.27.98: TRUE or FALSE? (complete or semi-complete reset?)
PV_ResetControlers(pSong, (INT16)channelNumber, TRUE);
TRACE1("Java_com_sun_media_sound_MixerMidiChannel_nResetAllControllers: %d
completed.\n", channelNumber);
}
JNIEXPORT jboolean JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nSetMute(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jboolean muteState) {
char channels[16];
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetMute.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE2("-> channelNumber: %d, muteState: %d\n", channelNumber, muteState);
if (muteState) {
GM_MuteChannel((GM_Song *) (INT_PTR) id, (INT16)channelNumber);
} else {
GM_UnmuteChannel((GM_Song *) (INT_PTR) id, (INT16)channelNumber);
}
GM_GetChannelMuteStatus((GM_Song *) (INT_PTR) id, channels);
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetMute completed.\n");
return (jboolean)channels[channelNumber];
}
JNIEXPORT jboolean JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nSetSolo(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber, jboolean soloState) {
char channels[16];
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetSolo.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE2("-> channelNumber: %d, soloState: %d\n", channelNumber, soloState);
if (soloState)
{
GM_SoloChannel((GM_Song *) (INT_PTR) id, (INT16)channelNumber);
}
else
{
GM_UnsoloChannel((GM_Song *) (INT_PTR) id, (INT16)channelNumber);
}
GM_GetChannelSoloStatus((GM_Song *) (INT_PTR) id, channels);
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nSetSolo completed.\n");
return ((jboolean)(channels[channelNumber]));
}
JNIEXPORT jboolean JNICALL
Java_com_sun_media_sound_MixerMidiChannel_nGetSolo(JNIEnv* e, jobject
thisObj, jlong id, jint channelNumber) {
char channels[16];
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nGetSolo.\n");
VTRACE1("-> id: %lu\n", id);
VTRACE1("-> channelNumber: %d\n", channelNumber);
GM_GetChannelSoloStatus((GM_Song *) (INT_PTR) id, channels);
TRACE0("Java_com_sun_media_sound_MixerMidiChannel_nGetSolo completed.\n");
return ((jboolean)(channels[channelNumber]));
}